Необходимо скрыть с глаз константные юникод-строки в драйвере. Т.е. чтобы текстовых строк в явном виде не было в файле, а они расшифровывались в процессе выполнения. Конечно, это не остановит умелого взломщика, но по крайней мере несколько затруднит анализ непрофессионалам. Самое очевидное - это зашифровать строки заранее, а затем в программе их расшифровывать. Но это не очень красиво, потому что тогда это ухудшит читаемость кода. Хотелось бы использовать что то вроде макросов типа Код (Text): RtlInitUnicodeString(&suName, _CRYPTED_STRING(L"test")); Нашел вот нечто подобное здесь http://www.codeproject.com/KB/string/cxr.aspx но оно не работает с Юникод строками и с драйверами. А ведь задача довольно распространенная при защите кода. Кто сталкивался с подобной задачей? Как ее решили?
При беглом просмотре похоже, что CXR использует TCHAR и его несложно настроить под Юникод строки, подправив правило поиска Код (Text): // looking for _CXR ( "..." ) if ( (tokenizer.GetToken(i).csToken == _T("_CXR")) && !tokenizer.GetToken(i).bIsQuotedString && (tokenizer.GetToken(i + 1).csToken == _T("(L")) && !tokenizer.GetToken(i + 1).bIsQuotedString && //== _T("(")) ... (tokenizer.GetToken(i + 2).bIsQuotedString) && (tokenizer.GetToken(i + 3).csToken == _T(")")) && !tokenizer.GetToken(i + 3).bIsQuotedString ) А с чем связана проблема с драйверами? (вникать в исходники этого энкриптора желания нет, проще переписать это на другом языке) Кстати это обсуждалось уже, однако искать лень (и не помню, были ли толковые ответы). Как это делается на скриптовом языке под названием "masm макро"? (учим матчасть, С++ это компилируемый язык)
Создать отдельно asm файл в котором хранить нужные строки. У MASM макроязык вроде как помощнее чем у C, а если заюзать FASM, то можно строки хранить зашифрованными AES %) В соседней теме про макросы была ссылка.
Про fasm у меня вопросов нет. Подозреваю, что и на masm это возможно, но вдруг кто-то захочет показать фрагмент такого изврата? (замечание про матчасть было вызывано там, что в ассемблере нет макросов, в отличие от макроассемблеров
Пишет, сорсы его посмотри движка который функции по хешу находит, там есть функция сравнения строк вот там точно .if есть. Да реально его легче писать, чем посто раз cmp
я долго пытался что-то придумать шифрование на макросах, гуглил, но максимум к чему я пришел это: http://www.wasm.ru/forum/viewtopic.php?pid=385294#p385294 плюс еще можно сделать иттерационный макрос, как в буст например (где N - максимальная длина строки): Код (Text): #define CRYPT_STRING_ITERATION_0(String, Array) if(String[0] != '\0') { Array[0] = CryptChar(String[0]; CRYPT_STRING_ITERATION_1(String, Array) } else { Array[0] = '\0'; } .... #define CRYPT_STRING_ITERATION_N(String, Array) ... в любом случае подход в крипте текста препроцессором плох, из-за того, что слишком много кода генерируется на создание шифрованной строки... хотя если таких строк будет не много, то это не критично... в своих же проектах я решил делать так, ко всем шифрованных строкам добавляется префикс: Код (Text): #define CRYPT_STRING(String) "PREfix" String затем постбилдивентом выполняется моя прога, которая ищет в собранном бинарнике строки с префиксом и шифрует их...