Доброго времени суток всем! Мой первый пост на этом форуме - просьба о помощи. Знаю здесь много умных людей, которые точно знают ответ. Вообщем чужое приложение подгружает некоторую библиотеку (greb.dll). Из этой dll приложение вызывает метод (CreateMessageBox) некоторого класса (CUIManager). То есть dll экспортирует CUIManager::CreateMessageBox метод. Можно ли не имея заголовочных файлов, и исходников вообще вызвать этот метод из приложения программно? Заранее спасибо тем, кто поделится знаниями.
Имеется ввиду найти адрес в таблице импорта dll? Адрес я знаю, но как организовать вызов этого метода? Я не очень в ассемблере.
а он тут не нужен. Создай поток в приложении, при необходимости скопируй туда свою функцию которая будет вызывать метод, инфы в гугле лопатой не перелопатить.
вот пример на си++: Код (Text): typedef int (__stdcall* PFunc)(int param1, int param2); PFunc pFunc = GetProcAddress(hMod, "Func"); int res = pFunc(100, 200); соответственно для этого, нужно знать конвенкцию вызова и какие параметры функция принимает... в примере функция принимает два параметра int, возвращает int и является stdcall-функцией...
Что-то мне подсказывает, что аффтару темы нужно не просто "вызвать функцию из библиотеки", а предварительно раздобыть где-то экземпляр класса, методом которого является этот CUIManager::CreateMessageBox, и в этом главный затык. Ну и экспортируемое имя почти наверняка заманглено в кал (но это проблема легко решаемая, найти в hex-редакторе соответствующую ASCIIZ-строку, скопировать в Буфер обмена и подать в виде второго параметра для GetProcAddress). А вот где взять экземпляр класса - вопрос интересный и в общем случае без отладчика/дизассемблера не решаемый. Разве что найдётся глобальный экземпляр, да ещё и с экспортируемым вовне адресом (ну или хотя бы ссылкой на него), но это совсем уже чудо.
CyberManiac, Вы правильно поняли!!! Загвозда именно в этом. Если отойти от практики и посмотреть на теорию. Допустим у меня есть экземпляр класса, какие действия далее?
Далее нужно будет пошаманить с определением конвенции вызова, т.к. общих правил вызова методов нет. Поэтому, если не известно на чем писана сия библа, то опять же придется лезть в дизасм и смотреть откуда берется первый параметр this - из регистра или из стека, и откуда последующие
Либа написана на C++, это тоже известно. А я вот мельком читал про делигаты в C#. Кто-нибудь в курсе про них, есть смысл их использовать? Блин, значит это полный геморрой...
значит из регистра))) вообще по мангленному имени вроде как то можно было определять параметры и конвенцию вызова...
Шутник Глянь чтоль в википедию, чтобы понять, что порядок передачи параметров даже при thiscall может быть совершенно разный, например у MSVC и gcc, не говоря о борланде
Ладно, благодаря постам я понял, что мне это не подсилу, слишком много нюансов. А скажите еще, вот если приложение запущено, и я знаю адрес, ко которому происходит вызов метода. Можно ли как-нибудь "перенаправить" вызов, чтобы как бы приложение его само запустило, но с моей помощью. Или это все тот же геморрой с конвенцией?
Derec Нет, если адрес знаешь, можешь его просплайсить на свой переходник (то перенаправление о котором ты говоришь), что нибудь в нем сделать, а потом вернуть управление обратно в метод предварительно его вызвав (если надо).