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

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

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

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

Корректировка 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 (версия зн-ия не имеет :)... Вот исходкик, ессно откомментированный:

CODE NOW!
... поскипано ...
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.

А так в принципе для новичков сойдет


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


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

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

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

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





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