Microsoft Research Detours QT

Тема в разделе "WASM.WIN32", создана пользователем jakimushka, 8 окт 2009.

  1. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    Подскажите как перхватить функцию QAbstractListModel::qt_metacall.
    я пробую так:

    Код (Text):
    1. int (__thiscall *Real_metacall)(QMetaObject::Call call, int id, void **arguments) = &QAbstractListModel::qt_metacall;
    2. int mine_metacall(QMetaObject::Call call, int id,
    3.                         void **arguments)
    4. {
    5.     _PrintEnter("metacall(%d))\n", call);
    6. }
    7.  
    8. ATTACH(&(PVOID&)Real_metacall, Mine_metacall);
    получаю ошибку:
    Ошибка 2 error C2440: =: невозможно преобразовать 'int (__thiscall QAbstractListModel::* )(QMetaObject::Call,int,void **)' в 'int (__thiscall *)(QMetaObject::Call,int,void **)' d:\Detours\APIHookingComplete\DetourByAddr\DetourByAddr.cpp 173 DetourByAddr

    то есть когда ручками, вроде как можно сделать
    Код (Text):
    1.  Mine_metacall( QAbstractListModel *pThis, QMetaObject::Call p1, int p2, void ** p3)
    2. {
    3.  
    4. }
    5. __declspec(naked) POKERHOOKER_API int __stdcall qt_metacall_hook( enum Call, int, void ** )
    6. {   __asm
    7.     {
    8.         pop eax
    9.         push ecx
    10.         push eax
    11.         jmp Mine_metacall
    12.     }
    13. }
    а как делать с microsoft detours?
     
  2. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    O, вопрос получается сводится к тому как использовать microsoft research detours для перехвата функций с соглашением __thiscall?
     
  3. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    Получилось так:
    Код (Text):
    1. class CAbstractListModel:public QAbstractListModel
    2. {
    3.   public:
    4.     int Mine_metacall(QMetaObject::Call call, int id,
    5.                         void **arguments);
    6.     static int (CAbstractListModel::* Real_metacall)(QMetaObject::Call call, int id,
    7.                         void **arguments);
    8. };
    9.  
    10.  
    11. int  CAbstractListModel::Mine_metacall(QMetaObject::Call call, int id,
    12.                         void **arguments)
    13. {
    14.     _PrintEnter("CAbstractListModel::Mine_metacall");
    15.     return (this->*Real_metacall)(call, id, arguments);
    16. }
    17.  
    18. int  (CAbstractListModel::* CAbstractListModel::Real_metacall)(QMetaObject::Call call, int id, void **arguments) =
    19. (int (CAbstractListModel::*)(QMetaObject::Call call, int id, void **arguments))&QAbstractListModel::qt_metacall;
    20.  
    21. DetourAttach(&(PVOID&)CAbstractListModel::Real_metacall,
    22.                  (PVOID)(&(PVOID&)CAbstractListModel::Mine_metacall));
    компилируется и работает, но не перехватывает. в чем может быть дело?
     
  4. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    жесть, забаньте меня еще раз (
     
  5. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    попробовал вариант
    Код (Text):
    1. int ( _cdecl *Real_metacall)(QAbstractListModel *pthis,QMetaObject::Call call, int id, void **arguments) =  (int (_cdecl *)(QAbstractListModel *pthis,QMetaObject::Call call, int id, void **arguments))DetourFindFunction("C:\\Program Files\\Full Tilt Poker\\QtCore4.dll", "?qt_metacall@QAbstractListModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z");
    он работает и
    Код (Text):
    1. int Mine_metacall(QAbstractListModel *pthis,QMetaObject::Call call, int id,
    2.                         void **arguments)
    3. {
    4.     Syelog(SYELOG_SEVERITY_NOTICE,"CAbstractListModel::Mine_metacall");
    5.     return Real_metacall(pthis,call, id, arguments);
    6. }
    этот код печатает строку при вызове функции и все идет неплохо, но когда пробуем использовать аргумент функции, например
    Код (Text):
    1. int Mine_metacall(QAbstractListModel *pthis,QMetaObject::Call call, int id,
    2.                         void **arguments)
    3. {
    4.     Syelog(SYELOG_SEVERITY_NOTICE,"CAbstractListModel::Mine_metacall %d",id);
    5.     return Real_metacall(pthis,call, id, arguments);
    6. }
    все дохнет