怀化北京网站建设,名城苏州网站,英文作文,樟树市城乡规划建设局网站反汇编分析C语言
空函数反汇编 #include stdafx.h//空函数
void function(){}int main(int argc, char* argv[])
{//调用空函数function();return 0;
}我们通过反汇编来分析这段空函数
函数外部 12: function();
00401048 call ILT5(func…反汇编分析C语言
空函数反汇编 #include stdafx.h//空函数
void function(){}int main(int argc, char* argv[])
{//调用空函数function();return 0;
}我们通过反汇编来分析这段空函数
函数外部 12: function();
00401048 call ILT5(function) (0040100a)
13: return 0;
0040104D xor eax,eax
14: }
0040104F pop edi
00401050 pop esi
00401051 pop ebx
00401052 add esp,40h
00401055 cmp ebp,esp
00401057 call __chkesp (004010e0)
0040105C mov esp,ebp
0040105E pop ebp
0040105F ret函数内部 6: void function(){
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
7:
8: }
00401028 pop edi
00401029 pop esi
0040102A pop ebx
0040102B mov esp,ebp
0040102D pop ebp
0040102E ret分析函数
函数调用
00401048 call ILT5(function) (0040100a)先就是通过call来调用我们的function函数
函数内部
接着进到函数的内部
有了之前画堆栈图的经验我们不难看出尽管我们的函数是个空函数但其汇编代码依然完成了以下流程
提升堆栈
保护现场
初始化提升的堆栈
恢复现场
返回提升堆栈
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h保护现场
00401016 push ebx
00401017 push esi
00401018 push ediPS前面的push ebp也是保护现场
初始化提升的堆栈
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]恢复现场
00401028 pop edi
00401029 pop esi
0040102A pop ebx
0040102B mov esp,ebp
0040102D pop ebpPS这里的mov esp,ebp就是降低堆栈与前面的提升堆栈相对应所以也属于恢复现场的一部分
返回
0040102E ret函数返回后 函数返回后不出意料地返回到了调用CALL地下一行语句我们接着看
0040104D xor eax,eax这里是将eax清零注意到我们的语句为return 0 这里就是将eax作为返回值来传递
一般来说eax都是作为函数的返回值但不绝对有的函数返回值是存在内存里或其它情况要具体情况具体分析
接着看下面的代码
0040104F pop edi
00401050 pop esi
00401051 pop ebx很明显这里是在还原现场别忘了我们的主程序main本身也是个函数这是在还原调用main前保护的现场
接着往下走
00401052 add esp,40h
00401055 cmp ebp,esp
00401057 call __chkesp (004010e0)这里首先是将esp减少了40h,然后比较ebp和esp最后再调用一个chkesp函数
从名称就不难看出chkesp check esp 检查esp这个函数就是用来检查堆栈是否平衡的
继续
0040105C mov esp,ebp
0040105E pop ebp依旧是恢复现场
最后就是返回
0040105F ret总结空函数分析
我们可以看到即便一个空函数什么都没有做但调用一个空函数所产生的汇编代码却不少
保护现场、恢复现场以及堆栈平衡的检查等等都没少可谓麻雀虽小五脏俱全
简单加法函数反汇编
有了前面分析空函数的经验我们再来分析分析一个简单的加法函数 #include stdafx.h
int Plus(int x,int y){return xy;
}int main(int argc, char* argv[])
{//调用加法函数Plus(1,2);return 0;
}函数外部 16: Plus(1,2);
004010A8 push 2
004010AA push 1
004010AC call ILT0(Plus) (00401005)
004010B1 add esp,8
17: return 0;
004010B4 xor eax,eax
18: }
004010B6 pop edi
004010B7 pop esi
004010B8 pop ebx
004010B9 add esp,40h
004010BC cmp ebp,esp
004010BE call __chkesp (004010e0)
004010C3 mov esp,ebp
004010C5 pop ebp
004010C6 ret函数内部 10: int Plus(int x,int y){
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,40h
00401066 push ebx
00401067 push esi
00401068 push edi
00401069 lea edi,[ebp-40h]
0040106C mov ecx,10h
00401071 mov eax,0CCCCCCCCh
00401076 rep stos dword ptr [edi]
11: return xy;
00401078 mov eax,dword ptr [ebp8]
0040107B add eax,dword ptr [ebp0Ch]
12: }
0040107E pop edi
0040107F pop esi
00401080 pop ebx
00401081 mov esp,ebp
00401083 pop ebp
00401084 ret分析函数 函数调用
004010A8 push 2
004010AA push 1
004010AC call ILT0(Plus) (00401005)结合前面的空函数分析我们可以明显发现这里的函数调用环节多了两个push
就是将函数所需的参数压入堆栈这里的参数为 2 和 1注意压入的顺序是反着的由调用协定决定下篇笔记会详细说明
函数内部 提升堆栈保护现场初始化
提升堆栈、保护现场、初始化部分和空函数如出一辙这里就不再赘述
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,40h
00401066 push ebx
00401067 push esi
00401068 push edi
00401069 lea edi,[ebp-40h]
0040106C mov ecx,10h
00401071 mov eax,0CCCCCCCCh
00401076 rep stos dword ptr [edi]实际执行
00401078 mov eax,dword ptr [ebp8]
0040107B add eax,dword ptr [ebp0Ch]这里的[ebp8]就是我们前面压入的参数1[ebpc]就是前面压入的参数2
于是这两条语句其实就是
00401078 mov eax,1
0040107B add eax,2将12的结果保存到eax中此时eax又作为函数返回值的载体
恢复现场和返回 接下来的内容就和空函数一样了恢复现场和返回也不再赘述
0040107E pop edi
0040107F pop esi
00401080 pop ebx
00401081 mov esp,ebp
00401083 pop ebp
00401084 ret函数返回后 004010B1 add esp,8
17: return 0;
004010B4 xor eax,eax
18: }
004010B6 pop edi
004010B7 pop esi
004010B8 pop ebx
004010B9 add esp,40h
004010BC cmp ebp,esp
004010BE call __chkesp (004010e0)
004010C3 mov esp,ebp
004010C5 pop ebp
004010C6 ret函数返回后我们会发现与先前的空函数相比多了这一行代码
004010B1 add esp,8这里是对应我们前面压入的两个参数1和2压入参数后esp减少了8这里我们函数调用结束后就不再需要之前压入的两个参数了于是将esp恢复到压入参数前这其实也算在恢复现场里用来平衡堆栈
我们可以发现这条语句是在我们call调用完毕返回后执行的平衡堆栈操作所以这种操作也被称为堆栈外平衡
与之相对就是堆栈内平衡即在call里面就把堆栈平衡好了 文章转载自: http://www.morning.nqnqz.cn.gov.cn.nqnqz.cn http://www.morning.rycd.cn.gov.cn.rycd.cn http://www.morning.ctbr.cn.gov.cn.ctbr.cn http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.rhkgz.cn.gov.cn.rhkgz.cn http://www.morning.kpgft.cn.gov.cn.kpgft.cn http://www.morning.qncqd.cn.gov.cn.qncqd.cn http://www.morning.ykgp.cn.gov.cn.ykgp.cn http://www.morning.hfbtt.cn.gov.cn.hfbtt.cn http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn http://www.morning.xmwdt.cn.gov.cn.xmwdt.cn http://www.morning.krnzm.cn.gov.cn.krnzm.cn http://www.morning.qwmpn.cn.gov.cn.qwmpn.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.qwdlj.cn.gov.cn.qwdlj.cn http://www.morning.ogzjf.cn.gov.cn.ogzjf.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.jlthz.cn.gov.cn.jlthz.cn http://www.morning.prjns.cn.gov.cn.prjns.cn http://www.morning.jjxnp.cn.gov.cn.jjxnp.cn http://www.morning.lqffg.cn.gov.cn.lqffg.cn http://www.morning.cgmzt.cn.gov.cn.cgmzt.cn http://www.morning.qswws.cn.gov.cn.qswws.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.pjtnk.cn.gov.cn.pjtnk.cn http://www.morning.xsymm.cn.gov.cn.xsymm.cn http://www.morning.lxlfr.cn.gov.cn.lxlfr.cn http://www.morning.jfmyt.cn.gov.cn.jfmyt.cn http://www.morning.jbmsp.cn.gov.cn.jbmsp.cn http://www.morning.tfqfm.cn.gov.cn.tfqfm.cn http://www.morning.bqwrn.cn.gov.cn.bqwrn.cn http://www.morning.yckrm.cn.gov.cn.yckrm.cn http://www.morning.kzdgz.cn.gov.cn.kzdgz.cn http://www.morning.bpmnz.cn.gov.cn.bpmnz.cn http://www.morning.eshixi.com.gov.cn.eshixi.com http://www.morning.hclplus.com.gov.cn.hclplus.com http://www.morning.rmfw.cn.gov.cn.rmfw.cn http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn http://www.morning.mqfhy.cn.gov.cn.mqfhy.cn http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.mqxzh.cn.gov.cn.mqxzh.cn http://www.morning.mtrrf.cn.gov.cn.mtrrf.cn http://www.morning.pdmml.cn.gov.cn.pdmml.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.ujianji.com.gov.cn.ujianji.com http://www.morning.zbjfq.cn.gov.cn.zbjfq.cn http://www.morning.fslrx.cn.gov.cn.fslrx.cn http://www.morning.tktyh.cn.gov.cn.tktyh.cn http://www.morning.rbkdg.cn.gov.cn.rbkdg.cn http://www.morning.qrwdg.cn.gov.cn.qrwdg.cn http://www.morning.wbrf.cn.gov.cn.wbrf.cn http://www.morning.sqtsl.cn.gov.cn.sqtsl.cn http://www.morning.mltsc.cn.gov.cn.mltsc.cn http://www.morning.kksjr.cn.gov.cn.kksjr.cn http://www.morning.flzqq.cn.gov.cn.flzqq.cn http://www.morning.srbmc.cn.gov.cn.srbmc.cn http://www.morning.yqqxj1.cn.gov.cn.yqqxj1.cn http://www.morning.bzwxr.cn.gov.cn.bzwxr.cn http://www.morning.wdskl.cn.gov.cn.wdskl.cn http://www.morning.ghslr.cn.gov.cn.ghslr.cn http://www.morning.kcrw.cn.gov.cn.kcrw.cn http://www.morning.mmqhq.cn.gov.cn.mmqhq.cn http://www.morning.fpzz1.cn.gov.cn.fpzz1.cn http://www.morning.qnywy.cn.gov.cn.qnywy.cn http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.ljllt.cn.gov.cn.ljllt.cn http://www.morning.mlbdr.cn.gov.cn.mlbdr.cn http://www.morning.dskzr.cn.gov.cn.dskzr.cn http://www.morning.pzrrq.cn.gov.cn.pzrrq.cn http://www.morning.ggtkk.cn.gov.cn.ggtkk.cn http://www.morning.ckntb.cn.gov.cn.ckntb.cn http://www.morning.dmrjx.cn.gov.cn.dmrjx.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.rhdln.cn.gov.cn.rhdln.cn http://www.morning.bfgpn.cn.gov.cn.bfgpn.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.fgsct.cn.gov.cn.fgsct.cn