хотелось бы исключить некоторые строки из получающегося PE-файла... то есть в коде писать что-то типа ENCODE("Строка, которую нужно зашифровать"), этот макрос шифровал бы данную строку к какому-либо виду, чтобы в PE-файле они существовали в закрытом виде... но чет не могу понять, как это сделать (и можно ли вообще так сделать)... есть какие-нить идеи? ничего сложного не нужно, можно хоть перестановку символов по фиксированному ключу, или хоть "шифрование Цезаря"...
GoldFinch > проще писать свой препроцессор препроцессор это сильно, хотя так действительно проще. пишем тупую программу на си, которая берет входной файл вида var_a = "hello"; и генерит инкул вида #define var_a "xxxx". все это дело вызывается make, т.е. работает автоматом. а если наш "препроцесор" написан на ansi c, то и работать он буде везде. а вот как предлагали по ссылке выше таскать за собой фасм... это не вариант. кстати, если на то пошло, то можно автоматом генерировать и случайные расшифровщики для строк. а так же набор методов для работы с ними. ломать будет слегка сложнее. т.к. на си легко такое нагенерить, что потом хрен это проанализируешь. автоматическая кодогенерация это вообще весчь. можно нагенерить хоть миллион строк. и статический анализ тут будет бессилен. только дебаггер.
-- случайно отправил -- проги. т.е. писать код для корявого виндосовского консольного интерпретатора? думаю, лучше добавить в сборку отдельный проект, заставить компилятор собирать его первым и запускать получившийся экзешник в ходе дальнейшей компиляции.
Можно сделать так 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))
А почему бы раз и навсегда не решить работу со строками? Типичное решение для строк средствами языка - это разбивать их на 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): /*'very_long_string'*/ 'very', '_lon', 'g_st', 'ring' Надо разобраться с грамматикой парсера, чтобы он не убил нормальный код, например "'это 'реальная' строка", и чтобы он правильно считал эти 4 символа, т.е. понимал \x00 \0 \n и т.п. Какие еще бывают ситуации которые надо учитывать?
cppasm, нам надо решение, а не разговоры о переносимости. Стандарт С++ говорит (ISO\IEC 14882 2.13.2 p2) Что означает, что в 32 и 64 разрядных системах, где обычно все и работают, это будет по крайней мере 4 символа. Учет endianness при разбиении int'а на char тоже можно обеспечить.
что-то вроде: Код (Text): #define SECRET_VALUE 0x00AA00BB #define STR_CRYPT1(str) DWORD dw##str = str + SECRET_VALUE; #define STR_CRYPT2(str1, str2) DWORD dw##str1##str2[1]; dw##str1##str2[0] = str1 + SECRET_VALUE; dw##str1##str2[1] = str2 + SECRET_VALUE; // и так далее STR_CRYPT5('MyVe','rySe','cret', 'Stri','ng\0\0'); ?
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 - метафункция которая зашифрует строку
классно зашифровано. брэйнфак отдыхает. начинаю уважать буст. кстате, а код нельзя как нибудь также красиво зашифровать? это серьезный вопрос. иногда надо код шифровать от вумников всяких. только чтоб это нужным выглядело
еще очевидно надо учитывать комментарии, и последовательности из 1-4 символов. видимо регулярками тут не обойтись, если обрабатывать длинные многострочные комментарии