今天我来说个简单的破解思路给大家 我用的一款CrackMe,专门给破解的孩子学习训练用的,想要文件的童鞋可以找我要啊。下面进入正题!
这个是我们要破解的文件CrackMe

先运行一下,随便输入些东西看看

提示错误啊TT…如果一开始就能蒙对,我也就可以去买彩票了…

咱们就用UE打开看下,发现很多字符都可以辨认,可以基本推断出这个文件没有加壳…是个裸奔的程序…

用VistaDBG打开他

打开以后就是这个样子的

往下看直到找到提示信息,我截图下来了(如果加了壳的话这些字符串一般是看不到的,那就要先脱壳,就和脱衣服一样,工具有很多…)

往上一点看,找第一个跳转(一般是第一个,不对的话继续往上),如图,JNZ是不相等跳转,可以看到他跳到错误的提示里面去了
如果我们把这个跳转改到正确的提示那么破解也就完成了,但这样子我不喜欢,我们的目的是追查出程序真正的序列号!

在这个跳转上一步F2下断点,CMP是对比,然后F9调试运行下,

再次随便输入些东西,确定后程序会暂停。注意看JNZ跳转前两步:MOV和CMP 这两个操作涉及到了ESI和EDI寄存器。

程序暂停后我们查看寄存器:ESI和EDI

从函数的头开始查找ESI指向的地址00403044 这个地址保存着我们输入的错误的序列号
MOV ECX,8 定义循环次数(可以看出程序默认的序列号位数输应该为8)
MOV ESI crackme.00403044 把序列号调出来给ESI
XOR BYTE PTR DS:[ESI],32 循环(下面有个LOOPD和INC自增)把ESI中数据提出来和32异或以后再放回去

MOV ECX,4定义循环次数
MOV AL,BYTE PTR DS:[ESI] 取值
MOV BL,BYTE PTR DS:[ESI+1] 取值
XOR AL,BL 把取出来的两个值异或,一共循环四次,这样原先循环8次的结果到这里就只剩下4个了
这个循环后面还有3个XOR 目的是把剩下的4个数两两异或最终得到1个结果,不多说了
注意看地图的底部还有一个LOOPD,把上边一系列操作的得到最后一个数和原先的8位序列号异或…作者真麻烦啊~…

这样我们就知道程序的算法了,
输入的序列号取八位和32异或 再两两异或直到只剩一个值,再和原序列号异或得出的值和经过同样运算的序列号对比(当然已经事前运算过放在里面了)
首先我们跟踪到00403008 也就是前面EDI寄存器的地址,取前八个,真正序列号就保存在里面,不过是经过一大堆运异或算过的,我们现在就是要把他求出来
前八个值分别是: 71 18 59 1B 79 42 45 4C
然后我们开始按前面的算法算一遍,目的就是求出最后一个值,这个时候不需要异或32,而是直接两两异或,这属于逆算。
先两两异或得到(拿计算器吧,windows自带的计算器科学型有XOR功能)
69 42 3B 09
再两两异或
2B 32
继续
19
终于出来了!这个最终的数字!这是反推的关键

然后拿 71 18 59 1B 79 42 45 4C 和19 异或
得到 68 01 40 02 60 5B 5C 55
然后拿 68 01 40 02 60 5B 5C 55 和32 异或
得到5A 33 72 30 52 69 6E 67 查ascii码表(看16进制)得到为 Z 3 r 0 R i n g
输入测试:

完成!