通用 Thunk
2008-05-25 21:39:20 来源:WEB开发网1. 保存 the oldESP 和 oldRet。
2. 将被调用者的返回地址设置到 “member function return here!”。
3. 将ECX设置为this指针。
4. 跳转到成员函数
当成员函数返回后,剩下的thunk代码将修改ESP然后返回到调用者。
Hook函数被实现为:void __declspec( naked ) ThisToCdecl::Hook() {
我们使用 CALL offset(dword) 跳转到Hook,这个指令会将返回地址压栈。所以,CALL HOOK之后,堆栈如下 :
_asm {
POP EAX //1
// p=&m_memFunc; &m_this=p+4; &oldESP=p+9; &oldRet=p+14
// Save ESP
MOV DWORD PTR [EAX+9],ESP //3
ADD DWORD PTR [EAX+9],4 //4
// Save CallerReturn(by offset)
//src=&JMP=p+13,dst=CallerReturn,offset=CallerReturn-p-13-5
MOV ECX,DWORD PTR [ESP] //3
SUB ECX,EAX //2
SUB ECX,18 //3
MOV DWORD PTR [EAX+14],ECX //3
// Set CalleeReturn
MOV DWORD PTR [ESP],EAX //3
ADD DWORD PTR [ESP],8 //4
// Set m_this
MOV ECX,DWORD PTR [EAX+4] //3
// Jump to m_memFunc
JMP DWORD PTR[EAX ] //2
}
}
…
参数 m
参数m-1
…
参数1
调用者返回地址
Hook返回地址 <- ESP
更多精彩
赞助商链接