x64dbg使用记录:开始调试并修改一个程序
本帖最后由 梦幻的彼岸 于 2023-1-11 10:06 编辑环境信息Windows11、x64dbg、测试程序x64dbg设置网站:https://x64dbg.com/GitHub:https://github.com/x64dbg/x64dbgsourceforge:https://sourceforge.net/projects/x64dbg/files/snapshots/备注:可在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不跳转注释信息为了方便调试,也会在相关指令行添加注释也记录测试/猜测出的相关功能,已方便后续的分析指令所在行右键添加后的结果,与添加后在此选择相关功能可修改注释信息:
写得很详细,第一次接触,好好学习一下 有脱VMp壳的吗 666,期待下一篇精彩文章
666,期待下一篇精彩文章 666,期待下一篇精彩文章{:victory:} PYG有你更精彩! 好详细的教程,对新手有帮助 好好学习,天天进步
666,期待下一篇精彩文章{:victory:}
页:
[1]
2