-
-
[分享]gcc regparm特性,也即hook用eax, edx, ecx传递参数的函数
-
-
[分享]gcc regparm特性,也即hook用eax, edx, ecx传递参数的函数
之前hook一个mingw编译的程序遇到了,觉得多少有点用,发上来分享
问题:用IDA F5某函数,函数声明为void *__usercall sub_1015FF5<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4)
假设我们要hook该函数,而且该函数的参数a1,a2,a3,a4都是我们所关心的,咋办?
解答:F5已经给了提示,a1是通过eax传递的,a2是通过edx传递的,a3是通过ecx传递的,如果你用vc的话,必定会是如__declspec(naked)之类的,并且还需要写asm代码。
我发现该程序是mingw编译后,网上google了一翻,发现gcc有个regparm扩展,编译出来的函数用IDA逆向就是上面那样的,代码如下:
void __attribute__((regparm(3))) hook_xxx(int a1, int a2, int a3, int a4)
{
...
}
这样就安全不需要写asm code
而为什么a4不通过寄存器传值呢?按regparm的定义就知道了:
GCC中可以使用__attribute__((regparm(n)))指定最多可以使用n个寄存器(eax, edx, ecx)传递参数,n的范围是0~3,超过n时则将参数压入栈中(n=0表示不用寄存器传递参数)。
而一般人都是只用msvc的,这好办,你可以把hook代码写入单独的cpp中,然后用gcc -c xx.cpp -o xx.obj,然后用vc直接链接这个xx.obj即可,当然你要注意符号名(最好用extern "C")以及编译xx.cpp可能需要的依赖。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课