Автор: SLV. Дата публикации: 03.08.2004
В этой статье я приведу тчательно откомментированный исходник программы, корректирующей контрсумму WindowsPE файла. Язык программирования, как видно - Delphi.
program CheckSum; // Естественно =)
uses Windows, SysUtils, PElib, ImageHlp, Classes; // Джентельментский набор
Как видите, написать корректор контрсуммы не сложно, прсто надо знать что писать. Главнкую роль в программе играют функции
Спасибо за интерес к статье.
Написание корректора контрсуммы... на 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 // Имя объекта
);
Спасибо за интерес к статье.
Комментарии |
отсутствуют |
Добавление комментария |