Ошибка в формате PE файла

Тема в разделе "WASM.WIN32", создана пользователем MiSterZero, 20 май 2005.

  1. MiSterZero

    MiSterZero New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    1
    Уважаемые гуру,

    Я внимательно прочитал статьи про упаковщики и про написание HelloWorld в машинном коде, и попытался вручную создать PE файл.

    Этот файл не имеет никаких директорий и имеет только секцию кода где расположены байты соответствующие коду
    Код (Text):
    1.  mov eax, eax
    2.  nop
    3.  pop ebp
    4.  retn
    5.  


    PEiD показывает что файл валиден, все поля заголовка вроде в порядке, но файл так и не хочет запускаться (выдает Is Not valid Win32 Application). Дизассемблер его без проблем понимает.

    Пожалуйста, подскажите в чем моя ошибка.



    [​IMG] _1326832765__1.rar
     
  2. bogrus

    bogrus Active Member

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




    Имхо PE корявый т.к. винда его даже не грузит, думаю в PEiD не преследовалась цель определения валидности заголовка, поищи утилиту PE Valid кажется, и не беспокой по пустякам народ :)
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    MiSterZero



    Размер экзешника в том туториале получался 1К. Ваш экзешник что-то очень большой. Да и без директории импорта NT такой файл не загрузит.
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Тут точно не импорт, иначе винда бы его загрузила, не нашла кода на "точке входа" kernell32.dll и молча же (если нет дебагера) выгрузила, так и не стартанув, а так ругается
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Дело не в том что где не грузится. Народ не прикидывайтесь ламерками, все уже давно ясно, пора переходть на солярис 10.

    Тем кто не понял: pe полное *, потому что содрано (причем очень криво) с coff формата, и так вся ОС. Все содрано с нормальных систем: оформление, функциональность, прочее.

    Мысли: непомогло даже перименование в com.
     
  6. BlackNeuromancer

    BlackNeuromancer New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    4
    неа, лучше на Linux переходить :)) я вот постепенно перехожу
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Народ, как не стыдно флеймить? Человек ведь не какой-нибудь RTFM вопрос задал.



    MiSterZero

    Твоя ошибка в полях опционального заголовка SizeOfHeaders и SizeOfImage. К сожалению в статьях на русском этим полям не уделено должное внимание, а они очень важны для работы загрузчика.

    Поле SizeOfHeaders должно содержать рназмер всех заголовков включая также заголовки всех секций.

    Поле SizeOfImage должно содержать SizeOfHeaders + сумму SizeOfRawData всех секций выровненную на SectionAlignment.



    В твоем случае это должны быть следующие значения:

    SizeOfHeaders = 0x0300

    SizeOfImage = 0x2000

    После таких исправлений файл загружается.

    ============================================

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

    Это правильно только частично, на самом деле в любой процесс будет загружена ntdll.dll независимо от ее присутствия в импорте, а для IMAGE_SUBSYSTEM_WINDOWS_GUI или IMAGE_SUBSYSTEM_WINDOWS_CUI будет еще загружена kernel32.dll, но инициализирована она НЕ БУДЕТ. Поэтому если требуется использовать Win32API, то загрузить kernel32.dll придется явно, или придется создавать импорт.

    ===============================

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

    [​IMG] _2048393392__1.rar
     
  8. bogrus

    bogrus Active Member

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




    В том то и дело, что kernel32.dll сама загружена НЕ БУДЕТ (все NT до XP), пофиг SUBSYSTEM

    http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=6374
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    bogrus

    В атаче лежит пример екзешника не содержащего никакого импорта, который просто выполняет комманду jmp $.

    Запускаем его, открываем PeTools и смотрим какие библиотеки загружены. То что звгружается kernel32.dll проверено экспериментальным путем по крайней мере для Windows XP. Другое дело в том, что библиотека загружается, но не инициализируется, тоесть не настраивается импорт, релоки и не вызывается ее точка входа.

    [​IMG] _1039303713__Sample.exe
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    XP да, больше нигде эти примеры не запустятся, т.к.



    "Don't know how to continue because memory at address 793A87B3 is not readable. Try to change EIP or pass exception to program."



    И по адресу 793A87B3 (w2ksp4ru) действительно ничего нет, а должен быть kernel32.dll, собсно экспериментировать сильно не надо, олли покажет лог и карту памяти
    Код (Text):
    1. ====================================================================== ==========================
    2.            File 'C:\temp\_1039303713__Sample.exe'
    3.            New process with ID 00000348 created
    4. 00401000   Main thread with ID 00000268 created
    5. 00400000   Module C:\temp\_1039303713__Sample.exe
    6. 77F80000   Module C:\WINNT\system32\ntdll.dll
    7. 793A87B3   Access violation when executing [793A87B3]
    8. ====================================================================== ==========================
    9. Address  Size      Owner    Section Contains                  Type          Access       Initial
    10. 00010000 00001000                                             Priv 00021004 RW           RW
    11. 00020000 00001000                                             Priv 00021004 RW           RW
    12. 0013E000 00001000                                             Priv 00021104 RW  Guarded  RW
    13. 0013F000 00011000                   stack of main thread      Priv 00021104 RW  Guarded  RW
    14. 00150000 00003000                                             Priv 00021004 RW           RW
    15. 00400000 00001000  _1039303         PE header                 Imag 01001002 R            RWE
    16. 00401000 00001000  _1039303 CODE    code                      Imag 01001002 R            RWE
    17. 77F80000 00001000  ntdll            PE header                 Imag 01001002 R            RWE
    18. 77F81000 00045000  ntdll    .text   code,exports              Imag 01001002 R            RWE
    19. 77FC6000 00005000  ntdll    ECODE   code                      Imag 01001002 R            RWE
    20. 77FCB000 00004000  ntdll    PAGE    code                      Imag 01001002 R            RWE
    21. 77FCF000 00003000  ntdll    .data   data                      Imag 01001002 R            RWE
    22. 77FD2000 00028000  ntdll    .rsrc   resources                 Imag 01001002 R            RWE
    23. 77FFA000 00002000  ntdll    .reloc  relocations               Imag 01001002 R            RWE
    24. 7FFB0000 00024000                                             Map  00041002 R            R
    25. 7FFDE000 00001000                   data block of main thread Priv 00021040 RWE          RWE
    26. 7FFDF000 00001000                                             Priv 00021040 RWE          RWE
    27. 7FFE0000 00001000                                             Priv 00021002 R            R
    28. ================================================================================================