Вызов метода из другого прилодения.

Тема в разделе "WASM.BEGINNERS", создана пользователем Derec, 7 янв 2011.

  1. Derec

    Derec New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    10
    Доброго времени суток всем! Мой первый пост на этом форуме - просьба о помощи. Знаю здесь много умных людей, которые точно знают ответ.

    Вообщем чужое приложение подгружает некоторую библиотеку (greb.dll). Из этой dll приложение вызывает метод (CreateMessageBox) некоторого класса (CUIManager). То есть dll экспортирует CUIManager::CreateMessageBox метод. Можно ли не имея заголовочных файлов, и исходников вообще вызвать этот метод из приложения программно? Заранее спасибо тем, кто поделится знаниями.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    найти метод по таблице импорта dll... смотри LoadLibrary + GetProcAddress...
     
  3. Derec

    Derec New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    10
    Имеется ввиду найти адрес в таблице импорта dll? Адрес я знаю, но как организовать вызов этого метода? Я не очень в ассемблере.
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    а он тут не нужен. Создай поток в приложении, при необходимости скопируй туда свою функцию которая будет вызывать метод, инфы в гугле лопатой не перелопатить.
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вот пример на си++:
    Код (Text):
    1. typedef int (__stdcall* PFunc)(int param1, int param2);
    2. PFunc pFunc = GetProcAddress(hMod, "Func");
    3. int res = pFunc(100, 200);
    соответственно для этого, нужно знать конвенкцию вызова и какие параметры функция принимает... в примере функция принимает два параметра int, возвращает int и является stdcall-функцией...
     
  6. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Что-то мне подсказывает, что аффтару темы нужно не просто "вызвать функцию из библиотеки", а предварительно раздобыть где-то экземпляр класса, методом которого является этот CUIManager::CreateMessageBox, и в этом главный затык. Ну и экспортируемое имя почти наверняка заманглено в кал (но это проблема легко решаемая, найти в hex-редакторе соответствующую ASCIIZ-строку, скопировать в Буфер обмена и подать в виде второго параметра для GetProcAddress). А вот где взять экземпляр класса - вопрос интересный и в общем случае без отладчика/дизассемблера не решаемый. Разве что найдётся глобальный экземпляр, да ещё и с экспортируемым вовне адресом (ну или хотя бы ссылкой на него), но это совсем уже чудо.
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    CyberManiac
    можно перехватить метод класса и оттуда вырвать указатель.
     
  8. Derec

    Derec New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    10
    CyberManiac, Вы правильно поняли!!! Загвозда именно в этом. Если отойти от практики и посмотреть на теорию. Допустим у меня есть экземпляр класса, какие действия далее?
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Далее нужно будет пошаманить с определением конвенции вызова, т.к. общих правил вызова методов нет. Поэтому, если не известно на чем писана сия библа, то опять же придется лезть в дизасм и смотреть откуда берется первый параметр this - из регистра или из стека, и откуда последующие
     
  10. Derec

    Derec New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    10
    Либа написана на C++, это тоже известно. А я вот мельком читал про делигаты в C#. Кто-нибудь в курсе про них, есть смысл их использовать? Блин, значит это полный геморрой...
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    значит из регистра))) вообще по мангленному имени вроде как то можно было определять параметры и конвенцию вызова...
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Шутник :) Глянь чтоль в википедию, чтобы понять, что порядок передачи параметров даже при thiscall может быть совершенно разный, например у MSVC и gcc, не говоря о борланде
     
  13. Derec

    Derec New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    10
    Ладно, благодаря постам я понял, что мне это не подсилу, слишком много нюансов.

    А скажите еще, вот если приложение запущено, и я знаю адрес, ко которому происходит вызов метода. Можно ли как-нибудь "перенаправить" вызов, чтобы как бы приложение его само запустило, но с моей помощью. Или это все тот же геморрой с конвенцией? :dntknw:
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Derec
    Нет, если адрес знаешь, можешь его просплайсить на свой переходник (то перенаправление о котором ты говоришь), что нибудь в нем сделать, а потом вернуть управление обратно в метод предварительно его вызвав (если надо).
     
  15. Derec

    Derec New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2011
    Сообщения:
    10
    А с этого момента можно подробнее? На сколько это сложно? Если не трудно...
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia