一、破解過程
1、通過查找字符串“注冊(cè)”找到了注冊(cè)驗(yàn)證的地方,很快就找到了關(guān)鍵call。
006D5AD5 . E8 AE020000 call 006D5D88
這里調(diào)用了關(guān)鍵call 006D5D88,修改關(guān)鍵call的返回值為1,就能夠讓軟件提示注冊(cè)成功。但是重啟以后還會(huì)死未注冊(cè)。
這說明這是一個(gè)重啟驗(yàn)證的軟件。要想爆破它,就得修改軟件啟動(dòng)時(shí)的驗(yàn)證代碼。但是怎么找到那里呢?
不急,去關(guān)鍵call
006D5D88 /$ 55 push ebp ; 這就是關(guān)鍵call
單步F8,發(fā)現(xiàn)了這個(gè):
006D5DE8 |. E8 FF000000 call 006D5EEC ; 這個(gè)call后,真碼出來了。
調(diào)用了006D5EEC后,真碼就出來了。
2、過去看看006D5EEC這個(gè)call
006D5EEC /$ 55 push ebp
來到這個(gè)生成真碼的call。發(fā)現(xiàn)它被兩處地方調(diào)用了,一處是上面提到的006D5DE8,另外一處是
006D7BD7 . E8 10E3FFFF call 006D5EEC
006D5DE8處的調(diào)用是在點(diǎn)擊注冊(cè)時(shí),生成真碼與填寫的假碼進(jìn)行對(duì)比。那么006D7BD7這里為什么也要生成真碼呢?可以肯定也是為了將生成的真碼和假碼進(jìn)行對(duì)比。那么在006D7BD7下斷點(diǎn)。
3、重新運(yùn)行程序,發(fā)現(xiàn)在程序界面出來之前就斷下來了,說明這里就是重啟驗(yàn)證的地方了。
006D7BD7 . E8 10E3FFFF call 006D5EEC ; 過了這個(gè)call。就生成了真碼
006D7BDC . 8B55 C0 mov edx,dword ptr ss:[ebp-0x40] ; edx就是真碼了
006D7BDF . A1 3C3F7000 mov eax,dword ptr ds:[0x703F3C] ;
006D7BE4 . 8B00 mov eax,dword ptr ds:[eax]
006D7BE6 . 8B80 80060000 mov eax,dword ptr ds:[eax+0x680] ; eax就是假碼了
006D7BEC . E8 4BD2D2FF call 00404E3C ; 在這里比較真碼和假碼了
006D7BF1 75 7D jnz short 006D7C70 ; 這里就是關(guān)鍵跳,直接nop掉。
對(duì)這些代碼進(jìn)行簡(jiǎn)單分析,就找到了關(guān)鍵跳,直接nop掉就行了。此時(shí)就不會(huì)再出現(xiàn)要試用的界面了,直接進(jìn)入主界面。
4、把修改后的程序進(jìn)行保存。
二、總結(jié)
這個(gè)軟件的破解關(guān)鍵就是找到軟件啟動(dòng)時(shí)的重啟驗(yàn)證的代碼。我自己是歪打正著找到的,而視頻中是用的設(shè)置API斷點(diǎn)的方法。
既然是重啟驗(yàn)證,那么在驗(yàn)證時(shí)肯定要讀取原來輸入的假碼;而注冊(cè)表就是保存假碼的好地方。根據(jù)這個(gè),對(duì)RegCreateKeyExA這個(gè)API下斷點(diǎn)從而找到了重啟驗(yàn)證的地方。