Crackme逆向分析365例-001

重要提醒:本例所使用的Crackme本体安全性未知,请在虚拟机或沙盒环境中进行逆向练习!!!
说明:本篇逆向练习是表哥的Crackme逆向分析365例系列第1例(任务是:找到正确的用户名和密码),本次逆向练习所需的工具软件列表如下:
| 序号 | 名称 | 版本 | 备注 |
|---|---|---|---|
| 1 | HxD Hex Editor | 2.5.0.0 | 十六进制编辑器 |
| 2 | ExeinfoPE | 0.0.9.5 | PE文件信息观察器 |
| 3 | x32dbg/x64dbg | 2025-08-19 | 动态调试器(已集成Snowman插件) |
| 4 | runtime DLL | 2026-01-17 | 微软常用运行库合集 |
1、准备工作
1.1、将下载的Crackme本体(Crackme001.rar)解压到某个空白的文件夹下(最好是全英文路径),并确保能够正常运行,然后将Crackme001.exe复制一份并重新命名为CM001.exe,逆向分析时仅针对CM001.exe文件(若在您的电脑上不能运行,请尝试安装微软常用运行库合集或根据提示的库名在:https://cn.dll-files.com 网站上查询下载并保存到与Crackme本体相同的文件夹内)。
1.2、启动ExeinfoPE.exe,加载CM001.exe,根据ExeinfoPE的分析数据,手动列出文件信息如下:
| 信息类型 | 简要描述 |
|---|---|
| 文件名称: | CM001.exe |
| 文件类型: | 64位控制台程序(使用x64dbg调试器进行分析) |
| 编译器/链接器: | Microsoft Visual C++ v14.34 - 2022 |
| 编译日期: | 2023年 |
| 是否加壳: | 无壳,可直接进行分析 |
| 映像基地址: | 0x140000000 |
| 重定位段(.reloc): | 有(需要修改文件属性标志字段,使其运行时不进行重定位) |
1.3、启动HxD64.exe,加载CM001.exe,修改文件属性标志字段(从PE头偏移22个字节,从文件头偏移至0x106处),将其值从0x22修改为0x23并保存文件,这样的话,映像基地址将固定在0x140000000,方便本次练习场景重现,如下图所示:

1.4、运行CM001.exe文件,随便输入用户名和密码后,程序出错了(错误信息为:Wrong username or password.),如下图所示:

2、针对CM001.exe文件进行爆破
2.1、爆破思路:由于出现了错误信息,我们有理由相信,程序对输入的用户名和密码进行了某种计算,并且对计算结果进行了验证判断,并以此决定显示正确或错误信息。利用此思路,我们以出错信息字符串(Wrong username or password.)加载指令为基点,通过向上或向下来查找到正确的条件转移指令,然后修改这条转移指令,使其忽略验证结果,直接显示正确信息。
2.2、启动x64dbg.exe,在选项菜单中打开【选项】窗口,在【事件】选项中仅选择【入口断点】(若已经配置好了,可省略此步骤)。现在点击【打开文件】按钮,加载CM001.exe文件,此时RIP指向了程序入口点地址:0x1400114EC,点击【内存布局】窗口,在【页面信息】列中找到CM001.exe的位置,手动列出相关段信息如下:
| 段名 | 段描述 | 虚拟地址范围 |
|---|---|---|
| .text | 代码段 | 0x140011000-0x140022000 |
| .rdate | 只读数据段 | 0x140022000-0x140028000 |
根据经验,出错信息很可能以字符串的形式存储在只读数据段中,我们需要在代码段中定位出加载出错信息字符串的指令地址。
2.3、点击【搜索字符串】按钮,在【引用】页面底部的搜索框中输入:wrong username or password进行过滤后,共找到1处指令地址:0x140018795。鼠标左键双击地址,转到【CPU】页面的相关位置,以此条指令为基准点(lea rdx,qword ptr ds:[140023908]),向上查找最接近的条件转移指令,其指令地址为:0x140018793(在本例中,其与基准点紧挨着),如下图所示:

既然基准点地址(0x140018795)是显示错误信息的指令分支,那么可以合理推测,图中红线尽头所指的地址(0x1400187DC)就是显示正确信息的指令分支了,我们只要修改地址(0x140018793)处的条件转移指令,使其忽略条件判断,直接转移到地址(0x1400187DC)处,就可以完成本次的爆破过程。
2.4、鼠标左键单击地址(0x140018793),按空格键弹出汇编窗口,将je或jz修改为jmp,其余信息保持不变,然后按【确定】按钮使修改生效,如下图所示:

点击【补丁】按钮或Ctrl+P打开补丁窗口,点击【修补文件】按钮将修改另存为:CM001-已爆破.exe文件,如下图所示:

2.5、关闭所有程序,运行CM001-已爆破.exe文件,看看爆破效果如何,如下图所示:

效果很明显,同样的输入数据,不同的输出结果,说明爆破成功。注意:按照Crackme本体作者的原本意图,是要求破解出用户名和密码的,所以我们继续进行追码操作。
3、针对CM001.exe文件进行追码
3.1、追码思路:在上面的爆破过程中,我们已经定位出了显示成功信息的指令分支地址:0x1400187DC,所以我们可以从此地址进行反推,看看有哪些转移指令与此地址相关,从而推断出关键call,然后对这些关键call进行详细分析,理解其针对输入数据的计算逻辑以便追码。
3.2、重新启动x64dbg.exe,点击【打开文件】按钮,加载CM001.exe文件,此时RIP指向了程序入口点地址:0x1400114EC,按Ctrl+G打开地址转移窗口,输入:0x1400187DC,然后按【确定】按钮,这时可通过左侧白线观察到指令调用来源路线有2条,在源头附件还发现了2条call指令(地址分别为:0x140018772和0x140018789),怀疑这2条指令就是关键call了,用鼠标左键分别点击这2个地址并按F2键下执行断点,如下图所示:

3.3、按F9键运行程序,然后在程序控制台界面上输入用户名(SMKB)和密码(123456789)后回车,回到调试器界面,这时已经中断在第1个关键call上(0x140018772),我们先看一下函数的参数是什么(64位程序规则,前4个参数通过rcx、rdx、r8、r9传递,多于4个的参数通过堆栈传递),鼠标右键分别点击寄存器(rcx和rdx),选择【在内存窗口中转到】(内存1和内存2),通过观察内存1和内存2窗口发现,rcx指向我们输入的用户名:SMKB(偏移了8个字节),而rdx偏移8字节指向字符串:kanyefan,(注意:其实真实指向的是某个结构指针,但也无所谓了,因为结构中包含了我们需要关注的字符串,能理解就行),据此推测,此函数可能用于用户名的比较,而kanyefan可能就是我们要找的超级用户名,根据上图的白线逻辑判断,只要输入了超级用户名kanyefan,那么密码就可以随便写了。
3.4、按F9键继续运行,中断在第2个关键call上(0x140018789),使用同3.3节同样的操作方法后,观察内存1和内存2窗口发现,rcx指向我们输入的密码:123456789(偏移了8个字节),而rdx偏移8字节却指向了堆中的一个地址:0x509980(此地址是动态分配的,每次运行各不相同,请使用您当前显示的地址),在内存2窗口中鼠标右键点击地址0x509980,选择【在内存窗口中转到指定QWORD】(内存3),通过观察内存3窗口发现字符串:kanyewestlover911,我们据此大胆推测,这就是我们要找的超级密码。
3.5、到此为止,已经不需要具体分析汇编代码了,基本可以确定:如果输入的用户名是kanyefan,那么密码可以随便了,否则,输入的密码必须是kanyewestlover911,在上述这2种情况下就不会出现错误信息了,我们试一试吧,如下图所示:


果然如此,看来Crackme本体作者是kanye west(坎耶-维斯特)的脑残粉啊。
4、本次练习总结
- 利用出错信息字符串来定位显示错误或正确信息的转移指令位置,然后修改此指令,使其忽略条件判断,直接转向显示正确信息的指令分支,从而完成爆破。
- 以显示正确信息的指令分支为起点,查找其指令调用源头地址,并在源头附近定位关键call,然后详细分析以便追码(本例未进行详细分析,而是根据经验,推测并查找出了超级用户名和超级密码)。
- 本次练习所需工具软件合集下载地址:https://www.123pan.com/s/egPeVv-XPaE3
- Crackme逆向分析365例本体合集下载地址:https://www.123pan.com/s/egPeVv-WPaE3
- Crackme逆向分析365例文档(markdown、word)合集下载地址:https://www.123pan.com/s/egPeVv-sPaE3
- 解压密码均为:SMKB
PS:本贴到此结束,若转载请保留全部信息,期待我们在下一贴有缘再见。

浙公网安备 33010602011771号