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

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

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

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

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

В этой статье я приведу тчательно откомментированный исходник программы, корректирующей контрсумму WindowsPE файла. Язык программирования, как видно - Delphi.

program CheckSum; // Естественно =)

uses Windows, SysUtils, PElib, ImageHlp, Classes; // Джентельментский набор

CODE NOW!
var hFile:THandle; // Для CreateFile
hMap:THandle; // Для CretaeFileMapping
FileSize:integer; // Для GetFileSize
correctsum:pdword; // Откоректированная сумма будет хроаниться тут
lastsum:pdword; // А та, которая есть - тут
base:Pointer; // Для API
peh:PIMAGE_NT_HEADERS; // Для OPTIONAL HEADER-а
dosh:PIMAGE_DOS_HEADER; // Для создания PIMAGE_NT_HEADERS
m:TMemoryStream; // Без этого работать не будет

begin
ifParamStr(1)=’’ then // Если прога запущена без параметров
begin
writeln(’Usage: CheckSum.exe InputFile’); // то покажем, как ей надо пользоваться
read;
end;
hFile:=CreateFile(PChar(ParamStr(1)),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); // Создаём файл с правоми на i/o
ifhFile=INVALID_HANDLE_VALUE then // Если что-то не так
begin
writeln(ParamStr(1) + ’ File access error’);
CloseHandle(hFile);
read; // то уходим
Exit;
end;
FileSize:=GetFileSize(hFile,nil); // Берём размер файла
if FileSize=INVALID_FILE_SIZE then // Если он равен 0xFFFFFFFF
begin
writeln(ParamStr(1) + ’ Invalid File Size’);
CloseHandle(hFile);
read; // то уходим
Exit;
end;
M:=TMemoryStream.Create;// Абстрактное создание потока памяти
M.LoadFromFile(ParamStr(1)); // Заполняем его
dosh:=PIMAGE_DOS_HEADER(M.Memory); // Заполняем DOS header
peh:= PIMAGE_NT_HEADERS(Longword(dosh) + Longword(dosh.e_lfanew)); // и NT header
ifdosh.e_magic<>IMAGE_DOS_SIGNATURE then // если e_magic не равно MZ
begin
writeln(’It is not valid PE file’); // то это не наш клиент
read;
Exit;
end;
hMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,0,nil); // Создаём MappedFile
if hMap = 0 then // if (hMap==NULL) {return 0;} // C++
begin
writeln(’File mapping error’);
CloseHandle(hFile);
hMap:=hMap xor hMap; // xor eax,eax =)
read;
end;
base:=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
// Переменная base получает значение функции MapViewOfFile, применённой к вышесозданному //файлу
CheckSumMappedFile(base,FileSize,lastsum,correctsum); // CheckSumMappedFile - main proc
peh.OptionalHeader.CheckSum:=Cardinal(correctsum); // Корректируемся
writeln(’CheckSum correcting success!’); // радуемся
writeln(’Header CheckSum: ’ + IntToStr(Integer(lastsum))); // и показываем
writeln(’Correct CheckSum: ’ + IntToStr(Integer(correctsum))); // что сотворили
CloseHandle(hFile); // Закрываем
CloseHandle(hMap);// хендлы
UnmapViewOfFile(base);
end.

Как видите, написать корректор контрсуммы не сложно, прсто надо знать что писать. Главнкую роль в программе играют функции



CODE NOW!
PIMAGE_NT_HEADERS CheckSumMappedFile(

IN LPVOID BaseAddress, // Значёние, возвращаемое функцией MapViewOfFile

IN DWORD FileLength, // Длина (размер) файла

OUT LPDWORD HeaderSum, // Сумма из хедера

OUT LPDWORD CheckSum // "Настоящая" сумма

);





HANDLE CreateFile(

LPCTSTR lpFileName, // Имя файла

DWORD dwDesiredAccess, // Режим читать/писать (права доступа)

DWORD dwShareMode, // share mode

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // Указатель на атрибуты безопасности

DWORD dwCreationDistribution, // Как создавать

DWORD dwFlagsAndAttributes, // Аттрибуты файла

HANDLE hTemplateFile // Хендл темплейта

);



HANDLE CreateFileMapping(

HANDLE hFile, // Хендл файла

LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // Атрибуты безопасности (опционально)

DWORD flProtect, // ЗАщита объекта

DWORD dwMaximumSizeHigh, // Максимальный размер объекта

DWORD dwMaximumSizeLow, // Минимальный размер объекта

LPCTSTR lpName // Имя объекта

);


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

Комментарии

отсутствуют

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


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

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

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

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





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