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

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

  1. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    Пишу тулзу, заменил все вызовы API на вызов по хэшу, соответственно директория импорта исчезла.
    Файл превратился в нерабочий - вылетает с AV до передачи управления на точку входа, по адресам, по которым должен лежать kernel32.dll. Соответственно, предполагаю, что в любом PE файле в директории импорта должна быть эта длл. Можно ли обойтись без неё в импорте? Как заставить линкер генерить фейковый импорт без фактического использования функций в коде?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    винда какая? такие проблемы характерны для 2000
     
  3. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    Она и есть.. Нужно чтобы на всей NT линейке работало.
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    А что мешает вызвать 1 ф-ию просто так? или PeTools можно попользоваться
     
  5. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    Одну функцию палевно юзать, наверное нужен добротный фейковый импорт аля блокнот. Можно, конечно, написать доп. тулзу, которая будет сама его создавать в уже готовом файле..
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Кто-то где-то недавно упоминал, что в FASM'е можно сделать типа a = ExitProcess и он (FASM) добавит функцию в импорт
     
  7. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    Это как понимать? Ты что, пытаешься их жестко прошить? о_0...... Или я не так понял?

    Есть же стандартные VX-методы работы с импортируемыми функциями без секции импорта. Канонический способ:

    1. Получить адрес из kernel32.dll
    2. Найти его базу
    3. Разгрести секцию экспорта библиотеки и получить нужные адреса.
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    qvant
    Если конечно ты не пишешь VX -- посмотри вот сюда, PE файл вызывающий MessageBox без всякого импорта, размер 97 байт, правда работать это на всей NT линейке не будет - писалось под XP
     
  9. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    А TLS у файла есть?
     
  10. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    AshBone
    Не так понял.. Я не пытаюсь "жестко прошить" адреса, а апи вызываю как раз как ты написал. Проблема в том, что
    загрузчик юзает что-то из кернела ДО передачи управления моему коду. Если её (кернел32) нет в импорте, то происходит AV. Можно просто скомпилить вот это:
    Код (Text):
    1. int main()
    2. {
    3.     return 1;
    4. }
    И запустить в отладчике под w2k

    Mikl__
    Спасибо, но мне это вряд ли поможет из-за отсутствия универсальности..

    dermatolog
    Нету.

    2all
    Т.е. нельзя обмануть линкер, чтобы он собрал нужный мне импорт БЕЗ фактического использования функций в коде?
     
  11. AshBone

    AshBone New Member

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

    При включении функции main() в программу компилятор автоматически добавляет стартовый код, в котором вызываются функции кернела типа GetCommandLine, GetVersion и т.п.

    Выход - не использовать main();

    Я этого ни разу не делал, но попытайся в справочнике по компилятору/линкеру найти опцию указания альтернативной точки входа (если такое возможно), а может, есть какая-нить прагма для отключения вставки стартового кода....
     
  12. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    AshBone

    Библиотечный код отключается директивой #pragma comment(linker, "/ENTRY:main"), но к моей ситуации это не имеет отношения. Еще раз: AV происходит ДО передачи управления коду моей программы (не важно библиотечного или мною написанного). Проблема не в том, что кернел добавляется непойми из-за чего, а в том, что БЕЗ него программа теряет работоспособность на w2k.
     
  13. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Можно руками добавить в импорт kernel32.dll в твой собранный бинарник
     
  14. AshBone

    AshBone New Member

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

    Это как понимать? AV происходит в kernel32.dll? Или линкер неправильно собирает PE? Запусти прогу под отладчиком (лучше всего в софтайсе) и посмотри - какая инструкция и в каком модуле вызывает AV.
     
  15. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    Мне достаточно знать, что .exe без кернела в импорте теряет работоспособность на w2k.
    А так как линкер судя по всему обмануть не получится, буду генерить фейковый импорт уже после сборки.
     
  16. GrDog

    GrDog New Member

    Публикаций:
    0
    Регистрация:
    28 июн 2007
    Сообщения:
    26
    Не совсем понятно почему тебе не использовать группу функций ? А использовать их можно в фейковой функции собственно для импорта все равно GetLastError криво по хэшу импортится :)
     
  17. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    qvant
    Мягко выражаясь, неправда.
     
  18. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    А ты сам скомпиль вот такой код:
    Код (Text):
    1. #pragma comment(linker, "/ENTRY:main")
    2. int main()
    3. {
    4.     return 1;
    5. }
    Потом убедись, что директории импорта действительно нет и загрузи получившийся .exe в отладчик под w2k..
     
  19. qvant

    qvant New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2006
    Сообщения:
    38
    С GetLastError всё ок, просто начиная с XP это форвард на ntdll..

    Что касается группы - можно, конечно, просто я не хочу юзать в своём коде эти функции только ради нужного импорта. Я его создам руками после сборки.
     
  20. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    qvant
    Зачем мне компилить такой код, чтобы убедиться? Достаточно такого (на асме):

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3.  
    4. .code
    5.  
    6. start:
    7.  
    8. ret
    9.  
    10. end start
    Если твой компилятор не может корректно собрать PE без импорта, то не надо делать вывод, что такое невозможно впринципе.