Чтобы не вставлять зашифрованные строки в код вручную, вы можете создать макрос, который будет помечать строки, требующие обфускации, и функцию, которая их расшифровывает:
#define OB(s) dec("START_MARK_GUID" s "\0" "END_MARK_GUID")
const char* dec(const char* s) { ... }
...
const char* s = OB("not easily readable"); // on all strings needed
const char* s = OB("either");
Функция должна делать две вещи:
Если параметр начинается с START_MARK_GUID, просто верните исходную строку (без направляющих). Это позволит вам также использовать необсуждаемый исполняемый файл, например, при отладке.
Если он начинается с ENCRYPTED_MARK_GUID, сначала выполните деобфускацию, а затем верните новую строку. В Си вам придется заботиться о времени жизни памяти здесь; в C ++ вы можете просто вернуть std :: string ().
Наконец, создайте программу-обфускатор, которая ищет GUID в скомпилированном двоичном файле и шифрует данные между ними. Это всего лишь несколько строк в Python или подобном языке. Я также рекомендую после этого исправить CRC в EXE, хотя моя программа работала и без этого.
Вы можете изменить направляющие с меньшим количеством уникальных идентификаторов, чтобы сэкономить место. Также вы можете улучшить это, чтобы дешифрование происходило только один раз (например, записать идентификатор строки вместе с ENCRYPTED_MARK_GUID и сохранить расшифрованные строки в словаре по этому идентификатору).