当前位置: 代码迷 >> 汇编语言 >> 函数钩子阻截_thiscall 函数参数
  详细解决方案

函数钩子阻截_thiscall 函数参数

热度:200   发布时间:2016-05-02 04:28:29.0
函数钩子拦截__thiscall 函数参数
我现在用函数钩子进行函数拦截,结果遇到这么一类函数(通过IDA f5插件反汇编得到的)
char __thiscall GetXX(void *this, int a2, signed int a3, int a4, int lpMem, int a6)
这类函数好像是类成员函数(我查的,也不知道准不准),自带一个this指针,现在问题就是:我想获取这类函数的参数,那么通过函数钩子进行拦截,我应该怎么定义指向这个函数的函数指针?
是 : typedef char( __stdcall *pf_GetXX)(void *this, int a2, signed int a3, int a4, int lpMem, int a6);
还是 : typedef char ( __stdcall *pf_GetXX)(int a2, signed int a3, int a4, int lpMem, int a6);
或者不用 __stdcall 还是其他等等。
希望有大神能告诉我应该怎样定义或者怎么使用,先谢谢啦
------解决思路----------------------
引用:
Quote: 引用:

用这一种
typedef char (__stdcall CHookedClass:: * pf_GetXX)(int a2, signed int a3, int a4, int lpMem, int a6 ); 

非常感谢您能回答我的问题,但是我并不知道CHookedClass这个类,那么我该怎么办?

如果没有类的定义,不需要定义函数指针原型,拦截类的函数,找到函数的定义地址可以了:
1> 类的成员函数(非虚函数),需要定位函数的位置,相对于模块加载位置的偏移
2>类的虚函数,搜索虚表

------解决思路----------------------
不用知道 CHookedClass 类的具体内容,定义成一个空类就可以。
或者也可以这样:
typedef char(__thiscall *pf_GetXX)(void *this, int a2, signed int a3, int a4, int lpMem, int a6);
使用 stdcall 的时候第一个参数是压栈的,用 thiscall 第一个参数是通过 ecx 传递的
------解决思路----------------------
引用:
Quote: 引用:

不用知道 CHookedClass 类的具体内容,定义成一个空类就可以。
或者也可以这样:
typedef char(__thiscall *pf_GetXX)(void *this, int a2, signed int a3, int a4, int lpMem, int a6);
使用 stdcall 的时候第一个参数是压栈的,用 thiscall 第一个参数是通过 ecx 传递的

这样定义是不可以的,因为 __thiscall 是没有定义的

在 VC 里面是定义了 __thiscall 的
https://msdn.microsoft.com/zh-cn/library/ek8tkfbw.aspx
------解决思路----------------------

------解决思路----------------------
如果不用 __thiscall 要用类来定义的话,下面这样结果和上面相同:


#include <stdio.h>

class A
{
};

typedef void (A::*func_t)();

__declspec(naked) void sayhello()
{
static int ecxval = 0;
__asm
{
push ebp;
mov ebp, esp;
mov ecxval, ecx;
}

printf("hello %d\n", ecxval);

__asm
{
mov esp, ebp;
pop ebp;
ret;
}
};

union ForceCast
{
func_t ft;
void*  fv;
};


int main ( )
{
ForceCast cst;
cst.fv = (void*)sayhello;
func_t x = cst.ft;

((A*)(10)->*x)();
((A*)(20)->*x)();
}