Есть файл с 1 секцией VirtSize: 70h VirtAddr: 1000h raw data size: 200h raw data offs: 200h при этом у него Section Alignment 1000h File Alignment 200h меняю File Alignment на 4 - незапускается меняю и File Alignment и Section Alignment на 4 - незапускается меняю Section Alignment на 0x200 - незапускается как так?
GoldFinch естественно http://www.insidepro.com/kk/085/085r.shtml Физическое смещение секции в файле должно быть кратно степени выравнивания, прописанной в заголовке файла в поле File Alignment. Линкер от Microsoft по умолчанию использует выравнивание в 1000h, а наименьшая кратность выравнивания равна 200h (и хотя Windows NT поддерживает гораздо меньшие значения в 20h и даже 10h, такой файл не сможет работать в Windows 9x, поэтому такое выравнивание в живой природе практически не встречается). но даже если ты сделаешь всё по правилам, то файл не бедет загружаться, т.к. секции у тебя выравнены на старые значения, а мапится будут по новым - в итоге неверные смещения. Это же элементарно.
GoldFinch Если File Alignment меньше 200h, то должен быть равен Section Alignment SizeOfImage становится неравным VirtualSize + VirtualAddress. Имеется в виду VirtualSize выравненный на SectionAlignment (который Вами изменён). Аналогично предыдущему. P.S. Мда... опоздал... сильно. P.P.S. А ещё VirtualSize < SizeOfRawData - далеко не самое кошерное сочетание.
GoldFinch Вообще P.P.S. из четвёртого поста ещё в силе. К тому же, если SectionAlignment < 1000h, то VirtualAddress каждой секции должен быть равен PointerToRawData. Почитайте вот эту тему.
PE_Kill Небольшая поправка - на NT выравнивания в 20h и 10h встречаются в основном в драйверах и при таких значениях загрузчки проецирует содержимое файла в память 1:1 (т.е. физический образ всегда равен виртуальному).
Скомпилено фасмом. При выравнивании размера файла по размеру кластера 0x200 (512), фактического увеличения зангимаемого файлом места на диске не происходит, так что все нормально.
GoldFinch Я компилю ml а линкую polink с File Alignment = 4 и Section Alignment = 4 более подробно здесь и здесь
А я задаю заголовок прямо в фасме, ага: ?? equ 0xAAAA dw "MZ",0, "PE",0, 14ch,1, ??,??, ??,??, ??,??, 0xE0,103h, 10bh,??, ??,??, ??,??, ??,??, EntryPoint,0, ??,??, ??,??, 0,40h ... Если что, тема не о том, как скомпилить маленький файл, а о том как переделать имеющийся.
ппц... мой моск окончательно съеден PE-header'ом... вот фасмовский сырец файла: Code (Text): FILE_ALIGN = 0x200 VIRTUAL_ALIGN = 0x1000 IMAGE_SIZE = 0x4000 HEAREDS_SIZE = 0x200 SECTIONS = 3 SEC_1_VIRT_SIZE = 0x100 SEC_1_RVA = 0x1000 SEC_1_RAW_SIZE = 0x200 SEC_1_RAW_OFS = 0x200 SEC_2_VIRT_SIZE = 0x100 SEC_2_RVA = 0x2000 SEC_2_RAW_SIZE = 0x200 SEC_2_RAW_OFS = 0x400 SEC_3_VIRT_SIZE = 0x1000 SEC_3_RVA = 0x3000 SEC_3_RAW_SIZE = 0x200 SEC_3_RAW_OFS = 0x0 ENTRYPOINT equ 4;0x3004 ;<<<<<<<<<<<<<<<<<< ;========== header begin =============== dd "MZ" ;-------- inserted code ---------------- use32 ;int3 push 0x400000+EntryPoint ret ;--------------------------------------- db 0x3c-$ dup 0 dd 0x40,"PE" dw 14ch,SECTIONS,0,0,0,0,0,0,0xE0,103h,10bh,0,0,0,0,0,0,0 dd ENTRYPOINT,0,0,400000h,VIRTUAL_ALIGN,FILE_ALIGN dd 0,0,4,0 dd IMAGE_SIZE,HEAREDS_SIZE dw 0,0,2,0,0,0,0,0,0,0,0,0,0,0,2,0 data_dir: dd 0,0, idata,20, 2*14 dup 0 section_table: dq "section1" dd SEC_1_VIRT_SIZE,SEC_1_RVA,SEC_1_RAW_SIZE,SEC_1_RAW_OFS dd 0,0,0,0xE0000040 dq "section2" dd SEC_2_VIRT_SIZE,SEC_2_RVA,SEC_2_RAW_SIZE,SEC_2_RAW_OFS dd 0,0,0,0xE0000040 dq "section0" dd SEC_3_VIRT_SIZE,SEC_3_RVA,SEC_3_RAW_SIZE,SEC_3_RAW_OFS dd 0,0,0,0xE00000E0 ;============= end of header ========================= db 0x200-$ dup 0 ; FILE ALIGN org 0x1000 ;============= section 1 begin ======================= EntryPoint: use32 push 0 call @f ;"PE",0 db "capt",0 @@: call @f db "msg",0 @@: push 0 call @f vUSER32 dd aMessageBoxA,0 @@: pop eax call dword[eax] ret ;============= section 1 end ======================= db 0x200-($-$$) dup 0 org 0x2000 ;============= section 2 begin ======================= ;import idata dd 0,0,0,aUSER32,vUSER32, 5 dup 0 aUSER32 db "USER32.DLL",0 aMessageBoxA db 0,0,"MessageBoxA",0 ;============= section 2 end ======================= db 0x400-($-$$) dup 0 ; FILE ALIGN Он работает. Только одна проблема, в нем rva entrypoint=4 А задумывалось что entrypoint будет в 3й секции (rva 0х3004), только хз почему но загрузчик не переносит байты 3й секции из файла в память, а просто заполняет ее нулями. Что не так?!
GoldFinch Потому что raw offset 3ей секции - нуль. Такой вот загрузчик. Поставь там единицу или что-то - загрузчик сам выровняет до нуля и нормально погрузит.
GoldFinch Я сегодня с утра ел вареники с клюквой, потом ещё перекусывал в столовой, а когда домой пришёл, уже обед стоит, так что всё нормально.
l_inc, ну раз нормально, так нормально. Я когда буду писать свой компилятор обязательно сделаю так чтобы он генерил кошерные файлы, дабы кодеры могли им пользоваться без оглядки на религиозные ограничения. А пока мне проходится пользоваться некошерным фасмом, благо что я не иудей. В продолжение темы, если записать код в заголовок файла (не создавая в нем новых секций), и перенаправить туда entrypoint, то это будет работать на любой системе?
GoldFinch Некошерность заключается в том, что по слухам разные загрузчики такую ситуацию могут обрабатывать по-разному. А фасм очень даже ничего. И то, что его можно заставить генерировать от PE с неудачными или невалидными полями до BMP, ему только в плюс. Эм... если не учитывать привередливые антивирусы, то на любой 32-битной windows.
l_inc ну а я и не вирус пишу, а если бы и вирус - так надо просто сказать жертве, что файл очень нужный, но вот авирь может ругаться =)
долеплял линкер один. Если точнее - пытаюсь перевести alef на вынь платформу. В настоящее время компилер алефа пашет, а с рантаймом не все хорошо. большая разница в план9 и вынь процессных/поточных/синхронизационных моделях. кроме того есть разница и в модели объектника и линкера (последние оптимизации и перевод в машкод делает линкер). в тулчейне есть еще С, С++ (не смотрел пока), асм, дебуггер (не смотрел пока), линкер. Кто загорится помочь - велкам. Для просто любопытно посмотреть - сорцы на сайте белл-лабс - план9 и алеф отдельно. так вот, наименьшее воспринимаемое всеми выравнивание секций - 200h (диск) и 1000h (образ). Что и понятно, сектор и страница.