win2000下手動破解Elib2.01 (17千字)

看雪資料發表於2002-03-28

win2000下手動破解Elib2.01。
1.此破解教程僅供學習,不得用於商業用途。
2.破解工具:SoftICE4.05(98下)、UPX、W32DSM89、HIEW6.81。
3.原版檔案下載(當前最新版本2.01):http://newhua.infosail.com/down/elib_cn.exe
4.使用的彙編指令:
機器碼        指令格式    測試條件    跳轉含義
0F 84 cw/cd     JE rel16/32     ZF=1        等於
0F 85 cw/cd     JNE rel16/32     ZF=0        不等於
74        JZ/JE      Z=1         零/等於
75        JNZ/JNE      Z=0         不為零/不等於 
E9   cw/cd     JMP rel16/32      無條件
90              NOP           

注:rel16/32  表示 16或32 位相對地址
ZF(Zero Flag)零標誌,運算結果為0時ZF位置1,否則置0.


軟體簡介:
    作為網頁收藏、儲存和編輯的工具,Elib會給您帶來極大的方便,並幫助您逐步建立自己的知識庫。
編譯工具:Borland C++
加殼:      UPX1.2W
技術:      該軟體使用OLE或COM技術,採用控制元件,完成儲存網頁功能。其它如輸出成CHM檔案,則使用了微軟的工具,不知是否可以如此捆綁?!

    3月26日在pediy論壇看到一篇ssljx的《演算法分析》很受啟發,TAE!提供的註冊碼又無法上網啟用,可能已被封號,我在測試過程中使用新號啟用時也發現有此現象。ssljx的演算法分析很是獨道,可惜我功力尚淺,無法做出序號產生器來,所以就轉換思路,使用了另一種方法,直接修改原檔案,也就是俗稱的“爆破”。

    由於我在win2000下使用的SOFTICE4.05老是出問題,所以一般要除錯的話,都會轉到WIN98下進行。
啟動載入Softice,進入win98,執行elib,點選選單“幫助”->“啟用並註冊”,彈出“註冊”對話方塊。輸入註冊碼,格式為ELIBA-11111-22222-33333-44444。數字可隨便填寫。
Ctrl+D進入Softice
下bpx hmemcpy,
按F5回到Elib,
點選“下一步”按鈕,被抓,
下bd 0或(bd *),
按F12,13次後彈出“註冊碼錯誤”對話方塊,
點“確定”,返回Softice,
下BE 0(或be *)
按F5回到Elib,
點選“下一步”按鈕,被抓,
按F12,12次停在
0167:004304de CMP DWORD PTR[EBP-08],00
按F10,數次來到
0167:0043073e CALL 0045BDC4 (執行到此處會彈出“註冊碼錯誤”對話方塊),記下位置0043073e,W32ASM會用到。
之後就可不用SOFTICE了。可直接進入WIN2000手動開始破解。不過為了方便,我們先破解程式的一處看看效果如何。
使用SOFTICE除錯時,發現elib的“天空”在UPX下,試一試用UPX能不能脫殼。還好手上有UPX1.20w。
備份elib.exe,
下upx -d elib.exe,
脫殼成功,解開的檔案有2.82MB。
執行W32Asm8.93開啟此檔案,下Shitf+F12,在位移處輸入上面記下的地址0043073e。
停在
* Reference To: eLib.TGlobal::InfoBox(())//這就是我們見到的“註冊碼錯誤“對話方塊了。
                                  |
:0043073E E881B60200              call 0045BDC4

往上走,會看到什麼。到這裡。
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)//是不是意外的驚喜,看名字是什麼,檢測註冊碼是否正確?找到這裡,整個檢測註冊碼的核心被找到。
                                  |
