Автор: SLV. Дата публикации: 24.09.2004
Здравствуйте, мои маленькие любители... нет :)... Скажу проще: hi2all, кто сейчас этот бред читает... Вот, как обычно сижу дома, в голове летают всякие идеи: написать то, написать сё... В общем out of time... И вдруг загорелся я написать программу (какую – секрет фирмы :)... Писать я начал на Delphi vs Tasm (build-in Delphi)... Прога имеет дело с файлами формата Windows PE... Она их развращает, да так, что после оптимизации (ака настройки разных параметров PE файла на верные), они и работать не хотят... Но зато потом... Чтож, хватит болтать, давайте за дело.. Сперва я сотворил код, который выравнивает ImageNtHeaders->OptionalHeader->CheckSum... Как это сделать я уже писал (дважды)... Но вот ещё проблема: если тварить чудеса с секциями файла нельзя обходить значение ImageNtHeaders->OptionalHeader->SizeOfImage... Да, да, да... Эту надпись Вы видели в Петулс’е, а рядом с ней... пимпа [?] :)... Мол, кликни и будет хорошо... А ведь мы же крутые кодеры/крекеры/хакеры (Ыыыыы Прим. автора :)... Мы и сами хотим делать хорошо... Будем творить... Для начала вспомним PE формат:
SizeOfImage - показывает (в байтах), какое количество памяти должно быть зарезервировано в
адресном пространстве для загрузки образа исполняемого файла. Это сумма длин всех
секций бинарного (исполняемого файла).
Определяется по формуле:
SizeOfImage = VirtualOffset последней секции + VirtualSize последней секции.
Вспомнили... В итоге что главное, а то, что SizeOfImage:=VO + VS... С теорией всё.. Переходим к практике... Писать будем на Delphi (версия зн-ия не имеет :)... Вот исходкик, ессно откомментированный:
Корректировка SizeOfImage
Здравствуйте, мои маленькие любители... нет :)... Скажу проще: hi2all, кто сейчас этот бред читает... Вот, как обычно сижу дома, в голове летают всякие идеи: написать то, написать сё... В общем out of time... И вдруг загорелся я написать программу (какую – секрет фирмы :)... Писать я начал на Delphi vs Tasm (build-in Delphi)... Прога имеет дело с файлами формата Windows PE... Она их развращает, да так, что после оптимизации (ака настройки разных параметров PE файла на верные), они и работать не хотят... Но зато потом... Чтож, хватит болтать, давайте за дело.. Сперва я сотворил код, который выравнивает ImageNtHeaders->OptionalHeader->CheckSum... Как это сделать я уже писал (дважды)... Но вот ещё проблема: если тварить чудеса с секциями файла нельзя обходить значение ImageNtHeaders->OptionalHeader->SizeOfImage... Да, да, да... Эту надпись Вы видели в Петулс’е, а рядом с ней... пимпа [?] :)... Мол, кликни и будет хорошо... А ведь мы же крутые кодеры/крекеры/хакеры (Ыыыыы Прим. автора :)... Мы и сами хотим делать хорошо... Будем творить... Для начала вспомним PE формат:
SizeOfImage - показывает (в байтах), какое количество памяти должно быть зарезервировано в
адресном пространстве для загрузки образа исполняемого файла. Это сумма длин всех
секций бинарного (исполняемого файла).
Определяется по формуле:
SizeOfImage = VirtualOffset последней секции + VirtualSize последней секции.
Вспомнили... В итоге что главное, а то, что SizeOfImage:=VO + VS... С теорией всё.. Переходим к практике... Писать будем на Delphi (версия зн-ия не имеет :)... Вот исходкик, ессно откомментированный:
... поскипано ...
uses ..., Windows, Classes, PElib, ...;
{
INTEGER CheckSOI (pchar _fn);
Параметры:
_fn – имя файла. Должно заканчиваться знаком NULL.
Возвращаемые значения:
0 – function failed...
1 – function success...
}
function CheckSOI(_fn:string):integer;
var
M : TMemoryStream;
peh : PImage_NT_Headers;
dosh : PImage_DOS_Headers;
secth : PImage_Section_Header;
i : integer; // counter ака счётчик
begin
if _fn = ‘’ then
begin
Result:=0;
MessageBoxA(0,’Please insert some file name...’,’Error :(‘,MB_ICONERROR);
Exit;
end;
M:=TMemoryStream.Create;
M.LoadFromFile(_fn);
M.Size:=SizeOf(M);
dosh:=PImage_Dos_Header(M.Memory);
if dosh.e_magic<>IMAGE_DOS_SIGNATURE then
begin
Result:=0;
M.Free;
MessageBoxA(0,’Invalid PE file...’,’Error :(‘,MB_ICONERROR);
Exit;
end;
peh:=PImage_Nt_Headers(Longword(dosh) + Longword(dosh.e_lfanew));
if peh.Signature<>IMAGE_NT_SIGNATURE then
begin
Result:=0;
M.Free;
MessageBoxA(0,’Invalid PE file...’,’Error :(‘,MB_ICONERROR);
Exit;
end;
secth:=PImage_Section_Header(peh);
inc(PIMAGE_NT_HEADERS(secth));
for i:=1 to peh.FileHeader.NumberOfSections do inc(secth); // идём к последней секции
Dec(secth);
peh.OptionalHeader.SizeOfImage:=secth.VirtualAddress + secth.PhysicalAddress; // по формуле
M.SaveToFile(_fn);
M.Free;
Result:=1;
end;
... поскипано ...
Комментарии |
Добавил: Admin Дата: 24.09.2004 Данная методика слишком примитивна, так как если VA и VirtualSize последней секции будут неверны, то код работать не будет. Вся и фишка в том чтобы рассчитать реальные и виртуальные размеры всех секций и заголовка и по ним определять SizeOfImage. А так в принципе для новичков сойдет |
Добавление комментария |