Вызов функций из DLL'ок

Тема в разделе "WASM.RESEARCH", создана пользователем Guff, 31 мар 2006.

  1. Guff

    Guff New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    3
    Адрес:
    USA
    Привет, ассемблер начал изучать совсем недавно и вопросец вот такой появился, нужно мне вызвать функцию из уже скомпиленной DLL и принять возвращаемые ею значения. Посмотрел на EXEшник через IDA и выяснил названия функций, какие-нить идеи? Не хоцца колесо изобретать.
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В MSDN смотрите описание функций LoadLibrary и GetProcAddress
     
  3. Guff

    Guff New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    3
    Адрес:
    USA
    Спасибо за ответ, вот ещё вопрос чисто теоритический, а что, если функция находится в исполняемом файле (PE).
     
  4. Bozar

    Bozar New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    24
    ну дЫк программа же и состоит из функций(обычно). Хотя если PE файл содержит експорт, почему бы нет.
     
  5. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Для того чтобы вызвать функцию из другого модуля(DLL или EXE), фукция должна быть экспортирована. GetProcAddress по экспорту находит адрес нужной функции.
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Вот тебе пример, я его на форуме приводил



    int DISX86Create()

    {

    hModule = LoadLibrary("Msdis110.dll");

    if (!hModule) return 0;

    PdisNew = (DWORD* (__stdcall*)(int))GetProcAddress(hModule, "?PdisNew@DIS@@SGPAV1@W4DIST@1@@Z");

    CchFormatInstr = (DWORD (_stdcall*)(char*, DWORD))GetProcAddress(hModule, "?CchFormatInstr@DIS@@QBEIPADI@Z");

    CchFormatAddr = (DWORD (_stdcall*)(unsigned __int64, char*, DWORD))GetProcAddress(hModule, "?CchFormatAddr@DIS@@QBEI_KPADI@Z");

    Dist = (DWORD (_stdcall*)())GetProcAddress(hModule, "?Dist@DIS@@QBE?AW4DIST@1@XZ");

    DIS = PdisNew(1);

    return 1;

    }
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Ясен пень, что все эти экзотические имена экпортируются из Msdis110.dll
     
  8. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    crypto

    А все эти экзотические имена говорят о передаваемых параметрах и возвращаемом значении для функций. Такие имена функций называются декорированными. Если экспорт происходит в стиле C++, где используется полиморфизм в объектном смысле, то линкер декоририрует имена функций. А это делается для того чтобы различать функции с одинаковыми именами, но разными наборами параметров.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Bill_Prisoner

    Угу.
    Код (Text):
    1. Undecoration of :- "?PdisNew@DIS@@SGPAV1@W4DIST@1@@Z"
    2. is :- "public: static class DIS * __stdcall DIS::PdisNew(enum DIS::DIST)"
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Я пример приводил. А про декорирование знаю.
     
  11. Quantum

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

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



    Динамическая библиотека (DLL) тоже является PE. Если Вы имеете в виду экзешник (*.exe) без таблицы экспорта, то можно попробовать загрузить его через LoadLibraryEx, вычислить адрес нужной функции (оффсет в IDA + базовый адрес) и вызвать её прямо по адресу:
    Код (Text):
    1. mov eax,ida_offset
    2. add eax,addr_base
    3. call eax




    Или попробовать "выдрать" нужную функцию из экзешника, если у неё зависимости в пределах разумного.



    Ещё можно попробовать ручками создать таблицу экспорта. Утилит для этого я не знаю, а в хекс-редакторе возиться долго, но всё равно вариант :)
     
  12. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Не, ну это полная фигня - вызывать не экспортируемые функции. Это уж надо точно знать, что она выполняет, какими данными пользуется, как инициализируется и массу других вещей. Вызывать без инициализации низя. А вот с экпортируемыми - все тип-топ, для них все это предусмотрено разработчиками.
     
  13. Guff

    Guff New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    3
    Адрес:
    USA
    crypto, В данном случае не суть важно в чём колдунство функции заключается, она параметров не принимает, интересуют только два возвращаемых параметра.



    Ещё можно попробовать ручками создать таблицу экспорта. Утилит для этого я не знаю, а в хекс-редакторе возиться долго, но всё равно вариант :)



    Проект потенциально очень прибыльный, посему и ручками повозиться не в лом было бы =)



    Quantum, crypto, огромное спасибо за советы, очень помогли.
     
  14. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Ну, если есть уверенность в ее использовании, то почему бы не взять ее ассемблерное тело и не погрузить в лоно твоей программы.

    (блин, как сказал!)