:004305AF E848540300              call 004659FC        //關鍵,記下004659FC這個值。
:004305B4 33C9                    xor ecx, ecx
:004305B6 83C408                  add esp, 00000008
:004305B9 8AC8                    mov cl, al
:004305BB BA02000000              mov edx, 00000002
:004305C0 83F901                  cmp ecx, 00000001
:004305C3 1BC0                    sbb eax, eax
:004305C5 F7D8                    neg eax
:004305C7 50                      push eax        //註冊碼正確,此處值為0,值存入堆疊
:004305C8 8D45E8                  lea eax, dword ptr [ebp-18]
:004305CB FF4DC4                  dec [ebp-3C]
:004305CE E89DF90E00              call 0051FF70
:004305D3 59                      pop ecx        //堆疊eax的值彈給ecx
:004305D4 84C9                    test cl, cl        //判斷註冊碼是否正確,正確為0
:004305D6 0F8484000000            je 00430660        //註冊碼正確就跳。此處修改為jmp 00430660
//記下此處的檔案位移,可在W32asm的狀態列獲得為@offset 0002fbd6h,hiew會用到它。
:004305DC 66C745B84400            mov [ebp-48], 0044
:004305E2 33C0                    xor eax, eax
:004305E4 8D55DC                  lea edx, dword ptr [ebp-24]
:004305E7 8945DC                  mov dword ptr [ebp-24], eax
:004305EA 52                      push edx
:004305EB FF45C4                  inc [ebp-3C]

* Possible StringData Ref from Data Obj ->"Registration number is invalid!"
                                  |
:004305EE BA15785300              mov edx, 00537815
:004305F3 8D45E0                  lea eax, dword ptr [ebp-20]
:004305F6 E865F70E00              call 0051FD60
:004305FB FF45C4                  inc [ebp-3C]
:004305FE 8D4DE0                  lea ecx, dword ptr [ebp-20]
:00430601 51                      push ecx

* Possible StringData Ref from Data Obj ->"strRegNumInvalid"
                                  |
:00430602 BA04785300              mov edx, 00537804
:00430607 8D45E4                  lea eax, dword ptr [ebp-1C]
:0043060A E851F70E00              call 0051FD60
:0043060F FF45C4                  inc [ebp-3C]
:00430612 8D55E4                  lea edx, dword ptr [ebp-1C]
:00430615 A16C3B5500              mov eax, dword ptr [00553B6C]
:0043061A 59                      pop ecx

    呼叫hiew6.81,選擇elib.exe檔案,
F4選Decode mode,
F5,輸入先前記下的檔案位移0002fbd6
F3,修改0F8484000000為90E984000000,
F9。
執行一下看看,在註冊碼中輸入
ELIBA-11111-22222-33333-44444,點下一步,不會彈出“註冊碼錯誤“對話方塊了,並且進入一個新的對話方塊中。連網啟用一下試試,成功了。(要注意,一個註冊碼不能多次啟用,小心被封)。
我們還有許多工作要做,這只是elib判斷註冊碼是否正確的一個地方,其它還有許多呢。以下會具體說明。
分析總結一下,很明顯elib使用函式eLib.TGlobal::IsValidSerialNo(System::AnsiString)來判斷註冊碼是否正確,註冊碼正確,則eax值為0,否則為1。之後會有跳轉判斷。修改為無條件跳轉,應該會成功。有人說將此函式修改一下不就行了,我進入函式看了一下,較複雜,只有等待高手來做了。記下eLib.TGlobal::IsValidSerialNo(System::AnsiString)函式位置004659FC。
現在我們收拾東西進入win2000開始手動破解elib2.01,心情開始激動起來。

進入WIN2000,將日期向後調,如增加一年。首先執行elib上網啟用一下,注意註冊碼可能已被封,多試幾個數字即可。
執行W32ASM和HIEW,分別開啟elib.exe檔案。準備修改。
在W32ASM中下shitf+F12,在位移處填入004659FC(即IsValidSerialNo函式位置),會停在
Exported fn(): TGlobal::IsValidSerialNo(System::AnsiString) - Ord:027Fh
:004659FC 55                      push ebp

它的下面就是函式IsValidSerialNo(System::AnsiString)具體實現,較複雜,也難為作者了。
我們不管它,記下有什麼地方呼叫它即可。往上看就知道了。有13處呼叫了它。我們開始一個一個攻破它。
* Referenced by a CALL at Addresses:
|:00406457  , :00406716  , :004069E5  , :00407C3B  , :00407EC8 
|:00408A68  , :0040BF7D  , :0040F779  , :004147D6  , :0042F8F9 
|:004305AF  , :00431FFF  , :00465BA5 
|
(1)00406457
在W32ASM中下SHIFT+F12,輸入00406457
停在
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)
                                  |
