Импорт без библиотек импорта

Тема в разделе "WASM.WIN32", создана пользователем keksn, 24 сен 2007.

  1. keksn

    keksn New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    5
    В ходе некоторого проекта мне понадобилось создать объектник формата COFF, который в ходе своей работы вызывает API. Но возникла проблема - при линковке линкер ругается на unresolved external, т. е. нужна хотя бы kernel32.lib(которой изначально нет, т. к. то, к чему я линкую импортирует только из своего рантайма), хотя бы для GetProcAddress и LoadLibraryA. При подключении ошибок не возникает, но выходной файл теряет работоспособность - таблица импорта оказывается вообще пуста. Я попробовал импортить вирусными методами, т. е. находить через SEH базу kernel32.dll, однако под Windows Vista программа вылетала с ошибкой.
    Формат COFF вроде бы позволяет включить нужные импорты прямо в объектник(тот же VB позволяет добавить импорты в выходной файл, хотя использует тот же линкер, что и VC6), и для линковки не будет нужна библиотека импорта.
    Вопрос: как добавить импорт из DLL непосредственно в объектник, чтобы он собирался в PE без библиотек импорта?
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Помойму под Вистой проги без импорта
    вообще не запускаются:)
    И в объетник импорт не добавляется...
     
  3. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Напиши отдельную прогу, которая будет добавлять пустую таблицу импорта. Может, и тупой вариант, но рабочий :)
    А почему нельзя просто импортировать любую функцию из кернела, например? На пару байт увеличится размер. Делов-то..

    З.Ы. Под вистой действительно нужны импорты..
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Какой язык? В VC можно через #pragma comment(lib, "kernel32.lib"). В масме - includelib.
     
  5. keksn

    keksn New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    5
    IceStudent
    Спасибо. Слинковалось, но пропали старые импорты(которые не мои, а уже были). Буду думать.
    Такое впечатление, что VB'шные объектники не совместимы с чем-либо ещё.
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    IceStudent
    Извините но не совсем так:)
    Импорт так не добавляется а добаляется метка туда на имя либы.
    Это чтобы в параметрах линкера их не указывать.
    А без библиотек импорта даже с этими директивами он не собирается:)
    Мы просто наверно поразному истолкавали его весёлый вопрос;)
     
  7. keksn

    keksn New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    5
    Ладно, у меня в принципе DLL(пишу свою точку входа для VB-шных) и база есть изначально. Найду через таблицу импорта адрес внутри msvbvm60.dll(она всегда есть, ибо это местный рантайм), потом её базу и соответственно таблицу импорта. А там уже валяются ссылки на GetModuleHandle и GetProcAddress.
    Хотелось бы, конечно, чтобы был нормальный импорт, но похоже средств для его создания нет. А документация по секции COFF-объектников '.idata' довольно-таки скупа - так бы я её руками фасмом смастерил.
     
  8. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    Здравствуйте. Пишу я небольшую программку без импорта. Поиск функций идет по хешам. На XP все работает (все функции загружаются), но на семерке возникает проблема - функции из kernel32 загружаются нормально, а из user32 - нет. После анализа ощибки выяснилось что проблема в том что в kernel32 OrdinalBase = 1, а в user32 = 0x5DC и в результате неправильно вычисляются смещения в таблице адресов. Алгоритм вычисления адресов у меня используется такой же как описано в Microsoft Portable Executable and Common Object File Format Specification r.6.0. В чем может быть проблема, подскажите. Почему Ordinal Base слишком большой, хотя при просмотре экспорта ординалы начинаются с 2 у user32?
     
  9. pr0mix

    pr0mix New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    107
    привет, посмотри тут http://wasm.ru/forum/viewtopic.php?id=35032&p=1
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alexey
    Смотря чем просматриваете. Документация на тему ординалов неоднозначна и даже содержит ошибки, поэтому некоторые утилиты показывают индекс в таблице адресов в качестве ординала, а некоторые сумму этого индекса с Ordinal Base.
    В случае поиска функций по имени/хешу поле OrdinalBase не входит в рассчёт и учитываться не должно (несмотря на то, что в документации написано обратное).
     
  11. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    PEiD'ом
    т.е. принимать Ordinal Base за 1 ?
    Вот что PEiD показывает:
    [​IMG] [​IMG]
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alexey
    Возьмите что-нибудь по-новее. PEiD ещё и кучу ошибок при разборе экспорта делает. Возьмите PE Editor из PE Tools или CFF Explorer или PE Explorer.
    Нет. Находите индекс в массиве адресов имён. По этому индексу в массиве ординалов берёте индекс в таблице адресов. Ordinal Base не брать и ни за что не принимать.
     
  13. Igneele

    Igneele New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    17
    Спасибо. Сейчас попробую ...

    PS. Открыл user32.dll в PEeditor'e в PE Tools. Поля Export Directory он показывает также как и PEiD, а вот ординалы функций показывает не с 2-х как PEiD, а с 1500 (т.е. 0x5DC) , т.е. с базы. И в правду PEiD что-то врет ..
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Alexey
    Я ведь написал, что здесь как раз можно сослаться на двусмысленность документации. PEiD в качестве ординалов показывает индексы в массиве адресов. С другой стороны он может точно так же неверно отображать эти индексы, а также адреса и смещения функций.