昨日練習了一把如何破解Delphi軟件。下面和大家分享一下破解的過程,對初學者,希望有授之以漁的作用。
首先分析我們的目標軟件,不要問我破解的是什么軟件。保護知識產權,要從娃娃抓取。
目標軟件是一個銷售系統,它有時間限制,安裝完成后可以正常運行,把系統時間調后一年,軟件不能正常執行,再把系統時間調回,效果依然一樣。
在使用過期軟件時,系統依然能夠登陸,但是在點擊菜單的時候,彈出您使用的軟件已經過期的字樣。
下手:
1.觀察程序的目錄結構,程序主要就是一個exe文件,其余有兩個ddl,察看屬性,是borland公司的。
2.使用UltraEdit打開這個軟件的主執行文件,看看頭部,沒有加殼。看看中間的資源代碼,出現TLabel等開頭的字符,顯然該軟件是Delphi開發的
3.使用Dede打開這個軟件的exe文件,進行分析和二次詳細分析。
4我們知道,在登陸過程中顯然沒有進行過期驗證,而是在菜單的表單彈出來之前驗證的,目標明確,我們直奔主Form文件。打開窗體標簽,從中發現了TMainForm,在右邊的代碼中我們看到了工具欄常見的代碼
object ToolButton4: TToolButton
Left = 124
Top = 0
Cursor = crHandPoint
Hint = '客戶資料管理'
Caption = 'ToolButton4'
ImageIndex = 4
OnClick = ToolButton4Click
end
我們從中選取幾個按鈕的事件。例如 OnClick = ToolButton4Click 和OnClick = ToolButton5Click
5。進入過程標簽,從里面選取MainFormUnit,在右邊的事件地址列表中找到我們剛才選取的ToolButton4Click,ToolButton5Click,點擊右鍵,反匯編。生成的代碼均包含這樣一段
* Reference to : TMainForm.Proc_005FA21C()
|
005FABB4 E863F6FFFF call 005FA21C
005FABB9 84C0 test al, al
005FABBB 0F85B3000000 jnz 005FAC74
在這里,如果jnz跳轉了,那么整個過程就結束了,毫無疑問,jnz上面的call就是進行驗證的地方。
雙擊這個call,我們跟蹤進去。沒有什么特別的地方,但是發現這樣的代碼
* Possible String Reference to: '當數據備份與恢復窗口打開時,不能打開
| 其它的窗口'
|
005FA24B BA64A25F00 mov edx, $005FA264
也就是說這個全局函數在檢驗是否過期之后,還進行其他的合法性檢查,如果察看其他的click事件,會發現還有一些用戶權限的檢查。那么我們往上找
* Reference to : THYMain._PROC_00547434()
|
005FA228 E807D2F4FF call 00547434
005FA22D 84C0 test al, al
005FA22F 7404 jz 005FA235
005FA231 B301 mov bl, $01
005FA233 EB22 jmp 005FA257
這個00547434,如果執行后沒問題,jz才可以繼續執行。可疑,我們繼續跟蹤進去,雙擊該函數
奇跡發生了,我們看到了什么?
* Possible String Reference to: '您使用的軟件是試用版,試用期限將到?
| 綣絛褂茫肽胛頤橇擔?
| 購買軟件的使用權限。不然將影響您的?
| ぷ?您已輸入的數據不會丟失,注冊后?
| 杉絛褂?'
|
00547457 BAA8745400 mov edx, $005474A8
顯然,這個函數就是判斷過期的地方,一旦過期就會發出警告窗口。
地方找到了,我們仔細分析一下他的結構,有兩個地方可以發生檢查
00547434 53 push ebx
00547435 56 push esi
00547436 8BF0 mov esi, eax
00547438 33DB xor ebx, ebx
* Reference to field THYMain.OFFS_003C
|
0054743A 837E3C02 cmp dword ptr [esi+$3C], +$02
0054743E 7407 jz 00547447
00547440 8BC6 mov eax, esi
* Reference to: HYMainUnit.Proc_00545E00
|
00547442 E8B9E9FFFF call 00545E00
* Reference to field THYMain.OFFS_003C
|
00547447 837E3C01 cmp dword ptr [esi+$3C], +$01
0054744B 7522 jnz 0054746F
* Reference to TApplication instance
|
0054744D A138316000 mov eax, dword ptr [$00603138]
00547452 8B00 mov eax, [eax]
* Reference to field TApplication.Handle : HWnd
|
00547454 8B4024 mov eax, [eax+$24]
* Possible String Reference to: '您使用的軟件是試用版,試用期限將到?
| 綣絛褂茫肽胛頤橇擔?
| 購買軟件的使用權限。不然將影響您的?
| ぷ?您已輸入的數據不會丟失,注冊后?
| 杉絛褂?'
|
00547457 BAA8745400 mov edx, $005474A8
* Reference to: Unit_00500794.Proc_00500ED4
|
0054745C E8739AFBFF call 00500ED4
00547461 33D2 xor edx, edx
* Reference to field THYMain.OFFS_00C4
|
00547463 8B86C4000000 mov eax, [esi+$00C4]
* Possible reference to virtual method THYMain.OFFS_00C0
|
00547469 FF96C0000000 call dword ptr [esi+$00C0]
* Reference to field THYMain.OFFS_003C
|
0054746F 837E3C02 cmp dword ptr [esi+$3C], +$02
00547473 7524 jnz 00547499
* Reference to TApplication instance
|
00547475 A138316000 mov eax, dword ptr [$00603138]
0054747A 8B00 mov eax, [eax]
* Reference to field TApplication.Handle : HWnd
|
0054747C 8B4024 mov eax, [eax+$24]
* Possible String Reference to: '您使用的軟件是試用版,如果您要繼續?
| 褂茫肽胛頤橇擔郝蛉砑氖褂?
| 權限(您已輸入的數據不會丟失,注冊后
| 可繼續使用)'
|
0054747F BA48755400 mov edx, $00547548
* Reference to: Unit_00500794.Proc_00500ED4
|
00547484 E84B9AFBFF call 00500ED4
00547489 33D2 xor edx, edx
* Reference to field THYMain.OFFS_00C4
|
0054748B 8B86C4000000 mov eax, [esi+$00C4]
* Possible reference to virtual method THYMain.OFFS_00C0
|
00547491 FF96C0000000 call dword ptr [esi+$00C0]
00547497 B301 mov bl, $01
00547499 8BC3 mov eax, ebx
0054749B 5E pop esi
0054749C 5B pop ebx
0054749D C3 ret
一個是0054744B jnz 0054746F
另一個是00547473 jnz 00547499
顯然,下面要做的不用說了吧,就是75->EB的工作了,呵呵。總算舒了一口氣,
6.注意哦,這里的地址都是相對地址,Dede提供了一個轉到物理地址的工具,在工具菜單里面。我們使用它得到這兩句的物理地址是0014684B,00146873
7不用多了,打開UltraEdit,找到這兩個地址。做你該做的事!
后記:本科苦學匯編語言,今天總算發揮了點作用,不知道是欣慰呢,還是無奈!