Шифрование на макросах?

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

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    хотелось бы исключить некоторые строки из получающегося PE-файла... то есть в коде писать что-то типа ENCODE("Строка, которую нужно зашифровать"), этот макрос шифровал бы данную строку к какому-либо виду, чтобы в PE-файле они существовали в закрытом виде... но чет не могу понять, как это сделать (и можно ли вообще так сделать)... есть какие-нить идеи? ничего сложного не нужно, можно хоть перестановку символов по фиксированному ключу, или хоть "шифрование Цезаря"...
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Rel
    написать препроцессор )
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    http://www.wasm.ru/forum/viewtopic.php?id=17151
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    обсуждали и не раз, и шаблоны, и макросы

    проще писать свой препроцессор
     
  5. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    GoldFinch
    > проще писать свой препроцессор
    препроцессор это сильно, хотя так действительно проще. пишем тупую программу на си, которая берет входной файл вида var_a = "hello"; и генерит инкул вида #define var_a "xxxx". все это дело вызывается make, т.е. работает автоматом. а если наш "препроцесор" написан на ansi c, то и работать он буде везде. а вот как предлагали по ссылке выше таскать за собой фасм... это не вариант.

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

    автоматическая кодогенерация это вообще весчь. можно нагенерить хоть миллион строк. и статический анализ тут будет бессилен. только дебаггер.
     
  6. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    а что по поводу скриптов? чтобы препроцессор не отделялся от самой
     
  7. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    -- случайно отправил --
    проги. т.е. писать код для корявого виндосовского консольного интерпретатора?
    думаю, лучше добавить в сборку отдельный проект, заставить компилятор собирать его первым и запускать получившийся экзешник в ходе дальнейшей компиляции.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    kaspersky
    да-да... наверное так и сделаю, раз препроцессор нельзя заставить этого делать за меня))))
     
  9. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    токмо не на С свой препроц ваять. на чем нибудь скриптовом. или даже на компилергенераторе.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    на си привычнее...
     
  11. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Можно сделать так
    1) Все строки которые надо шифровать объявляем в файле mystrings.h
    #define MyString1 "mystring1"
    Это избавит от проблем парсинга всего кода на наличие "xxx"... и от проблем с определением какие строки надо шифровать, а какие нет. Наверняка потом окажется что какуюнить 1 стороку ненадо шифровать.
    2) Обращаемся ко всем строкам через SUPER_DECODE_xxx(MyString1)
    это может быть либо просто функцией дешифровки, либо можно ещё "круче" сделать и генерить множество функций дешифровки. Т.е. примитивный вариант выглядит как замена SUPER_DECODE_xxx на SUPER_DECODE_1,SUPER_DECODE_2,SUPER_DECODE_3... и генерации одинаковых функций с разными названиями, c последующим подключением к проекту.
    А если ещё дальше пойти то можно морфить алгоритм шифрования строк\шифровать разным ключём\ещё чтонить для каждой строки(тогда у SUPER_DECODE_1 и SUPER_DECODE_2 будут не только названия но и тело разные)
    P.S. ну ясно что всё это делать в pre-build event))
     
  12. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    А почему бы раз и навсегда не решить работу со строками?
    Типичное решение для строк средствами языка - это разбивать их на 4 символа которые влазят в int, и передавать их в метафункцию или макрос, который делает всю нужную работу.
    Т. е. либо MY_MACRO('very', '_lon', 'g_st', 'ring')
    либо my_metafunction<boost::mpl::string<'very', '_lon', 'g_st', 'ring'> >

    Но писать 'very', '_lon', 'g_st', 'ring' несколько неудобно, по этому давайте сделаем препроцессор, который будет преобразовывать 'very_long_string' в 'very', '_lon', 'g_st', 'ring' ?
    Думаю что для такое преобразование можно делать и на месте, т.е. после каждой компиляции получать исходник со строками разбитыми на части. Все таки читать такое можно, а вот писать - сложно.
    Либо можно преобразовывать в
    Код (Text):
    1. /*'very_long_string'*/ 'very', '_lon', 'g_st', 'ring'
    Надо разобраться с грамматикой парсера, чтобы он не убил нормальный код, например "'это 'реальная' строка",
    и чтобы он правильно считал эти 4 символа, т.е. понимал \x00 \0 \n и т.п.
    Какие еще бывают ситуации которые надо учитывать?
     
  13. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это не переносимо.
    Реализация мультисимвольных символьных констант компиляторозависима.
     
  14. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    cppasm, нам надо решение, а не разговоры о переносимости.

    Стандарт С++ говорит (ISO\IEC 14882 2.13.2 p2)
    Что означает, что в 32 и 64 разрядных системах, где обычно все и работают, это будет по крайней мере 4 символа.
    Учет endianness при разбиении int'а на char тоже можно обеспечить.
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    что-то вроде:
    Код (Text):
    1. #define SECRET_VALUE 0x00AA00BB
    2. #define STR_CRYPT1(str) DWORD dw##str = str + SECRET_VALUE;
    3. #define STR_CRYPT2(str1, str2) DWORD dw##str1##str2[1]; dw##str1##str2[0] = str1 + SECRET_VALUE; dw##str1##str2[1] = str2 + SECRET_VALUE;
    4. // и так далее
    5. STR_CRYPT5('MyVe','rySe','cret', 'Stri','ng\0\0');
    ?
     
  16. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Rel
    в стандарте С99 и msvc есть поддержка эллипсиса (...) в макросах препроцессора
    #define STR_CRYPT(...)
    так что можно обойтись без номеров на конце

    -----------------------
    'ng\0\0' == 'ng'

    --------------------------------
    если цель - получить указатель на шифрованную строку (const char*) - то вместо макросов проще использовать boost::mpl::string

    const char* str = boost::mpl::c_str<str_crypt<boost::mpl::string<'MyVe','rySe','cret', 'Stri','ng'>::type>::type>::value;
    где str_crypt - метафункция которая зашифрует строку
     
  17. qqwe

    qqwe New Member

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

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    шифровать код умеет только фасм.
     
  19. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    не. я про сорец
     
  20. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    еще очевидно надо учитывать комментарии, и последовательности из 1-4 символов.

    видимо регулярками тут не обойтись, если обрабатывать длинные многострочные комментарии