WEB开发网
开发学院软件开发VC 通用 Thunk 阅读

通用 Thunk

 2008-05-25 21:39:20 来源:WEB开发网   
核心提示: 2、然后,弹出返回地址(返回到调用者的地址),通用 Thunk(9),并将其保存到old_return 中,3、在ECX中准备好this指针,thunk对象将包含更少的指令,而变的更小,4、调用成员函数(我们弹出调用者的返回地址,而CALL指令会压入一个新的返回地址—&mdas

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
#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)
这些机器码首先调用“Hook”函数,这个函数做如下工作:

上一页  4 5 6 7 8 9 10  下一页

Tags:通用 Thunk

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接