使用x64dbg破解密钥exe程序
1.背景
软件案例是自己编写的一个简单案例,主要学习逆向思路和过程,虽然很简单,但是我破解了一天!!!
这是破解成功的样子。哈哈很多外挂软件都是卡密的,大差不差,无非加了些壳子。
2.思路
windows软件都是面向消息机制的,当我们输入错误密钥后,他会弹框提示,密钥错误。我们可以根据这个弹框的消息API去打断点,我这边弹框断点是断的MessageBoxA
/ MessageBoxW
(ANSI/Unicode 版本)这2个,然后可以端到MessageBoxW
函数,断住后就可以向上回溯,找到密钥判断的逻辑了,一般都是CMP或者TEST后面跟着JMP等J型指令的 这块基本都是判断逻辑。是重点分析的对象。
3.逆向过程
1.这个是我的错误提示
根据错误提示去搜索 密钥错误的关键字,没搜到相关字符串,就直接用弹框API的方式去逆向回溯。
1.2 添加API断点命令
在界面左下角输入:bp MessageBoxW
然后回车 就打上了断点,可以切换到断点视图查看
1.3 打好断点后,我们随便输入一个密钥。触发断点
可以看到 断点断到的位置 就是弹框函数了。注意一定要写好注释,因为有的层级很深,不做好注释,很容易乱。
1.4我们切换到调用堆栈的视图
看看是谁调用了这个弹框API
可以看到也是一个用户函数调用了这个API ,我们双击下一条函数向上跟踪。
我后面写的有注释,可以看到是这个调用了。然后我们向上找,发现并没有相关的J型指令。那么我们可以直接断点到ret
返回的地方,然后看看判断逻辑是不是在更上层函数
1.5看到了相关的J型指令
进行相关的分析,发现这层也不是密钥判断逻辑,然后我们继续向上层函数返回然后分析,断点到ret 然后单步返回到上层函数。
返回上层后可以看到 这层也有很多J型指令,通过分析,也不是。继续返回ret 到上层函数。
到了这层可以看到,错误分支,是被JMP指令包含的,那就要重点分析了,通过断点调试发现,这块就是密钥比较逻辑,让程序正常跳过错误分支不就大功告成了吗,按照这个逻辑分析,可以发现走到JE的时候是会跳过JMP的,所以我们核心改下JE指令的标志位,让ZF等于0不跳过,就可以正常走到JMP呢。然后成功破解。
相关J型资料
在 x86/x64 汇编中,JE(Jump if Equal) 指令是否跳转取决于 CPU 状态标志寄存器(EFLAGS/RFLAGS) 中的 ZF(Zero Flag,零标志位):
- JE 的跳转条件
JE 等同于 JZ(Jump if Zero),两者机器码相同,只是助记符不同。
跳转条件:
当 ZF = 1 时跳转(即前一条指令的结果为 0 或 比较相等时触发)。
JNE 看 ZF 标志位,ZF=0 时跳转。
调试时需检查前一条指令(如 CMP、TEST)是否使 ZF=0。
在 x64dbg 中直接观察 EFLAGS 寄存器即可快速判断。
这里不讲解相关指令用法,只说思路,不知道指令用法的查下就知道了。