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

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

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

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


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

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

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

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.

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

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 // Имя объекта );

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

Комментарии

отсутствуют

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


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

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

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

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