C++ 函数反汇编跟踪以及栈结构分析

#include <iostream>
using namespace std;
 
int func(int a,int b);
 
void main()
{
         intx = 1;
         inty = 2;
         intz = func(x,y);
}
 
int func(int a,int b)
{
         returna + b;
}


汇编解析:

void main()
{
//这个函数头产生的汇编代码是:
main:
013E13A0 push        ebp 
013E13A1 mov         ebp,esp 
013E13A3 sub         esp,0E4h 
013E13A9 push        ebx 
013E13AA push        esi 
013E13AB push        edi 
013E13AC lea         edi,[ebp-0E4h] 
013E13B2 mov         ecx,39h 
013E13B7 mov         eax,0CCCCCCCCh 
013E13BC rep stos    dword ptres:[edi] 
 
*******************************************************
         intx = 1;
         inty = 2;
//这个的汇编代码是:
013E13BE mov         dword ptr [x],1 
013E13C5 mov         dword ptr [y],2 
*******************************************************
//接下来就是函数的调用了,先是把参数压栈
013E13CC mov         eax,dword ptr [y] 
013E13CF push        eax 
013E13D0 mov         ecx,dword ptr [x] 
013E13D3 push        ecx 
//参数压栈后就是调用函数
013E13D4 call        func (13E11D1h)
// 在这个地方用F11调试步进,可以进入子函数func的汇编代码,如下:
013E11D1 jmp         func (13E35B0h)
func:
013E35B0 push        ebp 
013E35B1 mov         ebp,esp 
013E35B3 sub         esp,0C0h 
013E35B9 push        ebx 
013E35BA push        esi 
013E35BB push        edi 
013E35BC lea         edi,[ebp-0C0h] 
013E35C2 mov         ecx,30h 
013E35C7 mov         eax,0CCCCCCCCh 
013E35CC rep stos    dword ptr es:[edi] 
013E35CE mov         eax,dword ptr [a] 
013E35D1 add         eax,dword ptr [b] 
013E35D4 pop         edi 
013E35D5 pop         esi 
013E35D6 pop         ebx 
013E35D7 mov         esp,ebp 
013E35D9 pop         ebp 
013E35DA ret 
//func函数执行完毕后返回主函数中
013E13D9 add         esp,8 
013E13DC mov         dword ptr [z],eax 
013E13DF xor         eax,eax 
013E13E1 pop         edi 
013E13E2 pop         esi 
013E13E3 pop         ebx 
013E13E4 add         esp,0E4h 
013E13EA cmp         ebp,esp 
013E13EC call       @ILT+315(__RTC_CheckEsp) (13E1140h) 
013E13F1 mov         esp,ebp 
013E13F3 pop         ebp 
013E13F4 ret 


 

接下来再看看各个寄存器都是怎么变的,里面存的什么东西

1      首先进入main函数最开始:

再看看此时的寄存器的内容:


EAX = 00851D88EBX = 7E0BC000 ECX = 00854A30 EDX = 00000001ESI = 00000000 EDI = 00000000 EIP = 013E13A0ESP = 009BF76C EBP = 009BF

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: IDA 是一种广泛使用的反汇编工具,用于将机器码转换成相应的高级编程语言代码,例如 C 语言。通过反汇编 C 代码,我们可以更好地理解和分析程序的功能和逻辑。 使用 IDA 反汇编 C 代码的过程相对较简单。首先,我们将目标程序加载到 IDA 中,并选择以反汇编 C 语言的方式展示反汇编结果。接下来,在 IDA 的窗口中,我们将看到程序的汇编代码,以及与每个指令对应的注释和变量名。 通过分析反汇编结果,我们可以确定每个汇编指令对应的 C 代码,并进一步理解程序的结构和流程。通过添加注释、变量名和函数名,我们可以更方便地阅读和分析代码。 IDA 还提供了一些高级功能,例如交叉引用和反汇编图,这些功能能够帮助我们更全面地理解程序的各个部分和函数之间的联系。通过分析反汇编结果,我们可以发现任何隐藏的功能或安全漏洞,并进行修复或优化。 总而言之,IDA 是一款强大的反汇编工具,能够将机器码转换为易于理解的 C 代码,帮助我们更好地理解、分析和优化程序中的功能和逻辑。 ### 回答2: IDA是一款强大的反汇编软件,用于将机器码还原为可读的C语言代码。IDA具有简单易用的界面和丰富的功能,可以帮助逆向工程师分析和理解二进制文件的内容。 使用IDA反汇编C语言代码可以带来很多好处。首先,通过反汇编,可以获得更多关于程序的信息,如函数的调用关系、变量的使用方式等。这对于理解程序的功能和逻辑非常有帮助。 其次,IDA可以将反汇编的结果以C语言的形式呈现,使得代码更易读、易懂。这对于逆向工程师理解程序的逻辑和进行代码分析非常重要,有利于发现潜在的安全漏洞或程序的漏洞。 此外,IDA还提供了很多辅助功能,如交叉引用、调试器、动态分析等。这些功能能够帮助逆向工程师更方便地进行代码分析和调试,提高工作效率。 总之,IDA通过反汇编C语言代码,可以帮助逆向工程师深入理解程序的内部结构和工作原理,提高分析和逆向工程的效率。无论是进行安全评估、漏洞挖掘还是代码重用,IDA都是非常有用的工具。 ### 回答3: IDA是一款常用的反汇编工具,可以将机器码反汇编为C语言代码。使用IDA反汇编C代码可以帮助我们理解程序的功能和逻辑。 首先,我们需要将目标程序加载到IDA中。IDA会对目标程序进行静态分析,并将二进制代码转换为可读的汇编语言代码。对于C语言编写的程序,IDA会尽可能地还原出C代码的结构和逻辑。 在IDA中,我们可以看到反汇编后的代码,以及反汇编后所生成的控制流图。控制流图可以帮助我们了解程序的执行流程和函数调用关系。 如果反汇编出的代码是汇编语言的形式,我们可以通过IDA的辅助功能将其转换为C代码。IDA提供了一些工具和插件,可以将汇编代码转换为等效的C代码。这样,我们就能更方便地理解和分析程序的功能。 然而,需要注意的是,IDA的反汇编过程并不是100%准确的。原因是编译器在将C代码转换为机器码时会进行优化和重排指令,这会导致一些信息的丢失。因此,反汇编的结果可能不完全等同于原始的C代码。 总而言之,借助IDA的反汇编功能,我们可以更好地分析和理解目标程序的功能和逻辑。但是需要谨记反汇编结果并不完全准确,需要结合其他手段来进行分析和验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值