:00406457 E8A0F50500              call 004659FC        //呼叫IsValidSerialNo
:0040645C 83C408                  add esp, 00000008    //判斷
:0040645F 84C0                    test al, al          //
:00406461 0F84EB000000            je 00406552          //al值為0(即註冊碼正確)則跳
:00406467 E8E0A71100              call 00520C4C
可不要上當,這裡要改的話,會彈出一個“你使用的軟體為盜版”對話方塊。
此處可忽略。

(2)00406716
在W32ASM中下SHIFT+F12,輸入00406716
停在
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)
                                  |
:00406716 E8E1F20500              call 004659FC        //呼叫IsValidSerialNo
:0040671B 83C408                  add esp, 00000008
:0040671E BA02000000              mov edx, 00000002
:00406723 50                      push eax
:00406724 8D45FC                  lea eax, dword ptr [ebp-04]
:00406727 FF4B1C                  dec [ebx+1C]
:0040672A E841981100              call 0051FF70
:0040672F 59                      pop ecx
:00406730 84C9                    test cl, cl        //
:00406732 0F84E3010000            je 0040691B          //此處改為jne 0040691B,記下位移@offset 5d32h
:00406738 66C743101400            mov [ebx+10], 0014
:0040673E 8B06                    mov eax, dword ptr [esi]
:00406740 50                      push eax
:00406741 33D2                    xor edx, edx
:00406743 8955F8                  mov dword ptr [ebp-08], edx
:00406746 8D4DF8                  lea ecx, dword ptr [ebp-08]
:00406749 51                      push ecx
:0040674A FF431C                  inc [ebx+1C]

在hiew6.81中修改0F84E3010000為0F85E3010000(方法可參考上述)。
效果:修改這裡,會將選單“啟用並註冊”變成灰色。將時間向後調一下,如增加一年,會出現
“過期”對話方塊。

(3)004069E5
在W32ASM中下SHIFT+F12,輸入004069E5
停在
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)
                                  |
:004069E5 E812F00500              call 004659FC
:004069EA 83C408                  add esp, 00000008
:004069ED BA02000000              mov edx, 00000002
:004069F2 50                      push eax
:004069F3 8D45C0                  lea eax, dword ptr [ebp-40]
:004069F6 FF4B1C                  dec [ebx+1C]
:004069F9 E872951100              call 0051FF70
:004069FE 59                      pop ecx
:004069FF 84C9                    test cl, cl
:00406A01 745B                    je 00406A5E        //修改為jne 00406A5E,檔案位移6001h
:00406A03 66C743106800            mov [ebx+10], 0068
:00406A09 BAE12E5200              mov edx, 00522EE1
:00406A0E 8D45BC                  lea eax, dword ptr [ebp-44]
:00406A11 E84A931100              call 0051FD60
:00406A16 FF431C                  inc [ebx+1C]
:00406A19 33C0                    xor eax, eax
:00406A1B 8945B8                  mov dword ptr [ebp-48], eax
:00406A1E 8D55BC                  lea edx, dword ptr [ebp-44]
:00406A21 FF431C                  inc [ebx+1C]
:00406A24 8D4DB8                  lea ecx, dword ptr [ebp-48]
:00406A27 8B06                    mov eax, dword ptr [esi]
:00406A29 83C064                  add eax, 00000064
:00406A2C E897951100              call 0051FFC8
:00406A31 8D55B8                  lea edx, dword ptr [ebp-48]
:00406A34 8D45C4                  lea eax, dword ptr [ebp-3C]
:00406A37 E864951100              call 0051FFA0
:00406A3C FF4B1C                  dec [ebx+1C]
:00406A3F 8D45B8                  lea eax, dword ptr [ebp-48]
:00406A42 BA02000000              mov edx, 00000002
:00406A47 E824951100              call 0051FF70
:00406A4C FF4B1C                  dec [ebx+1C]
:00406A4F 8D45BC                  lea eax, dword ptr [ebp-44]
:00406A52 BA02000000              mov edx, 00000002
:00406A57 E814951100              call 0051FF70
:00406A5C EB0D                    jmp 00406A6B

