菜鸟学反汇编3—cout

c++代码:

c++代码:

c++代码:

#include<iostream>

#include<iostream>

#include<iostream>

using namespace std;

using namespace std;

using namespace std;

int main()

int main()

int main()

{

{

{

cout<<"输出";

cout<<"输出"<<endl;

cout<<"输出"<<"Good"<<endl;

return 0;

return 0;

return 0;

}

}

}

push offset sub_401030

push offset sub_401040

push offset aGood ; "Good"

push offset aF ; "?

push offset aF ; "?

push offset aF ; "?

push offset unk_41A468 ; int

push offset unk_41A468 ; int

push offset unk_41A468 ; int

call sub_401020

call sub_402230

call sub_402240

add esp, 8

add esp, 8

add esp, 8

push eax ; int

call sub_402240

add esp, 8

mov ecx, eax

mov ecx, eax

call sub_401050

call sub_401060

以下着重研究最后一段代码

push offset sub_401040

可以看出这个与<<endl;有关。

push offset aGood ; "Good"

push第二个输出内容,但是它没有和下面的参数一起被处理 ,而是在先输出输出之后的另一个call里才使用到了它。可见处理cout是先将所有参数都push了,然后再一个一个处理。

push offset aF ; "?

这三行是一个整体,即可以辨别sub_402240这个函数需要两个参数,而我一直对第一个参数不理解是什么作用。这个整体运行完就会出现输出而没有”Good”

push offset unk_41A468 ; int

call sub_402240

add esp, 8

这行是清理掉上个函数所用到的两个参数。同时使”Good”成为栈顶

push eax ; int

这个和push offset unk_41A468 ;应该差不多,但是这个eax是怎么来的呢?我一直追踪下去,没有什么斩获,是我能力太低了的原因。但是可以猜测它的作用的。

call sub_402240

add esp, 8

清理掉上个函数所用到的两个参数。使offset sub_401040成为栈顶

mov ecx, eax

这步的用意是什么?可能是后一个call使用到了ecx这个参数。

call sub_401060

前面的一切疑惑要深入这个函数才能知晓,比如最先push的那个参数怎么没有使用和销毁呢?

现在来看看sub_401060里面的代码

sub_401060 proc near

var_4= dword ptr -4

这是解释代码,即可理解为var_4esp-4处的空间

arg_0= dword ptr 8

这是解释代码,即可理解为arg_0esp+8处的空间

push ebp

mov ebp, esp

push ecx

mov [ebp+var_4], ecx

这两句其实就是mov eax,ecx。至于为什么这么做就不清楚了?结合上面的代码mov ecx,eax。发现这就是一个循环, 只可以猜测这样的处理是因为之后call 的函数之中也有用到ecx(可能里面还是一个这个循环)。

mov eax, [ebp+var_4]

push eax

call [ebp+arg_0]

add esp, 4

这两句很奇怪啊,既然之后要给esp赋值,为什么之前还要有一次对它进行+操作?之前有两个push,则这步使esp编程这个子程没有被调用之前的值。即清理掉了前两个参数。

mov esp, ebp

pop ebp

retn 4

这句返回esp+4地址。即跳过了call操作push入的地址而跳到主体push offset sub_401040.压入的 sub_401040.

反思:

还有很多细节没有弄清楚

下步:

增加cin

<think>好的,用户想了解如何使用GDB进行反汇编,特别是关于disassemble命令的教程。首先,我需要整理GDB反汇编的基本用法,确保覆盖常用命令和参数。根据用户提供的引用内容,有四个引用涉及反汇编的具体应用,比如指定函数、地址范围,以及通过反汇编定位问题。我需要将这些信息整合到回答中,同时保持步骤清晰。 第一步,启动GDB并加载程序。用户可能需要知道如何启动GDB,加载可执行文件,或者在已经运行的进程上附加。引用4中提到了一个示例程序,可以用来演示,因此我应该包含类似的基本步骤。 接下来,disassemble命令的格式。根据引用1和引用3,可以指定函数名或地址范围。例如,`disassemble main`反汇编整个main函数,而`disassemble 0x40068a,0x4006ac`则反汇编特定地址区间。需要详细说明这些用法,并给出示例。 另外,引用2提到了通过断点和反汇编来比较补丁加载前后的汇编代码,这可能涉及到动态调试的情况。用户可能需要了解如何设置断点,运行程序,然后在断点处反汇编代码。这部分可以作为高级应用场景来介绍。 还要注意用户可能需要的其他相关命令,比如查看寄存器的`info registers`,或者显示特定地址的汇编代码。同时,可能需要解释如何在没有符号信息的情况下进行反汇编,这时候地址的使用就变得重要了。 最后,生成相关问题。根据用户之前的示例,问题应该围绕反汇编的其他命令、地址范围的作用、动态调试中的应用以及常见错误。需要确保问题覆盖用户可能进一步探索的方向。 检查所有步骤是否覆盖了用户提供的引用内容,并确保LaTeX格式正确,行内公式使用$...$,独立公式用$$...$$。同时,引用标识要自然地附加在相关段落末尾。确保回答结构清晰,分步骤说明,帮助用户逐步理解和应用GDB的反汇编功能。</think>### 如何通过GDB进行反汇编 #### **1. 基础用法** **步骤1:启动GDB并加载程序** ```bash gdb ./your_program # 加载可执行文件 # 或附加到正在运行的进程 gdb -p <pid> ``` **步骤2:使用`disassemble`命令** - **反汇编当前函数** 直接输入`disassemble`会反汇编当前执行的函数[^1]。 ```gdb (gdb) disassemble ``` - **反汇编指定函数** 例如反汇编`main`函数: ```gdb (gdb) disassemble main ``` - **反汇编指定地址范围** 使用起始地址和结束地址(格式为十六进制): ```gdb (gdb) disassemble 0x40068a,0x4006ac # 示例来自引用[3] ``` #### **2. 结合断点调试** **步骤1:设置断点** ```gdb (gdb) break main # 在main函数入口设置断点 ``` **步骤2:运行程序并触发断点** ```gdb (gdb) run ``` **步骤3:查看断点处的汇编代码** ```gdb (gdb) disassemble ``` #### **3. 动态分析汇编变化** 通过反汇编对比补丁加载前后的代码差异(引用[2]): 1. 在补丁函数处设置断点。 2. 加载前使用`disassemble`记录汇编代码。 3. 加载补丁后再次反汇编同一地址,对比差异。 --- #### **4. 其他相关命令** - **查看寄存器状态** ```gdb (gdb) info registers ``` - **显示特定地址的汇编** ```gdb (gdb) x/10i 0x40068a # 显示从0x40068a开始的10条指令 ``` --- ### 示例代码分析(引用[4]) 假设有如下C++代码: ```cpp #include <iostream> int main() { int i = 3; int k = ++i + ++i + ++i; std::cout << k << std::endl; return 0; } ``` **反汇编过程**: 1. 编译时添加调试信息: ```bash g++ -g test.cpp -o test ``` 2. 在GDB中反汇编`main`函数: ```gdb (gdb) disassemble main ``` 输出会显示`main`函数的汇编指令,例如: ```asm 0x000000000040068a <+0>: push %rbp 0x000000000040068b <+1>: mov %rsp,%rbp ... ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值