Пытаюсь разобраться с PE-файлами. "Наделал" тут что-то в 172 байта Код (Text): ;===================================================================== =========== ib equ 400000h ;база образа org ib + 1000h ;база кода (навроде того) use32 ;создаем бинарник в 32-разрядной системе ;===================================================================== =========== _mz: db 'MZ' ;метка exe-файла rb 10 ;выравнивание, чтоб попасть на 'pe' с 3Сh _pe: dd 'PE' ;метка pe-файла dw 014Ch ;Тип проца здесь Intel 386 dw 1 ;количество секций в файле dd 'time' ;временной штамп, умышленно искажаем dd 'psmb' ;указатель(p) на таблицу символов(smb), искажен dd 'csmb' ;количество(c) символов(smb), искажен dw start-o_header ;размер опционального заголовка dw 818Fh ;характеристики (инфа о файле) o_header: dw 010Bh ;Magic (какая-то сигнатура) db 'H' ;старшая(H) версия линкера, умышленно искажаем db 'l' ;младшая(L) версия линкера, умышленно искажаем dd 'sz_c' ;размер кода, умышленно искажаем dd 'sz_d' ;размер инициализированных данных, искажаем dd 'sz?d' ;размер неинициализированных данных, искажаем dd start-ib ;адрес(RVA) точки входа dd 'rvac' ;RVA, откуда начинается секция с кодом dd _pe-_mz ;ставим смещение на 'pe', вместо базы данных dd ib ;база образа dd 1000h ;выравнивание секций (в памяти) dd 200h ;выравнивание raw-секций (в файле на диске) dw 'Ho' ;старшая версия операционки, умышленно искажаем dw 'lo' ;младшая версия операционки, умышленно искажаем dw 'Hi' ;старшая версия образа, умышленно искажаем dw 'li' ;младшая версия образа, умышленно искажаем dw 4 ;старшая версия подсистемы dw 0 ;младшая версия подсистемы dd 'rsrv' ;зарезервировано1, умышленно искажаем dd 2000h ;размер образа, округл. до ближ. выравнивания dd end_section-_pe+4 ;размер pe-заголовка и таблицы секций dd 'chks' ;check-сумма файла dw 2 ;подсистема Windows GUI dw 0 ;набор флагов - характеристик dll dd 1000h ;размер зарезервированного стека dd 0 ;размер выделеннго стека dd 1000h ;размер зарезервированной кучи dd 0 ;размер выделенной кучи dd 0 ;флаги загрузчика dd 1 ;количество элементов в массиве DataDirecory start: ret db 'name_s',0 ;имя секции dd end_section-_mz-1 ;виртуальный размер dd 1000h ;виртуальный адрес dd end_section-_mz-1 ;размер raw-данных dd 2 ;указатель на raw-данные dd 0 ;указатель на релокейшены dd 0 ;указатель на номера строк dw 0 ;количество релокейшенов dw 0 ;количество номеров строк end_section: dd 0E0000060h ;характеристики секции , теперь сижу, чешу репу, выполнился он или нет? OllyDBG матерится на корявый формат, XP либо проигнорировал молча, либо выполнил (неясно). Вобщем, поскажИте самый маленький исполнимый pe-файл (и elf заодно)
Имеешь ввиду ту, которая в 188 байт? Где ж она меньше? Ну вот теоретически: 2 байта(cигнатура exe-файла)+120 байт(pe-заголовок)+40 байт(таблица секций)=162 байта. Как максимально близко подойти к этому пределу?
Первая половина вроде нормальная , а где-то в конце исходника намудрил . И без импорта не на всех виндах будет работать , ничё ?
Просто добавить/обозначить секцию импорта, не вкладывая туда никакой функции? Хотелось бы конечно, чтоб на всех виндах пахала, а на каких не будет? И что за штука такая, выравнивание PE-звголовка?
Э-э-э не Нужно импортировать какую-то ф-цию из kernel32.dll или любой длл-ки которая имеет импорты с kernel32.dll На всех NT до NT 5.1(XP)
> org ib + 1000h ;база кода (навроде того) забудь. она никогда не использовалась в PE > rb 10 ;выравнивание, чтоб попасть на 'pe' с 3Сh пропущена иницилизация полей e_cparhdr и e_lfanew > dw 818Fh ;характеристики (инфа о файле) а зачем было устанавливать старший бит? > Magic (какая-то сигнатура указывает, что файл 32-разрядный, 20Bh - 64-раз. > dd 'rvac' ;RVA, откуда начинается секция с кодом > dd _pe-_mz ;ставим смещение на 'pe', вместо базы данных эти поля игнорируются > зарезервировано1, умышленно искажаем это в какой такой версии спецификации? оно уже сто лет как версия win32 подсистемы > dd 1 ;количество элементов в массиве DataDirecory должно быть как минимум два. а вообще в системном загрузчике куча мест в которых он неявно знакладывается на полный размер DATA_DIRECTIRY > db 'name_s',0 ноль-то зачем? > dd end_section-_mz-1 ;размер raw-данных в общем случае должен быть выровнен на FA (хотя если физ. размер меньше или равен виртуальному, выравнивание не требуется) > 2 ;указатель на raw-данные вообще-то, лучше если он будет указывать на конец заголовка, в противном случае работать будет не везде > теперь сижу, чешу репу, выполнился он или нет? если пофиксить мелкие ошибки и добавить хотя бы один импорт (можно BOUND - так короче), заработает, а так - либо 9x, либо XP, да и то с оговорками > OllyDBG матерится на корявый формат специально для OllyDBG и других подобных отладчком. укажи базу образа, совпадающую с началом USER32 или KERNEL32, а еще лучше в самом-самом конце адресного пространства (ес-но, релокации must be), винда всех версий нормально загрузит такой файл, но вот отладчики - хрен. проверялось на 98 OSR2, w2k SP3 и некоторых других. как в XP - не знаю, проверьте кто ни будь, а? > Как максимально близко подойти к этому пределу? использовать вырванивание на адрес, кратный 16 или 32. с некоторой долей риска можно и на 2. работает на всей линейке XP. главное требование - физический размер секций должен быть равен виртуальному. так же можно использовать незадействованные поля заголовка для хранения данных... кстати, никаких секций в файле может и не быть - можно разместить код в заголовке. конечно, загрузчик не загрузит файл где кол-во секций равно нулю, но тут есть одна хитрость поскольку "хвост" заголовка при загрузке иницилизируется нулями, то мы получаем "пустую" таблицу секций. 98 это понимает правильно, w2k - нет. так что этот прием не имеет практического применения...
kaspersky вот, как при загрузке в OllyDbg, так и просто при запуске Код (Text): --------------------------- тест_PE.exe - Недопустимое перемещение системной DLL --------------------------- Системная библиотека kernel32.dll перемещена в памяти. Работа приложения будет нарушена. Перемещение произошло из-за того, что библиотека тест_PE.exe заняла область адресов, зарезервированную для системных DLL Windows. Обратитесь к поставщику за новой версией библиотеки. --------------------------- ОК --------------------------- ---- вот код Код (Text): format PE GUI 5.0 at 77E60000h entry старт include 'Win32a.inc' ;<< code старт: xor eax,eax mov edx,[имОкошко] push eax push Заголовок push Сообщение push eax call edx ret align 32 Сообщение db 'Привет, я kernel32.dll',0 Заголовок db 'PE тест',0 ;>> code ;<< IMPORTS data import library \ усер,'user32' import усер,\ имОкошко,'MessageBoxA' end data ;>> section '.релоки' fixups dаtа disсаrdаblе
ovod Вот на этом форуме я видел MessageBox c импортами в 152 байта . Одно но , он не будет работать на <NT5.1 просто потому , что в тех имортах наименование dll-ки указываеться не полностью (без расширения) . Т.е. в нём ещё думаю можно найти 4 байта , чтобы дописать ".dll" , тогда должен работать .
> тест_PE.exe - Недопустимое перемещение системной DLL это - без перемещаемых элементов, а имел ввиду с ними
bogrus, хм.. если таблицу секций "вложить" в pe-заголовок, то теоретический предел 142 байта (хотя, по всей видимости, практический - 144). Вопросы такие: какая структура у баундов (почему они меньше импортов, как их оформлять)? kaspersky, хитрость с pe-хвостом в 98 имеет весьма живой академический интерес: чтож, можно до конца вообще не дописывать pe-заголовок, система дополнит его автоматом нулями?
kaspersky велл. Что такое перемещаемые элементы? если это Relocation table, то Код (Text): section '.релоки' fixups dаtа disсаrdаblе ни о чём не напоминает?
> section '.релоки' fixups dаtа disсаrdаblе > ни о чём не напоминает? ни о чем ты мне в самом файле релоки покажи. некоторые линкеры их упорно не вставляют если база находится слишком высоко... или вставляют но не правильно. короче говоря, вот файл, который должен работать. попробуй запустить... может, конечно, дело и в винде, но крайне маловероятно... > хитрость с pe-хвостом в 98 имеет весьма живой академический интерес: > чтож, можно до конца вообще не дописывать pe-заголовок, система дополнит его автоматом нулями? ты наверное знаешь, что оперативная память в современных осях используется как кэш и одни и те же страницы в разные моменты времени могут выделяться различным процессам? в одной из версий линуха был такой баг - там забыли подчищать страницы и потому просто выделяя страницы malloc'ом мы могли получить доступ к данным чужого процессса. но винда не пальцем делана и таких ляпов там нет. страницы перед их выделением всегда иниц. нулями. почему именно нулями? и гарантируется ли это нам? ну... непосредственно не гарантируется, но учитывая что: а) если физический размер страницы меньше виртуального хвост _гарантированно_ равен нулю; б) неиц. секция _гарантированно_ равна нулю - какой черт MS сначала затирать страницы одним значением, а затем иниц. некоторые из них нулями? так что нули прописываются всегда. и мы можем на это положиться. другое дело, что NT-загрузчик дополнительно проверяет еще и некоторые поля, в частности, файл без секций он вообще не грузит. хотя, возможно, это как-то можно и обойти... если верить в опциональность опционального заголовка - должен же быть способ создавать файлы без него? так что тут можно поэкспериментировать... _583851587__xxx.zip
> у меня если align меньше 4096 оно не запускается если у тебя NT, то минимальное выравнивание == 2. ms link умеет создавать такие файлы. задай ему ключ драйвера. он ругнется, что это никакой не драйвер в натуре, но файл таки создаст.
Оно то все создается но если align<4096 при запуске вылетает окно "Error Starting Program - file is improperly linked with aligment less than 0x1000. Fix the error, and then link again" Возможно если вручную набирать машинный код, то оно и работает. Эта экономия имхо важна только для разработчиков вирусов.
О пипл , я вас прошу , не обзывайте так аттачи . У некоторых в squid-е фильтры стоят на порно Ж) Имхо , я считаю каждый должен попробывать сделать минипе Просто , чтобы разобраться и уверен можно сделать полезные для себя выводы .
На assembler.ru была статья "Минимальная stub-программа" и приводилась такая вот прога в 64 байта (она работает как в 98, так и в DOS),автор некто Grief Код (Text): 00000000: 4D 5A 00 00 01 00 00 00 │ 01 00 00 00 50 45 00 00 MZ ☺ ☺ PE 00000010: 4C 01 07 00 08 00 00 00 │ B0 21 CD 29 B4 4C CD 21 L☺• ◘ °!Н)_LН! 00000020: E0 00 0E 01 0B 01 04 14 │ 20 00 00 00 00 2E 00 00 а ♫☺♂☺♦¶ . 00000030: 18 00 00 00 00 E0 00 00 │ 00 10 00 00 0C 00 00 00 ↑ а ► ♀