這個程式的破解很費了一些時間.
1. 採用常規的方法BPX Getwindowtexta,SICE攔住後F12回到程式,查詢輸入的註冊碼,BPM(或BPR)找到的記憶體地址,發現程式將輸入的註冊碼轉換成16進位制形式(比如12344321變成BC5C01).
用BPM設斷,但程式頻繁地被攔在無關的地方,很快迷失了方向
2. 攔截程式彈出的註冊碼無效的提示,返回程式,經過很久,找不出關鍵的跳轉
3. 用Regmon和Filemon觀察得知,程式不在登錄檔中做手腳,而是讀readbook.ini檔案,試用getprivateprofilestringa設斷,攔住許多次,仍然找不到關鍵之處
單用動態跟蹤看來比較困難,於是轉向靜態分析. 用W32dsm反彙編程式,尋找可疑的字串,找到幾個:
"NowDay"
"File"
"User"
"Register"
"RegisterEncryptMode"
猜測一下,"Nowday"應該是記載執行時的日期,因為未註冊的版本在每天第一次使用時會'打擾'你一下. 註冊成功時,在readbook.ini的[File]專案下會加上User和Register.
"RegisterEncrytMode"應該是程式將註冊碼加密之後寫入ini中.於是想到,既然註冊碼是以加密形式寫入,那麼程式執行時也必須再將其解碼還原以做比較.
好,有辦法了.
1. 手動在readbook.ini中[File]項下加上User=ABCD,Register=12344321
2. 在W32dsm中找"RegisterEncryptMode",共有兩處,你會注意到兩處的程式碼幾乎是一樣的.分別記下首行地址0041F6B7,00409A9F
3. BPX 0041F6B7,00409A9F (在TRW2000中你可直接如此設斷,在SICE中可用Symbol loader載入程式,再設斷)
4. 程式在00409A9F被攔住,
* Possible StringData Ref from Data Obj ->"RegisterEncryptMode"
|
:00409A9F 6860E84500 push 0045E860
:00409AA4 57
push edi
:00409AA5 8945FC
mov dword ptr [ebp-04], eax
:00409AA8 C745F412320000 mov [ebp-0C], 00003212
<-很
:00409AAF C745E434120000 mov [ebp-1C], 00001234
<-有
:00409AB6 C745E888880000 mov [ebp-18], 00008888
<-意
:00409ABD C745F023230000 mov [ebp-10], 00002323
<-思
:00409AC4 E8A6AE0000 call 0041496F
<-做什麼?
:00409AC9 83C410
add esp, 00000010
:00409ACC 85C0
test eax, eax
:00409ACE 7524
jne 00409AF4 <-試著改成je,不成功
5. 程式會提示你註冊碼錯誤,並刪掉我們手動加上的User,Register.
沒關係,重新再來一次
6. F10一直往下走,到了下一個條件跳轉處
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409B34(C)
|
:00409B19 3975FC
cmp dword ptr [ebp-04], esi
:00409B1C 741D
je 00409B3B <-試改成jne
再檢視Help選單,Register選項沒有了,About顯示使用者姓名ABCD. 終於給我找到要害處了. :)
好,再來一次,當游標停在00409B1C行時, ? esi 你就得到真正的註冊碼了. 實際上對於一個使用者名稱而言,不只一個註冊碼,不信往下看.
:00409B1E 8B55EC
mov edx, dword ptr [ebp-14]
:00409B21 8BC8
mov ecx, eax
:00409B23 83E17F
and ecx, 0000007F
:00409B26 03348A
add esi, dword ptr [edx+4*ecx]
:00409B29 40
inc eax
:00409B2A 3DFF0F0000 cmp eax,
00000FFF
:00409B2F A328034600 mov dword
ptr [00460328], eax
:00409B34 72E3
jb 00409B19
程式把你輸入的註冊碼和4095(FFFh)個有效碼相比,只要有一個相同就行.這樣重名的人可以從作者處得到不同的註冊碼.
:00409B36 3975FC
cmp dword ptr [ebp-04], esi <-最後一次機會
:00409B39 7547
jne 00409B82 <-跳走就沒戲了
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409B1C(C)
|
:00409B3B 8B75F8
mov esi, dword ptr [ebp-08]
:00409B3E C70500314B0001000000 mov dword ptr [004B3100], 00000001
:00409B48 FF761C
push [esi+1C]
7. 用得到的註冊碼,註冊程式即可.
特別宣告: 這是個很好的程式,保護也做得不錯.軟體作者定的價格也相當低,不註冊功能也沒限制,只在每天第一次使用時給你個提醒.因此,如果大家使用這個軟體的話,請儘量購買,支援和尊重作者的勞動.本人寫這篇東西,只是做技術交流,所以我在文中沒有給出任何有效的註冊碼.我本人也不用這個軟體(因為在我的英文WIN95加掛Richwin的系統中,這個軟體不能正常顯示文字).