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

通用Thunk

 2010-07-15 20:45:23 来源:WEB开发网   
核心提示:3、当被调用者返回它使用 RET N !所以,我们的工作如下:在调用成员函数之前,通用Thunk(9),将this指针放入ECX在成员函数返回后,将ESP设置成一个正确的值返回到调用者,而CALL指令会压入一个新的返回地址——栈现在适合被调用者,被调用者将返回到thunk 代码的剩下部分,所以,

3、当被调用者返回

它使用 RET N !

所以,我们的工作如下:

在调用成员函数之前,将this指针放入ECX

在成员函数返回后,将ESP设置成一个正确的值

返回到调用者。所以,这个正确的值应该是当调用者执行完ADD ESP,N之后,ESP刚好是被调用者调用前的值。

因为参数数量×4不总是等于N,所以我们不能使用SUB ESP,N来设置ESP(比如参数列表含有double)

我们也不能修改返回地址,使它跨过“ADD ESP,N”的指令,因为这条指令并不总是紧接着CALL指令(调用caller 的CALL指令)

(比如 返回类型是double的情况)

一个可能的实现是在某个地方保存ESP,在被调用者返回后将它传送回ESP。

让我们来看看第1个实现:

ThisToCdecl 36.h
#define __THIS_TO__CDECL_CODES()
/*  MOV DWORD PTR [old_esp],ESP  */
CONST  CODE_FIRST(word,MOV_ESP_TO,0x2589)
CONST  CODE(dword_ptr,pold_esp,&old_esp)

/*  POP  ECX  */
CONST  CODE(byte,POP_ECX,0x59)

/*  MOV DWORD PTR [old_return],ECX  */
CONST  CODE(word,MOV_POLD_R,0x0D89)
CONST  CODE(dword_ptr,p_old_return,&old_return)

/*  MOV ECX,this  */
CONST  CODE(byte,MOV_ECX,0xB9)
    CODE(dword_ptr,m_this,0)

/*  CALL memFunc  */
CONST  CODE(byte,CALL,0xE8)
    CODE(dword,m_memFunc,0)

/*  MOV ESP,old_esp  */
CONST  CODE(byte,MOV_ESP,0xBC)
CONST  CODE(dword,old_esp,0)
/*  MOV DWORD PTR [ESP],old_retrun  */
CONST  CODE(word,MOV_P,0x04C7)
CONST  CODE(byte,_ESP,0x24)
CONST  CODE(dword,old_return,0)
/*  RET  */
CONST  CODE(byte,RET,0xC3)
1、我们将ESP保存到old_esp中。

2、然后,弹出返回地址(返回到调用者的地址),并将其保存到old_return 中,

3、在ECX中准备好this指针。

4、调用成员函数(我们弹出调用者的返回地址,而CALL指令会压入一个新的返回地址——栈现在适合被调用者。被调用者将返回到thunk 代码的剩下部分。)

5、恢复ESP和返回地址,然后返回调用者

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

Tags:通用 Thunk

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接