CrackMe主要是测试你的密码学知识,所以没有在其他方面设关卡。为了减小文件体积,缩短大家下载的时间,用upx加了壳,直接用Trw2000的"PNewSec+Makepe"很方便地就能脱掉壳。

用常规的方法,很快找到下面关键比较处:

:004015D9 51                      push ecx

:004015DA 52                      push edx

:004015DB 6880894000              push 00408980

:004015E0 E8EBFAFFFF              call 004010D0      //BF_De(sn)

:004015E5 8B442464                mov eax, dword ptr [esp+64]

:004015E9 8B0DF0994000            mov ecx, dword ptr [004099F0]

:004015EF 83C41C                  add esp, 0000001C

:004015F2 3BC1                    cmp eax, ecx      //比较

:004015F4 7529                    jne 0040161F

:004015F6 8B4C244C                mov ecx, dword ptr [esp+4C]

:004015FA A1EC994000              mov eax, dword ptr [004099EC]

:004015FF 3BC8                    cmp ecx, eax      //比较

:00401601 751C                    jne 0040161F

:00401603 6A30                    push 00000030

由于BlowFish算法加密,解密输出的信息都是64Bit的,所以要进行两次比较。

我们既然知道了他对我们的sn进行的变换是BF_De,那么,很显然,我们要找到程序初始化key_pbox和key_sbox的地方。跟进4015E0的Call,找到key_pbox在408980处,下bpm,然后跟踪,分析,找到程序初始化key_pbox和key_sbox的地方,如下:

:004016C0 50                      push eax

* Possible StringData Ref from Data Obj ->"CrackingForFun"

|

:004016C1 6844804000              push 00408044

:004016C6 6880894000              push 00408980

:004016CB E860FAFFFF              call 00401130  //初始化Boxes

由此我们知道了BF_De(sn)的key是"CrackingForFun"。

问题的一半已经解决了。下面我们来看用来比较的另外的64Bit的数是从何而来。

bpm 4099EC w

跟踪分析后,发现这个用来比较的数是由BF_En(ComputerID,key="ChinaCrackingGroup")生成。

至此,我们可以写出注册机的算法:

sn=BF_En((BF_En(ComputerID,key="ChinaCrackingGroup"),key="CrackingForFun")