PE-файлы

Тема в разделе "WASM.BEGINNERS", создана пользователем GoldFinch, 1 авг 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    РЕ-файл в fasm, вдруг кому нада...
    Код (Text):
    1. ?? equ 0x5555 ;любые word числа
    2. DIRLEN equ 2 ;вроде как длина таблицы директорий, от 2 до 16 т.к. есть импорт
    3. TYP equ 2 ;Win32 GUI
    4. IMP equ 1;импорт из 1 dll
    5. FLAG equ 103h ;no_reloc+exe+32bit
    6. code_start:
    7. dw "MZ",0,"PE",0,14ch,1,??,??,??,??,??,??,(sect_8-8-0x1C),FLAG,10bh,??,??,??,??,??,??,??,\
    8.    EntryPoint,0,??,??,??,??,0,40h,4,0,4,0,??,??,??,??,4,??,??,??,file_end,0,_0x00FC,0,??,??,\
    9.    TYP,??,0,0,0,0,0,0,0,0,??,??,DIRLEN,0,??,??,0,0,(idata_12-12),0,10*IMP+10,0,??,??,0,0,\
    10.    ??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0,\
    11.    ??,??,0,0,??,??,0,0,??,??,0,0,??,??,0,0
    12. _0x00FC:
    13. sect_8 dw file_end-code_start,0,code_start,0,file_end-code_start,0,code_start,0
    14. idata_12 dw aDllName,0,vFunc_table,0,??,??,??,??,??,??,0,0,0,0
    15. vFunc_table: MessageBoxA dw aFuncName,0,0,0
    16. aDllName db "USER32.DLL",0
    17. aFuncName db 0,0,"MessageBoxA",0
    18. EntryPoint:  use32
    19.              push 0
    20.              push 0x400000+4 ;"PE",0
    21.              push 0x400000+0 ;"MZ",0
    22.              push 0
    23.              call dword [0x400000+MessageBoxA]
    24.              ret
    25. file_end: ;вроде как должно быть выровнено по границе 4 байта
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    О господи...
     
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    и что работает?
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    работает.
    кстати без директивы format PE *** фасм компилит .bin файл, однако иде фасма успешно его запускает.

    ЗЫ: так ли это, что массив директорий (IMAGE_OPTIONAL_HEADER.DataDirectory[16]) всегда должен состоять из 16 элементов, и поля размера отсутствующих элементов должны быть равны нулю? и как тогда работает поле IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes ?
     
  5. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    "NumberOfRvaAndSizes
    Количество элементов (не байт) в DATA_DIRECTORY следующей непосредственно за этим полем. Из-за грубых ошибок в системном загрузчике компоновщики от Borland и Microsoft всегда выставляют полный размер директории, равный 10h, даже если реально его не используют. Например, Windows 9x не проверяет, что NumberOfRvaAndSizes >= RELOCATION и/или RESOURCE и если подсунуть ему запрос к одной из этих секций, а таких директорий нет – кранты. Windows NT не проверяет (при загрузке dll) "достаточности" TLS_DIRECTORY и если этот TLS-механизм активирован, а TLS-директории нет – опять кранты.
    Компоновщик Юрия Харона выгодно отличается тем, что усекает размер директории до минимума, но и кода вокруг процедуры "сокращений" там строк пятьсот, а уж сколько времени было убито в ИДЕ…"
    "записки исследователя компьютерных вирусов II
    или кодокопание продолжается
    крис касперски ака мыщъх"
     
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Subrealist, не понял к чему это было. Если у нас только два элемента в массиве директорий, там всеравно надо 16 элементов?
     
  7. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Если не 16, то в некоторых случаях могут возникнуть проблемы. Тут надо поэкспериментировать с разными вариантами на разных операционках. Сам формат предоставляет возможность работы с различным числом элементов, но спецификация и реализация вещи разные
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Subrealist, омг... а я-то и не знал...
     
  9. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Если знал, тогда в чём вопрос?
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    GoldFinch
    Если PE-файл содержит импорт - тогда под WinXP SP2 достаточно 4 элементов (export, import, resource, exeption) (смотри здесь)
    Если можно обойтись без импорта, тогда 0 (смотри здесь)
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    хм... все же не совсем так
    достаточно 2 элемента (NumberOfRvaAndSizes=2)
    но размер Debug таблицы (7й элемент) должен быть равен нулю
    что странно, вроде как можно еще и заполнить мусором размер 1го элемента %)

    Код (Text):
    1. ?? equ 0xAAAA
    2. code_start:
    3. dw "MZ",0,"PE",0,14ch,1,??,??,??,??,??,??,(sect_8-8-0x1C),103h,10bh,??,??,??,??,??,??,??,\
    4.    EntryPoint,0,??,??,??,??,0,40h,4,0,4,0,??,??,??,??,4,??,??,??,file_end,0
    5.    dw _L1;Headers size
    6.    dw 0,??,??,2,??,0,0,0,0,0,0,0,0,??,??
    7.    dd 2    ;NumberOfRvaAndSizes
    8.    dw ??,??,??,?? ;export (1)
    9.    dd (idata_12-12),20 ;import (2)
    10.    dw ??,??,??,?? ;resources (3)
    11.    dw ??,??,??,?? ;exceptions (4)
    12.    dw ??,??,??,?? ;sertf (5)
    13.    dw ??,??,??,?? ;reloc (6)
    14.    dw ??,??,0,0 ;debug (7)
    15. _L1:
    16.    dw 9*2*2 dup(??) ;DataDirectory[8-16]
    17. sect_8 dw file_end-code_start,0,code_start,0,file_end-code_start,0,code_start,0
    18. idata_12 dw aDllName,0,vFunc_table,0,??,??,??,??,??,??,??,??,0,0
    19. vFunc_table: MessageBoxA dw aFuncName,0,0,0
    20. aDllName db "USER32.DLL",0
    21. aFuncName db 0,0,"MessageBoxA",0
    22. EntryPoint:  use32
    23.              push 0
    24.              push 0x400000+4 ;"PE",0
    25.              push 0x400000+0 ;"MZ",0
    26.              push 0
    27.              call dword [0x400000+MessageBoxA]
    28.              ret
    29. file_end:
     
  12. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    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 (в десятичной). Про ещё большее урезание в документации к нему написано, что это может привести к проблемам загрузки на отдельных версиях виндоус и даже на отдельных версиях сборки
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Ну во-первых она там есть, в NumberOfRvaAndSizes можно написать много чего, но если под нее отведено место, значит она там есть.
    Во-вторых меня не интересует вариант с совсем пустой таблицей директорий - меня интересует пешник с импортом, т.е. в таблице должно быть хотя бы 2 элемента.

    Кстати, а что делает этот странный файл? В нем дофига неоптимизированного кода и уйма пустого места оО
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    notdir.exe размер 1888 байт(!!!) в аттаче пример как люди уложились в 97 байт
     
  15. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Mikl___ а почему все exe в архиве весят 4кб?
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    2FED
    текст rules.txt посмотри внимательно
     
  17. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    GoldFinch
    Благодарю за найденную ошибку!
    http://slil.ru/26040472
    Удалось сократить число элементов в таблице директорий до 3, хотя они прямо и не используются, но сократить размер опционального заголовка на меньшую величину не получилось. С меньшим числом файл не грузиться.
    Файл просто выводит messagebox в котором отображается имя одного найденного в директории файла. Использовал сырую заготовку для саморазмножающегося кода, предварительно лишив его способности к размножению.
    А чтоб действительно выяснить функционирование пешника у которого есть импорт и число элементов в таблице директорий сокращено до минимума можно создать под виртуалкой зоопарк осей и исследовать на них его поведение

    Mikl___
    У меня была цель испытать поведение файла, который находит весь нужный импорт самостоятельно и имеет NumberOfRvaAndSizes=0 на разных платформах, а не создавать приложение минимального объёма. Естественно, сделанные тобой и другими людьми образцы минимизации очень интересны и представляют собой реальное творчество, у меня же просто код для проверки работы загрузчика
    на разных версиях виндоус