![]() |
![]() |
Навигация по сайтам:
|
| ||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Автор: Генеральный директор НИИСАУ Иван Равин Небольшое дополнение к статье "Технология шифрования исполняемого кода":Утилиту, прилагаемую к статье, можно применять для "боевого" кодирования приложений (конечно, с условием использования качественных алгоритмов шифрования). Но как оказалось, модули, зашифрованные этой утилитой, не работают под Windows NT4. Все дело в функции ModuleSize, которая применяется при поиске маркеров внутри кода. Эта функция задает максимальное значение сканируемых байт для StrPosLen. Если программа начнет сканировать за пределами модуля, то возможно получение access violation (из-за доступа в нераспределенную память). Поэтому получение ModuleSize - необходимая предосторожность, обеспечивающая "корректную" работу программы как с ключом, так и без него. Так вот, для получения размера модуля в ModuleSize использовались функции ToolHelp, которых нет в NT4, в результате возвращаемое значение функции под NT было 0 и программа не расшифровывалась. Одно из решений проблемы я привел в отзывах к статье: если нет ToolHelp, то пусть ModuleSize возвращает достаточно большую константу. А нужно ли нам использовать ToolHelp, если мы исследуем модули своего процесса? Все можно сделать куда проще и быстрее - мы ведь можем непосредственно прочитать заголовок модуля, загруженного в память процесса, а значит можем точно определить начало сканируемого кода и его размер. Вот 2 функции:
// Чтение заголовка модуля - это очень просто // hInst - указатель на загруженный модуль/файл модуля function ModuleCodeSize(hInst:DWORD):DWORD; var lfanew:LongInt; pinth:pointer; begin result:=0; lfanew:=TImageDosHeader(pointer(hInst)^)._lfanew; pinth:=pointer(dword(hInst)+lfanew); result:=TImageNtHeaders(pinth^).OptionalHeader.SizeOfCode; end; function ModuleCodeBase(hInst:DWORD):DWORD; var lfanew:LongInt; pinth:pointer; begin result:=0; lfanew:=TImageDosHeader(pointer(hInst)^)._lfanew; pinth:=pointer(dword(hInst)+lfanew); result:=TImageNtHeaders(pinth^).OptionalHeader.BaseOfCode+hInst; end;
Назначение функций очевидно. Они позволят в конечном продукте не только отказаться от использования ToolHelp, но и ускорить поиск зашифрованных участков во время выполнения. Функции добавлены в файл RntUtil.pas, в кодировщик также внесены соответствующие изменения. |
|
© 2005-2012 ЗАО «НИИСАУ» Все права защищены. E-mail: info@niisau.ru |
Адрес центрального офиса: 127521, Россия, г.Москва, ул.Октябрьская, д.80, стр.1 тел.: (495) 645-30-05 |