Здравствуйте, мои маленькие любители... нет :)... Скажу проще: 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 (версия зн-ия не имеет :)... Вот исходкик, ессно откомментированный:
Параметры:
_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;
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; // по формуле
Добавил: Admin Дата: 24.09.2004 Данная методика слишком примитивна, так как если VA и VirtualSize последней секции будут неверны, то код работать не будет. Вся и фишка в том чтобы рассчитать реальные и виртуальные размеры всех секций и заголовка и по ним определять SizeOfImage.
А так в принципе для новичков сойдет
Добавление комментария
:: Последние обновления ::
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 Полностью обновлен движок сайта! Теперь все ссылки имеют читаемый понятный вид, разного рода глюки на страницах убраны. И теперь сайт полноценно работает на второй версии нашего движка.