-
-
关于64位下的inlin hook
-
发表于:
2014-8-6 16:40
8128
-
最近因为项目的需要,修改代码向64位支持,涉及到在64位下的inline hook,捣鼓过程中,
实在蛋痛的不得了
...问题的原因是挂钩调用完我的代理函数后,如何在不修改寄存器的情况
下返回原始挂钩后的代码...像push xxxx retn 已经不好使了...现把我的hook 代码贴一下,求
解决方法
sub rsp,0x400
push rsi
push rdi
push rdx
push rax
push rbx
push rcx
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
lea rax,[rsp+0x478]
push rax
mov rax,rsp
push rax // 保存寄存器表
mov rax,0x12345678 // 代理函数
call rax
add esp,0x08 // 64 不支持stdcall了,必须自己平衡下堆栈
pop rax // 以下还原挂钩前各个寄存器原始的数据
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rcx
pop rbx
pop rax
pop rdx
pop rdi
pop rsi
add esp,0x400
//
// 执行挂钩后的原始代码,这里省略
// 。。。。
////////////////////// 这里要返回原来的程序代码 ////////////////////////
// 在 32 位下 :
push xxxx
retn
// 就可以了,现在蛋疼的问题就在这里了,如果用
mov rax,xxxx
jmp rax
// 这样的就破坏了原始的数据..这样有违我的初衷
// 求解决
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!