在hiew6.81中修改745B為755b。
效果:會彈出“軟體沒有啟用”對話方塊,“過期”對話方塊消失。

(4)00407c3b
在W32ASM中下SHIFT+F12,輸入00407c3b
停在
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)
                                  |
:00407C3B E8BCDD0500              call 004659FC
:00407C40 83C408                  add esp, 00000008
:00407C43 84C0                    test al, al
:00407C45 0F95C2                  setne dl        //可在這裡改為 sete dl
:00407C48 83E201                  and edx, 00000001
:00407C4B 8D45FC                  lea eax, dword ptr [ebp-04]
:00407C4E 52                      push edx
:00407C4F BA02000000              mov edx, 00000002
:00407C54 FF4DE8                  dec [ebp-18]
:00407C57 E814831100              call 0051FF70
:00407C5C 59                      pop ecx
:00407C5D 85C9                    test ecx, ecx
:00407C5F 0F84A6000000            je 00407D0B          //上面不改的情況下,可改為je 00407D0B,記下檔案位移725fh
:00407C65 66C745DC1400            mov [ebp-24], 0014
:00407C6B A16C3B5500              mov eax, dword ptr [00553B6C]
:00407C70 50                      push eax
:00407C71 33D2                    xor edx, edx
:00407C73 8955F8                  mov dword ptr [ebp-08], edx
:00407C76 8D4DF8                  lea ecx, dword ptr [ebp-08]
:00407C79 51                      push ecx
:00407C7A FF45E8                  inc [ebp-18]

在HIEW中在檔案位移725fh將0F84A6000000改為0F85A6000000
效果:末知

(5)00407ec8
00407eec 0f84a6000000 檔案位移74ech    改為0f85a6000000
(6)00408a68
00408a8c 0f84a3000000 檔案位移808ch    改為0f85a3000000
(7)0040bf7d
0040bfa1 0f84a6000000 檔案位移b5a1h    改為0f84a6000000
效果:末知

(8)0040f779
0040f7a0 747c 檔案位移eda0h    改為757c
效果:標題欄“unregister”消失。

(9)004147d6
004147f2 0f8451010000 檔案位移13df2h     改為0f8551010000
效果:“關於”對話方塊顯示註冊成功,“軟體沒有啟用”對話方塊消失。

(10)0042f8f9
:0042f94d 7407 //2ef4dH 暫不修改
效果:末知

(11)004305af
這裡就是我們在win98修改過的地方,修改後不會彈出“註冊碼錯誤”對話方塊,到這裡,上網就可啟用。
:004305d6 0f8484000000 //檔案位移2fbd6h 改為  0f8584000000或者90e984000000
效果:如上

(12)00431fff
:00432009 0f85ab000000 //檔案位移31609h 改為0f84ab000000
效果:末知

(13)00465ba5
:00465baf 0f84bf000000 //檔案位移651af 0f85bf000000
效果:“軟體沒有啟用”對話方塊消失,可使用工具欄提供的“原始碼”和“編輯”功能。

到這裡,可暫停對程式的修改,因為還有其它地方要解決。先試用一下elib,開啟一網頁,試著儲存一下。會彈出“網頁無法儲存”對話方塊。因為過期後不支援儲存功能,分析一下,我們已對ELIB呼叫IsValidSerialNo的地方都修改過了,是不是有其它檔案還有呼叫了。我們發現在elib目錄中還有一個檔案
htmlcollect.dll。
下upx -d htmlcollect.dll脫殼。
用W32asm開啟檔案,點選exports工具,又發現IsValidSerialNo的身影。
0043558c位置呼叫了這個函式,

(14)0043558c(檔案htmlcollect.dll)
:0043573f 0f84bf000000 //檔案位移34d3fh 改為0f85bf000000
效果:可儲存網頁了。

既然這樣,我們仔細檢查elib目錄中的檔案還有呼叫IsValidSerialNo的,
發現在bookview.dll,batchadd.exe都有呼叫。全修改了!

(15)004255ed(檔案bookview.dll)
:004255ed 0f84bf000000 //檔案位移24bf7h 改為0f85bf000000

