РЕ-файл в fasm, вдруг кому нада... Код (Text): ?? equ 0x5555 ;любые word числа DIRLEN equ 2 ;вроде как длина таблицы директорий, от 2 до 16 т.к. есть импорт TYP equ 2 ;Win32 GUI IMP equ 1;импорт из 1 dll FLAG equ 103h ;no_reloc+exe+32bit code_start: dw "MZ",0,"PE",0,14ch,1,??,??,??,??,??,??,(sect_8-8-0x1C),FLAG,10bh,??,??,??,??,??,??,??,\ EntryPoint,0,??,??,??,??,0,40h,4,0,4,0,??,??,??,??,4,??,??,??,file_end,0,_0x00FC,0,??,??,\ TYP,??,0,0,0,0,0,0,0,0,??,??,DIRLEN,0,??,??,0,0,(idata_12-12),0,10*IMP+10,0,??,??,0,0,\ ??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,\ ??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0 _0x00FC: sect_8 dw file_end-code_start,0,code_start,0,file_end-code_start,0,code_start,0 idata_12 dw aDllName,0,vFunc_table,0,??,??,??,??,??,??,0,0,0,0 vFunc_table: MessageBoxA dw aFuncName,0,0,0 aDllName db "USER32.DLL",0 aFuncName db 0,0,"MessageBoxA",0 EntryPoint: use32 push 0 push 0x400000+4 ;"PE",0 push 0x400000+0 ;"MZ",0 push 0 call dword [0x400000+MessageBoxA] ret file_end: ;вроде как должно быть выровнено по границе 4 байта
работает. кстати без директивы format PE *** фасм компилит .bin файл, однако иде фасма успешно его запускает. ЗЫ: так ли это, что массив директорий (IMAGE_OPTIONAL_HEADER.DataDirectory[16]) всегда должен состоять из 16 элементов, и поля размера отсутствующих элементов должны быть равны нулю? и как тогда работает поле IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes ?
"NumberOfRvaAndSizes Количество элементов (не байт) в DATA_DIRECTORY следующей непосредственно за этим полем. Из-за грубых ошибок в системном загрузчике компоновщики от Borland и Microsoft всегда выставляют полный размер директории, равный 10h, даже если реально его не используют. Например, Windows 9x не проверяет, что NumberOfRvaAndSizes >= RELOCATION и/или RESOURCE и если подсунуть ему запрос к одной из этих секций, а таких директорий нет – кранты. Windows NT не проверяет (при загрузке dll) "достаточности" TLS_DIRECTORY и если этот TLS-механизм активирован, а TLS-директории нет – опять кранты. Компоновщик Юрия Харона выгодно отличается тем, что усекает размер директории до минимума, но и кода вокруг процедуры "сокращений" там строк пятьсот, а уж сколько времени было убито в ИДЕ…" "записки исследователя компьютерных вирусов II или кодокопание продолжается крис касперски ака мыщъх"
Subrealist, не понял к чему это было. Если у нас только два элемента в массиве директорий, там всеравно надо 16 элементов?
Если не 16, то в некоторых случаях могут возникнуть проблемы. Тут надо поэкспериментировать с разными вариантами на разных операционках. Сам формат предоставляет возможность работы с различным числом элементов, но спецификация и реализация вещи разные
GoldFinch Если PE-файл содержит импорт - тогда под WinXP SP2 достаточно 4 элементов (export, import, resource, exeption) (смотри здесь) Если можно обойтись без импорта, тогда 0 (смотри здесь)
хм... все же не совсем так достаточно 2 элемента (NumberOfRvaAndSizes=2) но размер Debug таблицы (7й элемент) должен быть равен нулю что странно, вроде как можно еще и заполнить мусором размер 1го элемента %) Код (Text): ?? equ 0xAAAA code_start: dw "MZ",0,"PE",0,14ch,1,??,??,??,??,??,??,(sect_8-8-0x1C),103h,10bh,??,??,??,??,??,??,??,\ EntryPoint,0,??,??,??,??,0,40h,4,0,4,0,??,??,??,??,4,??,??,??,file_end,0 dw _L1;Headers size dw 0,??,??,2,??,0,0,0,0,0,0,0,0,??,?? dd 2 ;NumberOfRvaAndSizes dw ??,??,??,?? ;export (1) dd (idata_12-12),20 ;import (2) dw ??,??,??,?? ;resources (3) dw ??,??,??,?? ;exceptions (4) dw ??,??,??,?? ;sertf (5) dw ??,??,??,?? ;reloc (6) dw ??,??,0,0 ;debug (7) _L1: dw 9*2*2 dup(??) ;DataDirectory[8-16] sect_8 dw file_end-code_start,0,code_start,0,file_end-code_start,0,code_start,0 idata_12 dw aDllName,0,vFunc_table,0,??,??,??,??,??,??,??,??,0,0 vFunc_table: MessageBoxA dw aFuncName,0,0,0 aDllName db "USER32.DLL",0 aFuncName db 0,0,"MessageBoxA",0 EntryPoint: use32 push 0 push 0x400000+4 ;"PE",0 push 0x400000+0 ;"MZ",0 push 0 call dword [0x400000+MessageBoxA] ret file_end:
http://slil.ru/26038651 Это ссылка на пешник, в котором таблицы директорий нет совсем. Можно проверить IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes например через PE tools. Из проверенных систем файл успешно запускался на winxp sp2, w2k3 sp1 r2. Не запускался nt4 sp4, w2k sp4, win98se. На nt4 и w2k не запускается без объяснений, - известная особенность этой системы - kernel32 по умолчанию на ней не грузится. На win98se выдаётся сообщение, что файл скомпанован не правильно. Кстати, попробовал линковать объектные файлы хароновским unilink, о котором пишет Касперски, тот урезает число записей в таблице директорий до 10 (в десятичной). Про ещё большее урезание в документации к нему написано, что это может привести к проблемам загрузки на отдельных версиях виндоус и даже на отдельных версиях сборки
Ну во-первых она там есть, в NumberOfRvaAndSizes можно написать много чего, но если под нее отведено место, значит она там есть. Во-вторых меня не интересует вариант с совсем пустой таблицей директорий - меня интересует пешник с импортом, т.е. в таблице должно быть хотя бы 2 элемента. Кстати, а что делает этот странный файл? В нем дофига неоптимизированного кода и уйма пустого места оО
GoldFinch Благодарю за найденную ошибку! http://slil.ru/26040472 Удалось сократить число элементов в таблице директорий до 3, хотя они прямо и не используются, но сократить размер опционального заголовка на меньшую величину не получилось. С меньшим числом файл не грузиться. Файл просто выводит messagebox в котором отображается имя одного найденного в директории файла. Использовал сырую заготовку для саморазмножающегося кода, предварительно лишив его способности к размножению. А чтоб действительно выяснить функционирование пешника у которого есть импорт и число элементов в таблице директорий сокращено до минимума можно создать под виртуалкой зоопарк осей и исследовать на них его поведение Mikl___ У меня была цель испытать поведение файла, который находит весь нужный импорт самостоятельно и имеет NumberOfRvaAndSizes=0 на разных платформах, а не создавать приложение минимального объёма. Естественно, сделанные тобой и другими людьми образцы минимизации очень интересны и представляют собой реальное творчество, у меня же просто код для проверки работы загрузчика на разных версиях виндоус