BLOWFISH算法之CrackMe1分析(2)

CrackMe主要是測(cè)試你的密碼學(xué)知識(shí),所以沒有在其他方面設(shè)關(guān)卡。為了減小文件體積,縮短大家下載的時(shí)間,用upx加了殼,直接用Trw2000的"PNewSec+Makepe"很方便地就能脫掉殼。

用常規(guī)的方法,很快找到下面關(guān)鍵比較處:

: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的,所以要進(jìn)行兩次比較。

我們既然知道了他對(duì)我們的sn進(jìn)行的變換是BF_De,那么,很顯然,我們要找到程序初始化key_pbox和key_sbox的地方。跟進(jìn)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"。

問題的一半已經(jīng)解決了。下面我們來看用來比較的另外的64Bit的數(shù)是從何而來。

bpm 4099EC w

跟蹤分析后,發(fā)現(xiàn)這個(gè)用來比較的數(shù)是由BF_En(ComputerID,key="ChinaCrackingGroup")生成。

至此,我們可以寫出注冊(cè)機(jī)的算法:

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