Динамические статические структуры )))

Тема в разделе "LANGS.C", создана пользователем gloomyraven, 27 апр 2010.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Добрый всем день!
    Вот задался таким вопросом, возможен ли сабж?
    Пример:
    Было
    Код (Text):
    1. struct {
    2. int a = 1;
    3. int b = 2;
    4. char c[100];
    5. }
    при следующей компиляции стало, например:
    Код (Text):
    1. struct {
    2. int b = 5;
    3. char c[110];
    4. int a = 9;
    5. }
    конечно можно сделать так:
    Код (Text):
    1. int _key = __DATE__[4] * __DATE__[5];
    2. #define _key1 1^_key
    3. #define _key2 2^_key
    4.  
    5. struct {
    6. int a = _key1;
    7. int b = _key2;
    8. char c[_key+100];
    9. }
    Но тогда как данные поменять местами в структуре? И можно ли присваивать рандомные значения _key1 и _key2 на этапе компилляции?
     
  2. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    В общем я это тоже на с++ хотел делать и даже более, хотя бы взять авто крипт строк,с помощью макросов. И пришел к выводу что это можно сделать путем сторонего скрипта который бы изменял сорсы. Но это очень не удобно. Поэтому я перешел на масм32, там с помощью макросов можно творить чудеса. Единственно пока что код пишу медленнее, но думаю за месяц скорость увеличится.
     
  3. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Код (Text):
    1. int _key = __DATE__[4] * __DATE__[5];
    2. #define _key1 1^_key
    3. #define _key2 2^_key
    4.  
    5. struct {
    6. int a = _key1;
    7. int b = _key2;
    8. char c[_key+100];
    9. }
    Значения заносятся когда идет инициализация структуры.
    struct _SOME s = {...data...};
    struct _SOME s;
    s.a = ...;
    s.b = ...;
     
  4. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Забыл добавить, студия 2010.
    Может туда добавили вичи для реализации подобного? Типизированные энумы тут не к месту?
     
  5. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Может я тебя не понял, но это меняет значения местами, а не порядок следования имен переменных в структуре
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    gloomyraven
    Извиняюсь за ламерство, но для чего?
     
  7. make

    make New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2009
    Сообщения:
    59
    Booster
    видимо, чтобы запутывать код от AV/реверсера. реквестирую скрипт за $5 бугага
     
  8. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    make
    не угадал, бугага ))
     
  9. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Booster
    если коротко, то для создания пермутирующего протокола обмена между клиентом и сервером. Нужно, чтобы на клиент-сайде было трудно разбрать протокол, т.к. с каждой версией он будет по сути другим.
     
  10. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Используйте постобработку исполняемого файла - напишите программку-криптор, которая будет искать в скомпилированном ехе нужные структуры и шифровать их, ключ шифрования кладете тоже в определенную структуру... затем при работе программы вы берете ключ и дешифруете структуры...
     
  11. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    gorodon
    поля структуры можно "шифровать" и на этапе компилляции, смотри выше, вопрос в том, как эти поля поменять местами в памяти
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    gloomyraven
    Генерируйте исходник перед сборкой. Нужно всего один файл генерировать, в котором объявление структуры.
     
  13. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Booster
    как вариант... конечно хотелось бы средствами самого языка/среды это сделать
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    gloomyraven
    В студии есть возможность задавать какие-либо действия перед процессом сборки.
     
  15. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Booster
    Builds events - это по сути тот же внешний генератор, что вы предлагали выше
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    gloomyraven
    Это стандартный подход к веща типо авгенерации номеров билдов и прочего.
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    gloomyraven
    Да, вам нужен Pre-Build Events.
     
  18. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    можно использовать юнион структур и выбирать между ними согласно дефайну, задаваемому либо в опциях кмд строки компилера, либо в конфиг инклуде.

    можно использовать просто массив памяти и переопределять при обращениях. конкретизировать что и где опять же через макросы и дефайны.

    или вы хотели, чтоб оно само все переопределяло в рантайме? например, при запуске само случайно устанавливало порядок полей?
    тогда используйте вариант с массивом, а смещения полей случайно задавайте гденибудь в начале. доступ к полям, опять же, макросами или функциями. можно и руками кажен раз писать
     
  19. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    имеется в виду заранее создать несколько вариантов структур, а потом при каждой сборке дефайном выбирать ту или иную? не универсально

    можно поподробнее?

    этим можно дополнить протокол, чтобы при каждом запуске, например, брался определенный ключ с сервера, и с помощью него задавалась структура протокола )
     
  20. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    gloomyraven
    а?
    структура это просто массив памяти, а поля это меньшие участки в этом массиве определяемые смещением от начала и размером (ну и функционалом связанным с типом). те вы всегда можете записать чтонибудь вроде

    char m[100];
    ...
    int i = *(int*)&m[8];
    ..

    8 - тут смещение поля типа int в структуре m. размер этого поля будет sizeof int. следующее поле должно быть по смещению не меньше 8 + sizeof(int), иначе поля будут перекрываться. можно сделать и юнион. например, так

    int i = *(int*)&m[8];
    float f = *(float*)&m[8];

    пример макроса для одного из полей. скажем, типа double по имени D

    #define D(m) (*(double*)&(m)[D_OFFS])

    где D_OFFS - дефайн (2рой случай) или переменная (3тий случай) определяющие смещение поля D от начала структуры

    ессно, размер m должен быть не меньше, чем размер всех полей структуры