Различие PE-загрузчиках WinXP и Win98

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

  1. FriendsElectric

    FriendsElectric New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    5
    Друзья! Я пишу свой PE-протектор. На WinXP всё работает отлично, на 98 exe/dll не загружаются. GetLastError() выдаёт 11 "An attempt was made to load a program with an incorrect format".

    В чем может быть дело ?

    Спасибо.
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    В плохой погоде. В направлении ветра.

    Что еще можно ответить, видя этот вопрос?
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    А в win декларациях ошибок написано, что это проблемы с форматом, а именно то, что это вовсе не тот формат, не PE. Но различия... есть ли они? Формат то один, какие могут быть различия.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Magic Number PE Format

    0x10b PE32

    0x20b PE32+



    Но это так, для красоты...
     
  5. FriendsElectric

    FriendsElectric New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    5
    Сообщаю что стало известно на текущий момент:



    1. Загрузчик win98 отказывается загружать dll без релоков (IMAGE_DIRECTORY_ENTRY_BASERELOC). Необходимо чтобы присутсвовала хотя-бы нулевая строка таблицы релоков (ImageBaseRelocation).



    2. В win98 нельзя убирать ресурсы(IMAGE_DIRECTORY_ENTRY_RESOURCE). Если лоадер восстанавливает вручную адрес ресурсов при загрузке PE, ни одна функция обращения к ресурсам работать не будет, несмотря на то, что GetLastError() возвращает 0.



    К сожалению это ещё не всё, постараюсь держать в курсе.
     
  6. NoName

    NoName New Member

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


    ImageBase - Preferred address of first byte of image when loaded into memory; must be a multiple of 64K. The default for DLLs is 0x10000000. The default for Windows CE EXEs is 0x00010000. The default for Windows NT, Windows 95, and Windows 98 is 0x00400000.



    Глупо что либо советовать человеку который должен теоретически знать больше чем я. У меня вообще депрессняк постоянно, но это тоже не стоило говорить.
     
  7. FriendsElectric

    FriendsElectric New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    5
    Похоже что загрузчик Win98 требует чтобы DllMain при возврате очищал стек от переданных параметров, т.е. лоадер должен завершаться

    RET 0Ch

    Иначе LoadLibrary() возвращает 0, а GetLastError() 1114. XP/2000 - нет, что непонятно :dntknw:

    Во всяком случае я в самом начале допустил такую ошибку -- RET без 0Сh, когда исправил -- заработало на обеих системах..
     
  8. bogrus

    bogrus Active Member

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




    Оно не должно было работать, ни на какой системе. Протестируй, bad не должен нигде работать, т.к. ret передает управление чёрти-куда. И протестируйте good на w98, интересно, как она ведет себя при одной секции в dll



    [​IMG] 1081648068__exedll.zip
     
  9. FriendsElectric

    FriendsElectric New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    5
    4. Если стереть адрес таблицы экспорта (в лоадере восстановить само-собой), под win98 GetProcAddress() всегда возвращает 0. Если не стирать (при этом по адресу таблицы будут упакованные данные) -- всё ок. С ресурсами такой фокус не проходит -- по адресу ресурсов должны лежать именно ресурсы.

    В общем граблей с защитой dll по самые края :)
     
  10. bogrus

    bogrus Active Member

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




    С чего бы вдруг, туда можно напихать что угодно. Может проблема в другом?

    http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=6897

    Глянь в отладчике, что там у тебя, а то так и будем ходить вокруг, да около
     
  11. FriendsElectric

    FriendsElectric New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    5
    Напихать можно чего угодно, но ресурсы загружаться не будут:) Во всяком случае у меня CreateDialog, FindResource и т.п. после распаковки ресурсов работают. Подозреваю что win98 загрузчик обрабатывает директории перед передачей управления в точку входа. Поэтому изменения полей директорий в лоадере ни на что не влияют.

    В целом разобрался, всё работает, если кому интересно: вот причины по которым защищенная exe/dll не работает в win98



    1. в директориях стёрт адрес таблицы релоков

    2. в директориях стёрт адрес таблицы экспорта

    3. ресурсы упакованы

    4. лоадер завершается ret а не ret 0Ch



    Насколько я знаю, UPX может паковать таблицу экспорта и частично ресурсы, но дальше разбираться нет времени :dntknw:
     
  12. bogrus

    bogrus Active Member

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