C++ 反汇编
配套资源下载
环境及工具
反汇编引擎工作原理(可略过)
基本数据类型的表现形式
程序的真正入口
本文档使用 MrDoc 发布
-
+
首页
环境及工具
### 环境 - Windows10 - VS2022 - OllyDbg - x64dbg - WinDbg - IDA ### VS2022 - 安装配置,生成新项目略。 - 单击**菜单“生成解决方案”(快捷键Ctrl+Shift+B)完成程序的编译,单击“调试”→“开始执行”(快捷键Ctrl+F5)完成程序的运行**。生成的可执行文件32位程序在项目根目录的 Debug 或 Release 目录下,64 位程序在项目根目录的 x64/Debug/ 或 x64/Release 目录下。也可以打开反汇编窗口**点击“调试模式(F10)”→“窗口”→“反汇编”(快捷键 Ctrl+Alt+D),跟踪调试源码与反汇编对应情况**,VS Debug/Release 程序都支持调试与反汇编。  - 编译选项: - **Debug**:调试版,编译器默认不对生成的汇编代码做优化。 - **Release**:发布版,编译器默认对生成的汇编代码做优化,可设置为 01 优化(最小文件优化)或 02 优化(最快执行速度优化)。如无设置,Release 版默认使用 02 优化选项。  - 修改优化选项在**项目属性(右键项目->"属性")**  - 后面 VS 的命令行编译,没必要深入研究,没用过。 - GCC 在 Linux 下常用,Windows 下配置 MinGW + VSCode 也比较麻烦,一般不用。 - Clang 真不熟,略。感兴趣自己玩。 ### OllyDbg - 这是个经典动态调试器,插件很多。缺点是**只支持 32 位程序。*  - 以下是界面的介绍: 1. 汇编代码对应的地址窗口。 2.汇编代码对应的十六进制机器码窗口。 3. 反汇编窗口。 4. 反汇编代码对应的注释信息窗口。 5. 寄存器信息窗口。 6. 当前执行到的反汇编代码的信息窗口。 7. 数据窗口,数据所在的内存地址。 8. 数据窗口,数据的十六进制编码信息。 9. 数据窗口,数据对应的ASCII码信息。 10. 栈窗口,栈地址。 11. 栈窗口,栈地址中存放的数据。 12. 栈窗口,对应的说明信息。 - 快捷键如下 | 快捷键 | 功能说明 | | :----: | :----: | | F2 | 断点,在 OllyDbg 反汇编视图使用 F2 指定断点地址 | | F3 | 加载一个可执行程序进行调试分析 | | F4 | 程序执行到光标处 | | F5 | 缩小、还原当前窗口 | | F7 | 单步步入,进入函数实现内 | | F8 | 单步步过,越过函数实现 | | F9 | 直接运行程序,遇到断点则暂停程序 | | Ctrl+F2 | 重新运行程序起始处,用于重新调试程序 | | Ctrl+F9 | 执行到函数返回处,用于跳出函数实现 | | Alt+F9 | 执行到用户代码处,用于快速跳出系统函数 | | Ctrl+G | 输入十六进制地址,在反汇编或数据出窗口中快速定位到该地址处 | ### x64Dbg - 功能,界面,快捷方式大概与 OllyDbg 一致,**支持 64 位程序**。 ### WinDbg - 除了应用调试,还支持**内核调试**。在于可以**从微软的符号服务器中获取系统符号文件,使应用程序或内核调试的反汇编代码可读性更好**。 - 快捷键 F1 查看命令的使用帮助 | 快捷键 | 功能说明 | | :---: | :---: | | g | 运行程序或运行到程序指定位置 | | u | 显示反汇编代码 | | d | 显示内存数据 | | e | 修改内存数据 | | r | 查看修改寄存器数据 | | t | 单步步入 | | p | 单步步过 | | pa | 执行到指定地址 | | pt | 执行到返回指令为止 | | pc | 执行到 call 指令为止 | | gu | 执行到函数返回 | | bp | 设置断点 | | bl | 查看断点 | | ba | 内存断点 | | bc | 删除断点 | | bd | 使断点失效 | | be | 使断点有效 | | ~ | 查看线程信息 | | lm | 查看模块信息 | | x | 查看符号信息 | | .cls | 清屏 | - 加载可执行程序Ctrl+E。 - 输入命令执行到入口代码:g $exentry。 - 输入命令查看反汇编代码:u。 - 输入命令修改内存:eza 00403000 "I Like C++"。 - 输入命令查看修改的数据:da 00403000。 - 输入命令运行程序:g。 ### IDA - 静态反汇编程序 | 快捷键 | 功能说明 | | :----: | :----: | | Enter | 跟进函数实现,查看标号对应的地址 | | Esc | 返回跟进处 | | A | 解释光标处的地址为一个字符串的首地址 | | B | 十六进制数与二进制数转换 | | C | 解释光标处的地址为一条指令 | | D | 解释光标处的地址为数据,每按一次将会转换这个地址的数据长度 | | G | 快速查找到对应地址 | | H | 十六进制数与十进制数转换 | | K | 将数据解释为栈变量 | | ; | 添加注释 | | M | 解释为枚举成员 | | N | 重新命名 | | O | 解释地址为数据段偏移量,用于字符串标号 | | T | 解释数据为一个结构体成员 | | X | 转换视图到交叉参考模式 | | shift+F9 | 添加结构体 | | Space | 转换视图 | - IDA 窗口介绍: - IDA View-A:分析视图窗口,用于显示分析结果,可选用流程 图或代码形式。 - Hex View-1:二进制视图窗口,打开文件的二进制信息。 - Exports:分析文件中的导出函数信息窗口。 - Imports:分析文件中的导入函数信息窗口。 - Names Window:名称窗口,分析文档用到的标称。 - Functions Window:分析文件中的函数信息窗口。 - Structures:添加结构体信息窗口。 - Enums:添加枚举信息窗口。 - IDA 函数名识别 - IDA通过SIG文件识别已知的函数信息。在安装IDA的同时,已将常用库 制作为 SIG 文件,放置在 IDA 安装目录的 SIG 文件夹下。**利用此功能可识别第三方提供的库函数,从而简化分析流程。** - 制作 SIG 文件(使用前须设置环境变量路径) 1. 将每个 OBJ 或者 LIB 文件制作成 PAT 文件 - 在制作 PAT 文件的过程中,会提取出这些二进制机器码的特征,将**二进制机器码的特征码及对应函数的名称保存在 PAT 文件中。**特征码就好像是人的五官,我们可以通过五官特征来识别一个人,将函数比作独立的人,它们有各自不同的特点。**如果某个文件拥有这些特征信息,便可确认此文件使用了这个OBJ,并可以借此识别函数名称。** - 生成 PAT 时使用的是 **pcf.exe 或者 pelf.exe。**其中 pcf.exe 用于制作 **COFF 文件格式(.obj、.lib库文件**)、pelf 用于制作 **ELF 文件格式(.o、.a库文件)**。在控制台下使用如下 pcf 命令。 ``` pcf [Obj name].obj pcf [Lib name].lib 指令说明如下。 [Obj name]:OBJ文件名称。 [Lib name]:LIB文件名称。 ``` 2. 多 PAT 文件联合编译 SIG 文件 - **SIG 文件是由一个或多个 PAT 文件编译而成的。**在生成 SIG 文件的过程中,**如果多个 PAT 文件中有两个或两个以上的函数特征码相同,将会过滤掉重复特征,只保存一份。**在控制台下使用 sigmake.exe 将 PAT 文件编译成 SIG 文件,格式如下所示。 ``` sigmake [Pat name].pat [Sig name].sig 指令说明如下。 [Pat name]:PAT 文件名称。当多个 PAT 文件参与编译时,用*代替名称,将所选目录下所有后缀名为 pat 的文件编译为一个后缀名为 sig 的文件。 [Sig name]:编译后生成的SIG文件的名称。 ``` - 使用 SIG 文件 - **将生成后的 SIG 文件放置在 IDA 的安装目录 SIG 文件夹下。使用快捷键 Shift+F5 添加 SIG 文件到分析工程中。**  - 图显示了当前分析工程中使用到的 SIG 文件。**使用 Insert 键可加载 SIG 文件用于此工程;也可以在视图中单击 Apply new signature 添加 SIG 文件。** - 批处理制作 SIG 文件脚本(这个也需要设置环境变量哦): ``` if %1=="" goto end for %%i in (*.lib,*.obj) do (pcf %%i) sigmake -r *.pat %1.sig del *.pat :end 解释: if %1=="" goto end 检查命令行参数。 在当前目录下循环遍历所有 LIB 和 OBJ 文件,并逐一通过 PCF 转换成对应的 PAT 文件。 通过 sigmake 工具将所有 PAT 文件打包为一个 SIG 文件。 删除生成的所有 PAT 文件。 ``` - 将代码保存为“lib2sig.bat”,放置在自己创建的目录下,将第三方库或者编译器的库复制到此目录下,在控制台下使用此批处理文件,“lib2sig.bat”的使用方法如下。 ``` lib2sig [ 生成SIG文件名称 ] ```
别卷了
2024年4月1日 14:28
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码