Техническая поддержка :

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

для защиты Windows программ

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

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

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


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


CODE NOW!
ULONG MapFileAndCheckSumA( ; Функция вычисляет котнтрсумму обозначенного файла

IN LPSTR Filename, ; Имя файла
OUT LPDWORD HeaderSum, ; CheckSum из IMAGE_NT_HEADERS->OptionalHeader
OUT LPDWORD CheckSum ; Верная сумма
);




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



CODE NOW!
Значение Причина краха функции

CHECKSUM_OPEN_FAILURE Невозможно открыть файл.

CHECKSUM_MAP_FAILURE Невозможно создать mapped объект.

CHECKSUM_MAPVIEW_FAILURE Невозможно выполнить функцию MapViewOfFile.

CHECKSUM_UNICODE_FAILURE Невозможно конвертировать имя файла в строку формата Unicode,




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



CODE NOW!
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

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


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


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

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

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

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





Главная     Программы     Статьи     Разное     Форум     Контакты