本帖最后由 梦幻的彼岸 于 2023-1-11 10:19 编辑
环境信息Windows11、x64dbg、测试程序 x64dbg设置备注:可在x64dbg GitHub项目的releases发布页面或sourceforge获取最新的发布文件 当前使用的版本文件:snapshot_2022-12-12_15-45.zip 解压后的文件目录信息 备注:x64dbg由snapshot_2022-12-12_15-45重命名而来 安装进入release目录 运行x96dbg.exe 可执行文件,开始执行安装行为,以方便之后的调试 备注:因安装会进行一些系统设置操作,故会触发用户账户控制提示 在弹窗的Launcher点击Install进行安装 备注:x32dbg、x64dbg 按钮可运行相关平台的x64dbg,x64dbg与被调试程序需要统一位数才可进行调试并且x64dbg的附加调试功能只会显示相同平台的程序。 相关安装设置选项: shell extension---选择yes会添加一个右键菜单,当用此方式右键打开被调试程序时,会识别程序的位数,并用同位数的x64dbg打开以进行调试。 备注:Windows 11系统需右键后在点击更多选项(Shift F10),才可看到相关方式 Desktop ---选择yes,会在桌面创建两个快捷方式(不同平台的x64dbg) database icon ---选择yes会对x64dbg的数据库文件(dd32、dd64)设置相关logo,以方便识别 完成安装点击OK即可 事件设置Options --- Preferences 此次调试勾选如下选项即可,可根据不同的需求进行不同的调整 语言设置Options --languages--目标语言----更改后需重启程序才可生效 第一次运行会根据系统设置默认语言 示例:系统语言是中文,第一次运行后生成的配置文件,语言参数对应值为zh_CN 字体设置Options---Appearance 测试程序- #include <stdio.h>
- int main()
- {
- int a;
- printf("Please input a number:\n");
- int x = scanf_s("%d", &a);
- printf("%d\n", x);
- if (a % 5 == 0 && a % 7 == 0 && a >1 && a <200)
- printf("yes\n");
- else
- printf("no\n");
- return 0;
- }
复制代码
开始调试入口断点, 备注:此时展示的是链接器的入口故与代码对应的汇编不同,现在还没运行到代表所对应的虚拟内存地址 可在Log查看软件所产生的一些调试信息 有程序数据库文件 (.pdb)的情况下情况可在Symblos区域快速定位到main函数区域 main函数对应的汇编代码区域 定位"相关"汇编代表区域有些调试可能会在没有相关的程序数据库文件 (.pdb)的情况下进行,此时可通过一些字符串或展现的功能猜测使用了某些函数来定位到相关的区域、也可通过反编译来进行辅助调试 示例:程序运行后显示了如下字符串---Please input a number: CPU反汇编代码区域右键---搜索---所有用户模块---字符串类型 可以看到相关字符串信息以及对应的虚拟内存地址 鼠标左键双击相关区域可快速转到相关的汇编代码区域 此时可通过进度条或鼠标滚轮向上查看相关汇编代码 根据汇编区域显示的信息,可得知Please input a number:字符串对应的虚拟地址为140002260 可转到此地址修改对应的数据 数据修改区域框选右键 编辑界面内容,可以看到UTF-8区域对应解析的信息 修改 修改后的状态 备注:因反汇编区域默认是将在内存中内容读取并解析成相关的汇编代码,但实际情况这些是数据内容非相关的指令,故在编辑界面以字符串编码解析符和预期的效果 或修改部分区域的分析方法,以符和预期情况 恢复修改此时可点击恢复按钮将已修改的数据恢复到修改前的数据 临时修改测试,点击重启按钮,重新载入程序 入口断点暂停后因我编译的时候关闭了地址随机保护,故输入之前的地址即可,下图是修改后的效果 备注:若有相关保护功能,需重新搜索在转到编辑 导出修改导出修改后的二进制文件 File按钮 若无修改直接点击Patch File按钮即可 之后命名保存即可 备注:命名不要和原名一样,因此时正在使用 修改执行流程,通过观察汇编代码,看到有个jne判断,分析与一些输出相关,此时可在相关命令下断点 输入值确认后在jne判断指令暂停 执行后的结果 可双击相关call转到调用的函数入口地址,以查看相关分析后的汇编代码 简单分析当jne执行后会将"no\n"数据读取到rcx,之后调用140001020处理(看到符号解析调用的是printf函数实现的字符串打印输出功能)并实现将读取到的数据输出的功能 修改汇编指令: 根据之前的分析可知当此区域的两个jne处不跳转,jbe处跳转即可输出yes 在需要修改指令的行右键选择汇编 修改汇编指令将jne修改判断相反的汇编指令je 将jbe修改判断相反的汇编指令ja/jbne 测试验证 跳转不执行 跳转不执行 跳转执行 结果输出 更改标志寄存器当然也可以通过需改标志寄存器对应的值,影响指令判断的结果已达到测试的目的 zf=0 jne跳转 zf=1 jne不跳转 注释信息为了方便调试,也会在相关指令行添加注释也记录测试/猜测出的相关功能,已方便后续的分析 指令所在行右键 添加后的结果,与添加后在此选择相关功能可修改注释信息:
|