(16)00434b28(檔案batchadd.exe)
:00434b28 0f84bf000000 //檔案位移342dbh 改為0f85bf000000

現在試用一下,正常,但如果使用“匯出”功能的話,還會彈出“報告bug”對話方塊。
看來elib檔案中還有檢測,
用w32asm檢視elib中的EXPORTS函式,發現一個eLib.TGlobal::GetSerialNo(void)。

Exported fn(): TGlobal::GetSerialNo(void) - Ord:0283h
:004668FC 55                      push ebp
:004668FD 8BEC                    mov ebp, esp

檢視呼叫該函式的地方
* Referenced by a CALL at Addresses:
|:0040643E  , :00406705  , :0040676A  , :004069D6  , :00407C2C 
|:00407C7D  , :00407EB9  , :00407F0A  , :00408A59  , :00408AAA 
|:0040BF6E  , :0040BFBF  , :0040F76A  , :004147C7  , :0041481A 
|:00414877  , :00418979  , :0042F8EA  , :00430AE2  , :004320E2 
|:00465BFB 
|                                   
分析函式呼叫位置,將呼叫GetSerialNo(void)之後,又呼叫IsValidSerialNo的地方排除之後,
只剩下
(17)00407C7D
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:00407C7D E87AEC0500              call 004668FC

:00407CAB 50                      push eax
:00407CAC 8D45F8                  lea eax, dword ptr [ebp-08]
:00407CAF FF4DE8                  dec [ebp-18]
:00407CB2 E8B9821100              call 0051FF70
:00407CB7 59                      pop ecx
:00407CB8 84C9                    test cl, cl
:00407CBA 744F                    je 00407D0B        //修改為jne 00407D0B,檔案位移72bah

(18)00407F0A
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:00407F0A E8EDE90500              call 004668FC

:00407F38 50                      push eax
:00407F39 8D45F8                  lea eax, dword ptr [ebp-08]
:00407F3C FF4DEC                  dec [ebp-14]
:00407F3F E82C801100              call 0051FF70
:00407F44 59                      pop ecx
:00407F45 84C9                    test cl, cl
:00407F47 744F                    je 00407F98        //修改為jne 00407F98,檔案位移7547h

(19)00408AAA
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:00408AAA E84DDE0500              call 004668FC                                   

:00408AD8 50                      push eax
:00408AD9 8D45F4                  lea eax, dword ptr [ebp-0C]
:00408ADC FF4E1C                  dec [esi+1C]
:00408ADF E88C741100              call 0051FF70
:00408AE4 59                      pop ecx
:00408AE5 84C9                    test cl, cl        
:00408AE7 744C                    je 00408B35          //修改為jne 00408B35,檔案位移80e7h

(20)0040BFBF
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:0040BFBF E838A90500              call 004668FC

:0040BFED 50                      push eax
:0040BFEE 8D45F8                  lea eax, dword ptr [ebp-08]
:0040BFF1 FF4DDC                  dec [ebp-24]
:0040BFF4 E8773F1100              call 0051FF70
:0040BFF9 59                      pop ecx
:0040BFFA 84C9                    test cl, cl        
:0040BFFC 744F                    je 0040C04D          //修改為jne 0040C04D,檔案位移b5fch

(21)其它位置
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:00418979 E87EDF0400              call 004668FC        //忽略
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:00430AE2 E8155E0300              call 004668FC        //忽略
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:004320E2 E815480300              call 004668FC        //忽略
* Reference To: eLib.TGlobal::GetSerialNo(void)
                                  |
:00465BFB E8FC0C0000              call 004668FC        //忽略
修改完成,試執行。可匯出成CHM檔案,“報告bug”對話方塊消失。

    到此為至,整個elib2.01破解完成。經試用,我常用的功能如儲存,匯出均正常。
實現無時間,無功能限制,可上網啟用。
缺點就是:對檔案修改較多,可能會造成末知的錯誤。要使用破解,需要上網啟用。
如果能將呼叫
Exported fn(): TGlobal::IsValidActiveCode() - Ord:0281h
:00465D48 55                      push ebp
的地方也改一改可能效果會更好。

最佳的破解方法應該是能算出註冊碼,演算法分析請參考ssljx的《演算法分析》。

相關文章