В этой статье я приведу тчательно откомментированный исходник программы, корректирующей контрсумму 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 // Имя объекта
);
Спасибо за интерес к статье.
Комментарии
отсутствуют
Добавление комментария
:: Последние обновления ::
04.09.2011 Долгожданный релиз VB Decompiler. Масса улучшений декомпиляции Native Code. Значительно расширенна и обновлена справочная система на русском и английском языках.
20.12.2010 DotFix Software поздравляет наших клиентов и посетителей сайта с наступающим Новым Годом и рождеством! Желаем приятно провести праздники и успехов в новом году!
28.11.2010 Выпущена новая версия защиты DotFix NiceProtect. Основные изменения коснулись обфускатора Delphi программ. Теперь имеется полная поддержка Tab и Page контролов на формах, что обеспечивает максимальную совместимость обфускации с Delphi XE программами.
21.10.2010 Обновлен декомпилятор Visual Basic программ до версии 8.1. Декомпиляция P-Code программ становится все более идеальной, также проделана большая работа по улучшению анализа Native Code и .NET приложений.
16.09.2009 Полностью обновлен движок сайта! Теперь все ссылки имеют читаемый понятный вид, разного рода глюки на страницах убраны. И теперь сайт полноценно работает на второй версии нашего движка.