минимальная pe-прога

Тема в разделе "WASM.WIN32", создана пользователем ovod, 7 сен 2004.

  1. ovod

    ovod New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2004
    Сообщения:
    26
    Адрес:
    г. Нелидово Тверской обл.
    Пытаюсь разобраться с PE-файлами. "Наделал" тут что-то в 172 байта


    Код (Text):
    1. ;===================================================================== ===========
    2. ib      equ     400000h           ;база образа
    3.         org     ib + 1000h        ;база кода (навроде того)
    4.         use32                     ;создаем бинарник в 32-разрядной системе
    5. ;===================================================================== ===========
    6. _mz:
    7.         db      'MZ'              ;метка exe-файла
    8.         rb      10                ;выравнивание, чтоб попасть на 'pe' с 3Сh
    9. _pe:
    10.         dd      'PE'              ;метка pe-файла
    11.         dw      014Ch             ;Тип проца здесь Intel 386
    12.         dw      1                 ;количество секций в файле
    13.         dd      'time'            ;временной штамп, умышленно искажаем
    14.         dd      'psmb'            ;указатель(p) на таблицу символов(smb), искажен
    15.         dd      'csmb'            ;количество(c) символов(smb), искажен
    16.         dw      start-o_header    ;размер опционального заголовка
    17.         dw      818Fh             ;характеристики (инфа о файле)
    18. o_header:
    19.         dw      010Bh             ;Magic (какая-то сигнатура)
    20.         db      'H'               ;старшая(H) версия линкера, умышленно искажаем
    21.         db      'l'               ;младшая(L) версия линкера, умышленно искажаем
    22.         dd      'sz_c'            ;размер кода, умышленно искажаем
    23.         dd      'sz_d'            ;размер инициализированных данных, искажаем
    24.         dd      'sz?d'            ;размер неинициализированных данных, искажаем
    25.         dd      start-ib          ;адрес(RVA) точки входа
    26.         dd      'rvac'            ;RVA, откуда начинается секция с кодом
    27.         dd      _pe-_mz           ;ставим смещение на 'pe', вместо базы данных
    28.         dd      ib                ;база образа
    29.         dd      1000h             ;выравнивание секций (в памяти)
    30.         dd      200h              ;выравнивание raw-секций (в файле на диске)
    31.         dw      'Ho'              ;старшая версия операционки, умышленно искажаем
    32.         dw      'lo'              ;младшая версия операционки, умышленно искажаем
    33.         dw      'Hi'              ;старшая версия образа, умышленно искажаем
    34.         dw      'li'              ;младшая версия образа, умышленно искажаем
    35.         dw      4                 ;старшая версия подсистемы
    36.         dw      0                 ;младшая версия подсистемы
    37.         dd      'rsrv'            ;зарезервировано1, умышленно искажаем
    38.         dd      2000h             ;размер образа, округл. до ближ. выравнивания
    39.         dd      end_section-_pe+4 ;размер pe-заголовка и таблицы секций
    40.         dd      'chks'            ;check-сумма файла
    41.         dw      2                 ;подсистема Windows GUI
    42.         dw      0                 ;набор флагов - характеристик dll
    43.         dd      1000h             ;размер зарезервированного стека
    44.         dd      0                 ;размер выделеннго стека
    45.         dd      1000h             ;размер зарезервированной кучи
    46.         dd      0                 ;размер выделенной кучи
    47.         dd      0                 ;флаги загрузчика
    48.         dd      1                 ;количество элементов в массиве DataDirecory
    49. start:
    50.         ret
    51.         db      'name_s',0        ;имя секции
    52.         dd      end_section-_mz-1 ;виртуальный размер
    53.         dd      1000h             ;виртуальный адрес
    54.         dd      end_section-_mz-1 ;размер raw-данных
    55.         dd      2                 ;указатель на raw-данные
    56.         dd      0                 ;указатель на релокейшены
    57.         dd      0                 ;указатель на номера строк
    58.         dw      0                 ;количество релокейшенов
    59.         dw      0                 ;количество номеров строк
    60. end_section:
    61.         dd      0E0000060h        ;характеристики секции        
    62.  
    ,

    теперь сижу, чешу репу, выполнился он или нет? OllyDBG матерится на корявый формат, XP либо проигнорировал молча, либо выполнил (неясно).

    Вобщем, поскажИте самый маленький исполнимый pe-файл (и elf заодно)
     
  2. APsyL

    APsyL New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    8
    Адрес:
    kiev.ua
    Поищи на хакере, где-то я видел там по-мойму еще меньше (не помню точно) выводящее MessageBox =)
     
  3. ovod

    ovod New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2004
    Сообщения:
    26
    Адрес:
    г. Нелидово Тверской обл.
    Имеешь ввиду ту, которая в 188 байт? Где ж она меньше? Ну вот теоретически: 2 байта(cигнатура exe-файла)+120 байт(pe-заголовок)+40 байт(таблица секций)=162 байта. Как максимально близко подойти к этому пределу?
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Первая половина вроде нормальная , а где-то в конце исходника намудрил . И без импорта не на всех виндах будет работать , ничё ?
     
  5. ovod

    ovod New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2004
    Сообщения:
    26
    Адрес:
    г. Нелидово Тверской обл.
    Просто добавить/обозначить секцию импорта, не вкладывая туда никакой функции?

    Хотелось бы конечно, чтоб на всех виндах пахала, а на каких не будет? И что за штука такая, выравнивание PE-звголовка?
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Э-э-э не :) Нужно импортировать какую-то ф-цию из kernel32.dll или любой длл-ки которая имеет импорты с kernel32.dll







    На всех NT до NT 5.1(XP)
     
  7. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > 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 - нет. так что этот прием не имеет практического применения...
     
  8. sensy

    sensy New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    29
    kaspersky

    вот, как при загрузке в OllyDbg, так и просто при запуске
    Код (Text):
    1.  
    2. ---------------------------
    3. тест_PE.exe - Недопустимое перемещение системной DLL
    4. ---------------------------
    5. Системная библиотека kernel32.dll перемещена в памяти.
    6. Работа приложения будет нарушена. Перемещение произошло
    7. из-за того, что библиотека тест_PE.exe заняла область
    8. адресов, зарезервированную для системных DLL Windows.
    9. Обратитесь к поставщику за новой версией библиотеки.
    10. ---------------------------
    11. ОК  
    12. ---------------------------
    13.  






    ----

    вот код
    Код (Text):
    1.  
    2. format PE GUI 5.0 at 77E60000h
    3. entry старт
    4.  
    5. include 'Win32a.inc'
    6.  
    7. ;<< code
    8. старт:
    9.     xor     eax,eax
    10.     mov     edx,[имОкошко]
    11.     push    eax
    12.     push    Заголовок
    13.     push    Сообщение
    14.     push    eax
    15.     call    edx
    16.     ret
    17.  
    18. align 32
    19. Сообщение  db 'Привет, я kernel32.dll',0
    20. Заголовок  db 'PE тест',0
    21. ;>> code
    22.  
    23. ;<< IMPORTS
    24. data import
    25.  
    26. library \
    27.     усер,'user32'
    28.  
    29. import усер,\
    30.     имОкошко,'MessageBoxA'
    31.  
    32. end data
    33. ;>>
    34.  
    35.  
    36. section '.релоки' fixups dаtа disсаrdаblе
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    ovod Вот на этом форуме я видел MessageBox c импортами в 152 байта .



    Одно но , он не будет работать на <NT5.1 просто потому , что в тех имортах наименование dll-ки указываеться не полностью (без расширения) . Т.е. в нём ещё думаю можно найти 4 байта , чтобы дописать ".dll" , тогда должен работать .
     
  10. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > тест_PE.exe - Недопустимое перемещение системной DLL

    это - без перемещаемых элементов, а имел ввиду с ними ;)
     
  11. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Как это работает ? у меня если align меньше 4096 оно не запускается, соотв. минимальный размер 2048.
     
  12. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    zzzyab

    Всмысле? Какой алигн? Какие 4096? И почему тогда 2048? Ничего не понял.
     
  13. ovod

    ovod New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2004
    Сообщения:
    26
    Адрес:
    г. Нелидово Тверской обл.
    bogrus, хм.. если таблицу секций "вложить" в pe-заголовок, то теоретический предел 142 байта (хотя, по всей видимости, практический - 144). Вопросы такие: какая структура у баундов (почему они меньше импортов, как их оформлять)?

    kaspersky, хитрость с pe-хвостом в 98 имеет весьма живой академический интерес: чтож, можно до конца вообще не дописывать pe-заголовок, система дополнит его автоматом нулями?
     
  14. sensy

    sensy New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    29
    kaspersky



    велл. Что такое перемещаемые элементы?



    если это Relocation table, то
    Код (Text):
    1. section '.релоки' fixups dаtа disсаrdаblе


    ни о чём не напоминает?
     
  15. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > section '.релоки' fixups dаtа disсаrdаblе

    > ни о чём не напоминает?

    ни о чем ;)

    ты мне в самом файле релоки покажи. некоторые линкеры их упорно не вставляют если база находится слишком высоко... или вставляют но не правильно.

    короче говоря, вот файл, который должен работать. попробуй запустить... может, конечно, дело и в винде, но крайне маловероятно...



    > хитрость с pe-хвостом в 98 имеет весьма живой академический интерес:

    > чтож, можно до конца вообще не дописывать pe-заголовок, система дополнит его автоматом нулями?

    ты наверное знаешь, что оперативная память в современных осях используется как кэш и одни и те же страницы в разные моменты времени могут выделяться различным процессам? в одной из версий линуха был такой баг - там забыли подчищать страницы и потому просто выделяя страницы malloc'ом мы могли получить доступ к данным чужого процессса. но винда не пальцем делана и таких ляпов там нет. страницы перед их выделением всегда иниц. нулями. почему именно нулями? и гарантируется ли это нам? ну... непосредственно не гарантируется, но учитывая что: а) если физический размер страницы меньше виртуального хвост _гарантированно_ равен нулю; б) неиц. секция _гарантированно_ равна нулю - какой черт MS сначала затирать страницы одним значением, а затем иниц. некоторые из них нулями? так что нули прописываются всегда. и мы можем на это положиться. другое дело, что NT-загрузчик дополнительно проверяет еще и некоторые поля, в частности, файл без секций он вообще не грузит. хотя, возможно, это как-то можно и обойти... если верить в опциональность опционального заголовка - должен же быть способ создавать файлы без него? так что тут можно поэкспериментировать...

    [​IMG] _583851587__xxx.zip
     
  16. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > у меня если align меньше 4096 оно не запускается

    если у тебя NT, то минимальное выравнивание == 2. ms link умеет создавать такие файлы. задай ему ключ драйвера. он ругнется, что это никакой не драйвер в натуре, но файл таки создаст.
     
  17. sensy

    sensy New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    29
    kaspersky



    велл.



    собрано на FASM'e, он сам себе линкер.

    [​IMG] 1197402520__testPE.rar
     
  18. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Оно то все создается но если align<4096 при запуске вылетает окно "Error Starting Program - file is improperly linked with aligment less than 0x1000. Fix the error, and then link again"



    Возможно если вручную набирать машинный код, то оно и работает. Эта экономия имхо важна только для разработчиков вирусов.
     
  19. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    О пипл , я вас прошу , не обзывайте так аттачи . У некоторых в squid-е фильтры стоят на порно Ж)







    Имхо , я считаю каждый должен попробывать сделать минипе :)

    Просто , чтобы разобраться и уверен можно сделать полезные для себя выводы .
     
  20. ovod

    ovod New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2004
    Сообщения:
    26
    Адрес:
    г. Нелидово Тверской обл.
    На assembler.ru была статья "Минимальная stub-программа"

    и приводилась такая вот прога в 64 байта (она работает как в 98, так и в DOS),автор некто Grief
    Код (Text):
    1. 00000000:  4D 5A 00 00 01 00 00 00 │ 01 00 00 00 50 45 00 00   MZ  ☺   ☺   PE
    2. 00000010:  4C 01 07 00 08 00 00 00 │ B0 21 CD 29 B4 4C CD 21   L☺• ◘   °!Н)_LН!
    3. 00000020:  E0 00 0E 01 0B 01 04 14 │ 20 00 00 00 00 2E 00 00   а ♫☺♂☺♦¶     .
    4. 00000030:  18 00 00 00 00 E0 00 00 │ 00 10 00 00 0C 00 00 00   ↑    а   ►  ♀