暴力破解Paragon CD Emulator時間及功能限制 (7千字)

看雪資料發表於2001-03-24

暴力破解Paragon CD Emulator時間及功能限制

[下載]
    已經很長時間了,估計應該在www.inhua.com下載,手裡的版本為1.02.007

[破解工具]
WDasm
IDA Pro
Trw2000
Regmonitor
Filemonitor

[破解過程]

透過使用軟體來收集資訊發現:

1. 軟體啟動的時候會跳出對話方塊,提示還有多少天的使用期。
2. 超過30天的試用期會提示過期了。程式呼叫一些功能時候也顯示過期了,拒絕呼叫。
3. Regmonitor發現程式找不到user和registration兩個登錄檔的值。
4. Add Image功能因為是Trial Version受到限制。

現在就可以開始動手術了。

使用WDasm和IDA Pro進行反彙編,檢視區別。

首先,cdman.exe經過反彙編,在WDasm的Import裡面,看到了對cdshell的函式的呼叫。看來程式還有一個cdshell.dll,
所以除了反彙編cdman.exe以外,還需要反彙編cdshell.dll。

浪費了許多時間後發現,程式的Trial Version和Full Version的版本號是不同的,因此似乎無法開啟註冊對話方塊來輸入
註冊碼,雖然使用ResHack可以看見註冊對話方塊。所以無法對上述3的資訊進行進一步操作。

IDA裡面甚至看到了license的檔名,cde.lic。不過,這個東東是為網路版應用的,個人版看來只需破解時間限制即可。

由於所有的提示資訊都可以在cdshell.dll的反彙編檔案中找到,所以,它成了主要目標。

既然是時間限制,很容易想到GetSystemTimeA;自從IDA配備了三個查詢Import,Export以及String Reference的plugin
以後,查詢的事情變得很簡單了。經過考慮,加上trw2000在這裡的跟蹤,注意力集中到了下面地方:
.........
.........
:1001C3C9 6800AB0410              push 1004AB00  <-------- IDA裡告訴我們,這裡是放入FlagEx
:1001C3CE 68B8A90410              push 1004A9B8  <-------- 這裡是登錄檔的路徑
:1001C3D3 E868160000              call 1001DA40
.........
.........
:1001C41A E811170000              call 1001DB30
:1001C41F 3BC3                    cmp eax, ebx
:1001C421 7456                    je 1001C479    <-------- 這裡不能跳,否則過期了。
:1001C423 8B54240C                mov edx, dword ptr [esp+0C]
:1001C427 51                      push ecx
:1001C428 8BC4                    mov eax, esp
:1001C42A 895E20                  mov dword ptr [esi+20], ebx
:1001C42D 8D4C241C                lea ecx, dword ptr [esp+1C]

* Possible Reference to String Resource ID=00001: "Create CD Image File"
                                  |
:1001C431 BB01000000              mov ebx, 00000001
:1001C436 8910                    mov dword ptr [eax], edx
:1001C438 8D442414                lea eax, dword ptr [esp+14]
:1001C43C 50                      push eax
:1001C43D E8BE160000              call 1001DB00
:1001C442 8B08                    mov ecx, dword ptr [eax]
:1001C444 B807452EC2              mov eax, C22E4507
:1001C449 F7E9                    imul ecx
:1001C44B 03D1                    add edx, ecx
:1001C44D 8BC3                    mov eax, ebx
:1001C44F C1FA10                  sar edx, 10
:1001C452 8BCA                    mov ecx, edx
:1001C454 C1E91F                  shr ecx, 1F
:1001C457 03D1                    add edx, ecx    <-------- edx顯示還有多少天。
:1001C459 895624                  mov dword ptr [esi+24], edx  <------- 這裡修改edx為1D(29天),程式會認為仍在使用期內
:1001C45C 5F                      pop edi
:1001C45D 5E                      pop esi
:1001C45E 5B                      pop ebx
:1001C45F 83C408                  add esp, 00000008
:1001C462 C3                      ret

