НИИСАУ

1С-НИИСАУ

Навигация по сайтам:

Как побороть некомпетентность в управлении?
Как усовершенствовать систему управления предприятием?
Кому адресована наша помощь?

Бухгалтерия
Управление торговлей
Зарплата и управление персоналом
Управление предприятием

Описание версии 1Сv8
Порядок поставки и лицензирования
Методические материалы
Сервисное обслуживание
Причины перехода на 1Сv8

Немного истории
Карьера в НИИСАУ
Заявление на работу
Новости
Наши публикации
Партнеры


ТЕХНОЛОГИЯ ШИФРОВАНИЯ ИСПОЛНЯЕМОГО КОДА. ДОПОЛНЕНИЕ

Автор: Генеральный директор НИИСАУ Иван Равин
дата публикации 05-09-2003 

Небольшое дополнение к статье "Технология шифрования исполняемого кода":

Утилиту, прилагаемую к статье, можно применять для "боевого" кодирования приложений (конечно, с условием использования качественных алгоритмов шифрования). Но как оказалось, модули, зашифрованные этой утилитой, не работают под 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