Как заставить работать PE файл без импорта?

Тема в разделе "WASM.BEGINNERS", создана пользователем qvant, 14 фев 2008.

  1. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    AshBone
    Компилятор VC может собрать замечательный корректный PE без импорта. Но Win2k (не исключено даже, что только с определёнными SP) его не загрузит. Точнее, происходит следующее: при создании нормального Win32-процесса стартовой точкой главного потока объявляется вовсе не EntryPoint из PE header, а внутренняя процедура kernel32, которая и вызывает собственно EntryPoint. Реально перед исполнением этой процедуры в процессе получает управление системный загрузчик из ntdll.dll, который и обрабатывает всякие вещи типа reloc/import/export. Так вот, под Win2k этот загрузчик не грузит автоматически kernel32. Так что если программа импортирует что-то из kernel32 (или практически любой другой системной библиотеки, они сами kernel32 требуют), то kernel32 загрузится в процессе импорта функций и всё будет в порядке. А если импорта нет совсем, то до того, как EntryPoint из exe-шника вообще получит управление, главный поток схлопочет исключение при попытке выполнить код из kernel32.
    P.S. Вообще-то можно выполнить код из exe-шника до EntryPoint - это называется TLS Callbacks и тоже обрабатывается загрузчиком из ntdll.
    P.P.S. Забавно может выглядеть попытка создать PE-файл с ImageBase, перекрывающимся с kernel32. В адресное пространство нового процесса первым всегда грузится exe-шник.
     
  2. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    diamond


    кем и где это оно "объявляется"??? о_0

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

    Учите матчасть, товарищ, kernel32.dll загружается полюбому, в независимости от того, импортирует PE из него что - то или нет.
     
  3. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    AshBone
    Кодом функции CreateProcess (и нижележащих в дереве вызова, BaseInitializeContext). При вызове NtCreateThread для создания главного потока передаётся контекст потока, в котором EIP (на x86; на других архитектурах регистр называется по-другому, но сути дела это не меняет) указывает на BaseProcessStartThunk (а EntryPoint, кстати, в eax).
    На XP - да. На 2k - нет. В качестве доказательства IMHO достаточно уже написанных в этой теме постов.
     
  4. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    diamond
    плять, завтра спецом запущу на 2К минимальную прогу без импортов, чтобы снять вопрос.
     
  5. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    AshBone
    Можешь не париться, это уже неоднократно делалось :)
    http://www.wasm.ru/forum/viewtopic.php?pid=81134#p81134
    http://www.wasm.ru/forum/viewtopic.php?id=14474
    http://www.wasm.ru/forum/viewtopic.php?id=6757
     
  6. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    diamond

    Если все это действительно правда, то этот навоз (win2k) пора уже давно списать.