Привет, ассемблер начал изучать совсем недавно и вопросец вот такой появился, нужно мне вызвать функцию из уже скомпиленной DLL и принять возвращаемые ею значения. Посмотрел на EXEшник через IDA и выяснил названия функций, какие-нить идеи? Не хоцца колесо изобретать.
Спасибо за ответ, вот ещё вопрос чисто теоритический, а что, если функция находится в исполняемом файле (PE).
Для того чтобы вызвать функцию из другого модуля(DLL или EXE), фукция должна быть экспортирована. GetProcAddress по экспорту находит адрес нужной функции.
Вот тебе пример, я его на форуме приводил 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; }
crypto А все эти экзотические имена говорят о передаваемых параметрах и возвращаемом значении для функций. Такие имена функций называются декорированными. Если экспорт происходит в стиле C++, где используется полиморфизм в объектном смысле, то линкер декоририрует имена функций. А это делается для того чтобы различать функции с одинаковыми именами, но разными наборами параметров.
Bill_Prisoner Угу. Код (Text): Undecoration of :- "?PdisNew@DIS@@SGPAV1@W4DIST@1@@Z" is :- "public: static class DIS * __stdcall DIS::PdisNew(enum DIS::DIST)"
Guff Динамическая библиотека (DLL) тоже является PE. Если Вы имеете в виду экзешник (*.exe) без таблицы экспорта, то можно попробовать загрузить его через LoadLibraryEx, вычислить адрес нужной функции (оффсет в IDA + базовый адрес) и вызвать её прямо по адресу: Код (Text): mov eax,ida_offset add eax,addr_base call eax Или попробовать "выдрать" нужную функцию из экзешника, если у неё зависимости в пределах разумного. Ещё можно попробовать ручками создать таблицу экспорта. Утилит для этого я не знаю, а в хекс-редакторе возиться долго, но всё равно вариант
Не, ну это полная фигня - вызывать не экспортируемые функции. Это уж надо точно знать, что она выполняет, какими данными пользуется, как инициализируется и массу других вещей. Вызывать без инициализации низя. А вот с экпортируемыми - все тип-топ, для них все это предусмотрено разработчиками.
crypto, В данном случае не суть важно в чём колдунство функции заключается, она параметров не принимает, интересуют только два возвращаемых параметра. Ещё можно попробовать ручками создать таблицу экспорта. Утилит для этого я не знаю, а в хекс-редакторе возиться долго, но всё равно вариант Проект потенциально очень прибыльный, посему и ручками повозиться не в лом было бы =) Quantum, crypto, огромное спасибо за советы, очень помогли.
Ну, если есть уверенность в ее использовании, то почему бы не взять ее ассемблерное тело и не погрузить в лоно твоей программы. (блин, как сказал!)