首页
社区
课程
招聘
[分享]gcc regparm特性,也即hook用eax, edx, ecx传递参数的函数
发表于: 2013-9-4 09:39 7305

[分享]gcc regparm特性,也即hook用eax, edx, ecx传递参数的函数

2013-9-4 09:39
7305
之前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可能需要的依赖。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 183
活跃值: (1058)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
__fastcall 不就是通过寄存器传参的?
2013-9-4 10:06
0
雪    币: 3330
活跃值: (1662)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
3
你可以试试,__fastcall只使用了ecx,edx两个,超过两个参数的仍然用push。
2013-9-4 10:52
0
雪    币: 80
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
msvc跟gcc的__fastcall使用的寄存器也是不同的。
2013-9-4 11:50
0
游客
登录 | 注册 方可回帖
返回
//