关闭

逆向分析一个完整的C++程序包含寄存器与参数传递详解

发表于:2013-4-16 09:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:SolidMango    来源:51Testing软件测试网采编

  最近在分析C++ dump 文件的时候觉得有必要将一些必要的反汇编东西总结一下以备别人参考,自己有时间的时候也可以进行更多的改进。下面通过一个简单的C++代码转成汇编代码后的详细解释说明一下C++和汇编的对应关系,以及如何识别汇编代码中进行的一些操作的意义。代码的调用关系如下图所示:

  完整C++代码下:

int InternalFunctionA(int nSizeA1, int nSizeA2)
{
    int localnSizeA1 = nSizeA1;
    int localnSizeA2 = nSizeA2;

    int nFunctionA = localnSizeA1 + localnSizeA2;

    return nFunctionA;
}

int InternalFunctionB(int nSizeB1, int nSizeB2)
{

    int nFunctionA = InternalFunctionA(nSizeB1, nSizeB2);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
   
    int nFunctionVal = InternalFunctionB(36, 64);
    cout<<"Hello SolidMango!"<<endl;
    return 0;

}

  那么这段简单的C++代码在转换成汇编代码之后是什么样子的呢?让我们拭目以待,首先让我们看看main函数转换后的代码(debug版), 如下,我们逐条来进行分析,

int _tmain(int argc, _TCHAR* argv[])
{
  push        ebp  //栈底压栈
  mov         ebp,esp //栈底下移,更详细的请参考我关于ebp,esp的解释
  sub         esp,0CCh //局部变量预留空间
  push        ebx  //保存ebx 
A  push        esi  //保存esi 
B  push        edi  //保存edi 
C  lea         edi,[ebp-0CCh] //下移edi到栈顶
  mov         ecx,33h //0CCh/4 = 33h
  mov         eax,0CCCCCCCCh //eax赋值
C  rep stos    dword ptr es:[edi] //从edi开始做33h次赋值0CCCCCCCCh ,初始化栈内存
   
    int nFunctionVal = InternalFunctionB(36, 64);
E  push        40h  //参数64入栈,
  push        24h  //参数36入栈
  call        InternalFunctionB (41101Eh) );//到41101Eh处函数调用
  add         esp,8 //函数调用后将参数弹出,清理栈
A  mov         dword ptr [nFunctionVal],eax
    cout<<"Hello SolidMango!"<<endl;
D  mov         esi,esp
F  mov         eax,dword ptr [__imp_std::endl (41A338h)]
A4  push        eax 
A5  push        offset string "Hello SolidMango!" (417800h)
AA  mov         ecx,dword ptr [__imp_std::cout (41A33Ch)]
B0  push        ecx 
B1  call        std::operator<<<std::char_traits<char> > (411163h)
B6  add         esp,8
B9  mov         ecx,eax
BB  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A320h)]
C1  cmp         esi,esp
C3  call        @ILT+430(__RTC_CheckEsp) (4111B3h)
    return 0;
C8  xor         eax,eax

}
CA  pop         edi  //恢复edi
CB  pop         esi  //恢复esi
CC  pop         ebx  //恢复ebx
CD  add         esp,0CCh //栈顶上移
D3  cmp         ebp,esp //检查栈平衡
D5  call        @ILT+430(__RTC_CheckEsp) (4111B3h)
DA  mov         esp,ebp //恢复上一个栈帧的ebp,esp
DC  pop         ebp 
DD  ret//函数返回

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号