經過以上修改,發現程式沒有進行其他的過期檢測。第一步成功。

第二步來解它的NagScreen,就是提醒還有多少天的對話方塊。依舊在cdshell.dll裡面:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006EFD(C)
|
:10006F08 8B442430                mov eax, dword ptr [esp+30]
:10006F0C 85C0                    test eax, eax
:10006F0E 0F84B6000000            je 10006FCA    <----------  跳去顯示NagScreen,因為下面可見“cdshell.cdMessageBox”
:10006F14 8D4C2408                lea ecx, dword ptr [esp+08]
:10006F18 E8EB2B0300              call 10039B08
:10006F1D 8D4C2404                lea ecx, dword ptr [esp+04]
:10006F21 C744244000000000        mov [esp+40], 00000000
:10006F29 E8DA2B0300              call 10039B08
..............
..............
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006F0E(C)
|

* Possible Reference to String Resource ID=00048: "%s/s; %.3f kHz; %i Bits; %s"
                                  |
:10006FCA 6A30                    push 00000030

* Possible Reference to String Resource ID=00062: "You work with the trial version of the program.
This version"
                                  |
:10006FCC 6A3E                    push 0000003E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006F03(U)
|

* Possible Reference to String Resource ID=00140: "Paragon CD Emulator Manager"
                                  |
:10006FCE 688C000000              push 0000008C
* Reference To: cdshell.cdMessageBox
                                  |
:10006FD3 E888FEFFFF              call 10006E60
:10006FD8 83C40C                  add esp, 0000000C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10006EF1(C)
|
:10006FDB 8B4C2438                mov ecx, dword ptr [esp+38]
:10006FDF 8BC6                    mov eax, esi
:10006FE1 64890D00000000          mov dword ptr fs:[00000000], ecx
:10006FE8 5E                      pop esi
:10006FE9 83C440                  add esp, 00000040
:10006FEC C3                      ret

所以乾脆讓10006F0E跳到10006EF1來,結果,程式啟動時候以及以後的NagScreen都不見了。

=======此為 cdshell.dll反彙編的東東==========
Exported fn(): cdTrialInfo - Ord:0027h
:10007750 6A43                    push 00000043

* Possible Reference to String Resource ID=00070: "

This function is unavailable in the trial version.
You can"
                                  |
:10007752 6A46                    push 00000046
* Reference To: cdshell.cdRestrictionInfo
                                  |
:10007754 E8D7FDFFFF              call 10007530
:10007759 83C408                  add esp, 00000008
:1000775C C3                      ret
=======此為 cdman.exe反彙編的東東==========
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040A00F(C), :0040A018(C)
|
:0040A028 E8B39AFFFF              call 00403AE0
:0040A02D 85C0                    test eax, eax
:0040A02F 741F                    je 0040A050    <--------------  需要跳轉。
:0040A031 8B8500010000            mov eax, dword ptr [ebp+00000100]
:0040A037 85C0                    test eax, eax
:0040A039 7515                    jne 0040A050
:0040A03B 8B8504010000            mov eax, dword ptr [ebp+00000104]
:0040A041 85C0                    test eax, eax
:0040A043 750B                    jne 0040A050

* Reference To: cdshell.cdTrialInfo, Ord:0026h    <--------------  要跳過這裡
                                  |
:0040A045 FF15D4CE4500            Call dword ptr [0045CED4]
:0040A04B E9C9040000              jmp 0040A519

總結一下需要修改的地方:
[cdshell.dll]
1.  1001C421 7456  --->  9090

2.  1001C457 03D1                    add edx, ecx                <----  改成mov byte ptr [esi+24], 1D,由於
    1001C459 895624                  mov dword ptr [esi+24], edx  <----  原來6個位元組,改後成5個,要添一個90
   
3.  10006F0E 0F84B6000000            je 10006FCA  --->  jmp 10006EF1

[cdman.exe]
1.  0040A02F 741F                    je 0040A050  --->  jmp 0040A050

於是,破解完成了。:)

不過,希望有高手能講解一下它的時間是如何運算的。

相關文章