Современные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: SLV. Дата публикации: 19.08.2004

Написание корректора контрсуммы... на Delphi 2


Эта статья является продолжением моей статьи про то, как написать корректор контрсуммы на Дельфях. В ней будет показан немного другой способ решения вышеупомянутой проблемы (возможно даже более простой). Так же мы не будем использовать дополнительных модулей (pelib), которые активно использовался нами в предыдущей программе. Да ещё наша сегодняшняя программа будет написана на сплошном API, значит её размер будет порядка 30 килобайт! Ну чтож, ближе к делу. Для начала я расскажу вам, какую API мы будем использовать, а далее будет предложен тщательно откомментированный исходник.


Вот главная функция в нашей проге:


ULONG MapFileAndCheckSumA( ; Функция вычисляет котнтрсумму обозначенного файла IN LPSTR Filename, ; Имя файла OUT LPDWORD HeaderSum, ; CheckSum из IMAGE_NT_HEADERS->OptionalHeader OUT LPDWORD CheckSum ; Верная сумма );


Если функция выполнена успешно, то возвращаемое ею значение будет равно CHECKSUM_SUCCESS. В ином случае возвращаемое значение будет равно одному из тех, которые указаны в таблице:



Значение Причина краха функции CHECKSUM_OPEN_FAILURE Невозможно открыть файл. CHECKSUM_MAP_FAILURE Невозможно создать mapped объект. CHECKSUM_MAPVIEW_FAILURE Невозможно выполнить функцию MapViewOfFile. CHECKSUM_UNICODE_FAILURE Невозможно конвертировать имя файла в строку формата Unicode,


Вроде всё понятно, теперь можно программировать…



program CheckSum2; uses Windows, ImageHlp; // Минимум модулей – минимальный размер программы function IsFileExists(_FileName:string):boolean; // Функция для проверки существования файла var hFile:THandle; begin hFile:=CreateFileA(PChar(_FileName),GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if hFile=INVALID_HANDLE_VALUE then // Создаётся существующий файл, если он валиден, то файл есть begin Result:=false; CloseHandle(hFile); Exit; end; Result:=true; CloseHandle(hFile); end; function MACF(_FileName:string):boolean; // Map and check sum mapped file :) var hs,cs:Cardinal; // Переменные для хранения сумм из хедера и из API res:DWORD; // Результат выполнения API okMsg:string; begin res:=MapFileAndCheckSumA(PChar(_FileName),hs,cs); case res of // Удобная конструкция, аналог switch в C++ CHECKSUM_SUCCESS: // Если всё OK, то begin Result:=true; okMsg:=’Checksum successfyll corrected’ + #10 + #13 + ‘Header sum: ‘ + IntToStr(hs) + ‘; Real sum: ‘ + IntToStr(cs); writeln(PChar(okMsg)); Exit; end; CHECKSUM_OPEN_FAILURE: // Далее идёт проверка всех исключительных ситуаций (одна даже лишняя, //догадайтесь какая)... begin Result:=false; writeln(‘File access error (file not found or not ready)’); Exit; end; CHECKSUM_MAP_FAILURE: begin Result:=false; writeln(‘Can not to create mapped object...’); Exit; end; CHECKSUM_MAPVIEW_FAILURE: begin Result:=false; writeln(‘Can not map view of file...’); Exit; end; CHECKSUM_UNICODE_FAILURE: begin Result:=false; writeln(‘Can not to convert file name to Unicode string’); Exit; end; end; procedure Main; // Собственно главная процедура. В C++ она называлась бы void Main(void) (для общего //развития ;) var ErrMsg:string; begin if ParamStr(0)=’’ then // Если прога запущена без параметров begin writeln(‘CheckSum v1.1 by SLV/[ROCK]... Usage: CheckSum.exe file’); Exit; end; writeln(‘CheckSum v1.1 by SLV/[ROCK]...’); // Понты =) if not IsFileExists(ParamStr(0)) then // Юзаем свежесозданную функцию... begin ErrMsg:=’File: ‘ + ParamStr(0) + ‘ is not ready or not found...’; writeln(PChar(ErrMsg)); Exit; end; MACF(ParamStr(0)); ExitProcess(0); // На всякий случай... end; begin Main; end;


Спасибо за интерес к статье...

Комментарии

Добавил: Larry Дата: 11.03.2007

Пример из данной статьи подсчитывает контрольную сумму, но не записывает её в файл.


Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий: