首页
社区
课程
招聘
[求助][原创]Hook 遇到的问题希望高手给予讲解
发表于: 2013-6-13 16:45 5247

[求助][原创]Hook 遇到的问题希望高手给予讲解

2013-6-13 16:45
5247
我HOOK 进入自己函数
[LEFT]
void _stdcall GetArrayHeadAddress()
{
	__asm
	{
                mov eax,[esi+0x32c] 
                mov RoleESI,esi 
		mov eax,RoleAddress
		add eax,6
                //jmp 跳转地址 后就报错程序就崩溃掉了 是堆栈没有平衡吗
		jmp eax
	}
}
[/LEFT]

mov eax,[esi+0x32c]  这个是我要HOOK 的 地址代码 这里我把是实现了一下

Hook mov eax,[esi+0x32c] 这句后进入我自己的函数 执行完后JMP 到 test eax,eax 这句
让他 继续执行他自己的代码
----------------------------------------------------------------------------------------
这是HOOK 前的代码
push esi
mov esi,ecx
mov eax,[esi+0000032C]
test eax,eax
push edi
mov edi,[esp+10]
-----------------------------------------------------------------------------------------

不知道我这样阐述 问题 高手可否看得懂

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你应该用__declspec (naked)修饰你的函数
还有你不应该用eax寄存器,因为下面test eax,eax
2013-6-13 16:56
0
雪    币: 496
活跃值: (311)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
3
原函数是thiscall类型
你写的hook函数是stdcall类型
原函数第二条指令吧this指针的值保存在esi中,这一步你没做,

写hook函数如果实在不知道怎么写,就写naked函数,然后把原函数前面的指令抄过来


declspec(naked) void _stdcall GetArrayHeadAddress()
{
__asm
{
push esi
move esi, ecx
mov eax,[esi+0x32c]
mov RoleESI,esi
mov eax,RoleAddress
add eax,6
//jmp 跳转地址 后就报错程序就崩溃掉了 是堆栈没有平衡吗
jmp eax
}
}

2013-6-13 17:04
0
雪    币: 133
活跃值: (593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢楼上2位 我先试试
2013-6-13 17:06
0
雪    币: 133
活跃值: (593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
_declspec (naked) void _stdcall GetArrayHeadAddress()
{
        __asm
        {
                push esi
                mov  esi, ecx
        mov  eax,[esi+0x32c]
        mov  RoleESI,esi
                mov  ebx,RoleAddress
                add  ebx,6
                jmp  ebx
        }
}
函数改成上面的 还是不行 HOOK 经过 进行JMP 跳转 程序崩溃 提示eip<XXXXXXXX>
2013-6-13 17:25
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
大概可能就是这样。。

__declspec (naked) void GetArrayHeadAddress()
{
  __asm
  {
        pushad
        pushfd
        push esi
        mov  esi, ecx
        mov  eax,[esi+0x32c]
        mov  RoleESI,esi
        mov  ebx,RoleAddress
        add  ebx,6
        push ebx
        pop 全局变量
        popfd
        popad
        jmp 全局变量
  }
}
2013-6-13 17:34
0
雪    币: 199
活跃值: (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
RoleAddress 你确定你这里面的函数写的没问题?
2013-6-13 17:36
0
雪    币: 133
活跃值: (593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
找到原因了 是计算地址的是后出现差异
mov  ebx,RoleAddress
add  ebx,6
ebx 在调试器里面查看是错的 并不是真正却结果地址 是什么原因了
2013-6-13 18:10
0
雪    币: 133
活跃值: (593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
变成了 自己函数地址
2013-6-13 18:49
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=vresn;1187933]我HOOK 进入自己函数
void _stdcall GetArrayHeadAddress()
{
        __asm
        {
                mov eax,[esi+0x32c]
                mov RoleESI,esi
                mov eax,Ro...[/QUOTE]

函数一经调用 ESI的值已经不能确定,只能为调用者所用,哪有你这样写 void _stdcall GetArrayHeadAddress()函数的啊!  没有给ESI初始一个值,你怎么知道调用GetArrayHeadAddress()函数的主人把ESI设置成什么值了?
2013-6-15 14:58
0
游客
登录 | 注册 方可回帖
返回