Readbook 1.31破解心得 (3千字)

看雪資料發表於2000-03-01

這個程式的破解很費了一些時間.

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的系統中,這個軟體不能正常顯示文字).

相關文章