通用 Thunk
http://tech.ddvip.com 2008年05月25日 社区交流
内容摘要:这篇文章提出了一种基于Thunk技术,让一个成员函数成为一个回调函数的通用方法。文章主要讨论原理,同时也提供了一份实现和示例。
2、然后,弹出返回地址(返回到调用者的地址),并将其保存到old_return 中,
3、在ECX中准备好this指针。
4、调用成员函数(我们弹出调用者的返回地址,而CALL指令会压入一个新的返回地址——栈现在适合被调用者。被调用者将返回到thunk 代码的剩下部分。)
5、恢复ESP和返回地址,然后返回调用者
优化
sizeof(ThisToCdecl)==36 , 我认为这是不可接受的。
如果我们使用PUSH old_return 来代替 MOV DWORD PTR[ESP],old_return,可以节省2字节(因此,我们必须在保存old_esp之前弹栈),于此同时,也增加了一个额外的堆栈操作。(见 ThisToCdecl 34.h)
在这种情况下,相对于时间上的优化,我更加倾向空间上的优化。所以第3个实现如下:
我们可以使用一个叫做Hook的函数来准备this指针,保存old_esp和返回地址,设置被调用者的返回地址,然后跳转到被调用者。这样,thunk对象将包含更少的指令,而变的更小。(23字节)ThisToCdecl.h这些机器码首先调用“Hook”函数,这个函数做如下工作:
#define THIS_TO_CDECL_CODES()
/* CALL Hook */
CONST CODE_FIRST(byte,CALL,0xE8)
CONST CODE(dword,HOOK,0)
/* this and member function */
CODE(dword,m_memFunc,0)
CODE(dword_ptr,m_this,0)
/* member function return here! */
/* MOV ESP,oldESP */
CONST CODE(byte,MOV_ESP,0xBC)
CONST CODE(dword,oldESP,0)
/* JMP oldRet */
CONST CODE(byte,JMP,0xE9)
CONST CODE(dword,oldRet,0)
来源:vckbase 作者:OwnWaterloo 责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……