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

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

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

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


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


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

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

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

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