申請加入BCG破文二--一位元組暴力破解S-Demo2.0 (7千字)

看雪資料發表於2001-10-27

一位元組暴力破解Screen-Demo2.0

作者:maomao
軟體:Screen-Demo2.0
    Screen-Demo2.0是一個極棒的螢幕抓錄軟體,一般被Cracker用於錄製動畫解密教程。
下載:http://www.qwerks.com/download/2834/SD20Setup.exe(950KMB)
工具:W32Dasm8.93 UltraEdit8.0
日期:2001-10-27

  昨天寫了一篇ScreenRecord1.2的註冊破文和序號產生器編寫過程,網友的鼓勵給我了很大的信心。於是又按捺不住,下載了一個壓縮率更高的螢幕製作軟體Screen-Demo2.0,安裝後有三個主要檔案:S-Recorder(錄製主檔案)、S-Player(播放器)、S-Capture(拷屏),安裝後試用,發現錄製1分鐘左右的內容做成AVI,才400多K!而如果用ScreenRecord1.2製作,需要30M左右!強烈的責任感驅使我破解它,現把破解過程記錄如下,當作申請加入BCG組織的第二篇破文,不足之處,望各位高手多多指點…… :)

  首先,用 Language 2000 偵測,沒有殼,省了不少事。
   
    執行S-Recorder,出來一個註冊對話方塊,完全在情理之中,隨便輸入一些內容,按“OK”後提示“Register Failure!”,沒關係,一名cracker最基本的素質是需要有耐心。
    進入到程式目錄,開啟S-Demo.ini檔案,你可以看到如下內容:
[Register]
Install=HKCSRC0RG0QGVQZVKZK
Name=maomao    
Password=1234567890

[Option]
DoubleSize=1
Color=3
ImageQuality=64
AlwayNoImage=0
CompressNow=1
CaptureSpeed=2
KeyFrame=20
SlowRecord=0
SlowMinute=1
Audio=1
  其中Name和Password就是你剛才輸入的內容。看來S-Recorder是讀取S-Demo.ini中的註冊資訊,再進行計算比較,如果用Name計算出來的Password與其中的不一樣,就要彈出註冊視窗了!OK,思路確定:尋找程式中讀取INI檔案的函式,再分析讀完後的比較判斷語句,小作修改後,嘿嘿,讓它認為這個Password是對的....(竊笑三聲)
  使用靜態反編譯工具W32Dasm8.93進行反編譯,一會兒程式程式碼就在W32Dasm的視窗中了。選擇選單“函式”->“輸入”或點選W32Dasm工具欄上的“IMP”按鈕,彈出一個輸入函式對話方塊,其中列出了程式輸入的所有外部函式。排在第一、二位的RegOpenKeyA和RegQueryValueExA正是我們要找的函式!它們負責開啟登錄檔或INI檔案的主鍵和讀取鍵值。雙擊RegOpenKeyA,我們會來到這一段程式碼:

* Referenced by a CALL at Address:
|:004035C2                         <=====從這裡的地址跳來
|
:00407C30 83EC0C                  sub esp, 0000000C
:00407C33 56                      push esi

* Reference To: ADVAPI32.RegOpenKeyA, Ord:0171h
                                  |
:00407C34 8B3500904100            mov esi, dword ptr [00419000]<=====游標條停在這一行
:00407C3A 8D442404                lea eax, dword ptr [esp+04]
:00407C3E 57                      push edi
:00407C3F 50                      push eax
 
  原來是004035C2讀取登錄檔和INI檔案。趕快按下SHIFT+F12,輸入004035C2,回車後來到這裡:
:004035BC A4                      movsb
:004035BD B9C0E74200              mov ecx, 0042E7C0
:004035C2 E869460000              call 00407C30  <=====呼叫讀登錄檔和INI函式(游標停在這裡)
:004035C7 B9C0E74200              mov ecx, 0042E7C0
:004035CC E89F480000              call 00407E70  <=====計算並比較註冊碼
:004035D1 85C0                    test eax, eax
:004035D3 0F8544010000            jne 0040371D    <=====跳走就完了
:004035D9 50                      push eax
:004035DA 8D4C2438                lea ecx, dword ptr [esp+38]
:004035DE E84DDEFFFF              call 00401430
:004035E3 6894E84200              push 0042E894
:004035E8 8D8C2498000000          lea ecx, dword ptr [esp+00000098]
:004035EF C68424D801000004        mov byte ptr [esp+000001D8], 04
 
  將游標停在:004035CC E89F480000  call 00407E70 這一行上,接向右的游標鍵“->”,程式會來到407E70開始的程式段:
* Referenced by a CALL at Address:
|:004035CC                  <=====說明這段程式的呼叫者
|
:00407E70 81ECD0000000            sub esp, 000000D0 <=====游標停在這一行上
:00407E76 53                      push ebx
:00407E77 55                      push ebp
:00407E78 56                      push esi
:00407E79 8BE9                    mov ebp, ecx
:00407E7B 57                      push edi
:00407E7C 896C2410                mov dword ptr [esp+10], ebp

...                        (這裡是讀使用者的資訊,程式比較長,故省略)

一直來到這裡:
* Possible StringData Ref from Data Obj ->"Clayman"
                                  |
:00407F9D BED0D14100              mov esi, 0041D1D0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407FC4(C)
|
:00407FA2 8A13                    mov dl, byte ptr [ebx]  <=====讀取使用者註冊碼第一位元組(已變換)
:00407FA4 8A0E                    mov cl, byte ptr [esi]  <=====讀取正確註冊碼第一位元組(已變換)
:00407FA6 8AC2                    mov al, dl
:00407FA8 3AD1                    cmp dl, cl              <=====比較 
:00407FAA 751E                    jne 00407FCA            <=====不相同就跳走
:00407FAC 84C0                    test al, al
:00407FAE 7416                    je 00407FC6
:00407FB0 8A4B01                  mov cl, byte ptr [ebx+01]<=====取使用者註冊碼下一位元組(已變換)
:00407FB3 8A5601                  mov dl, byte ptr [esi+01]<=====取正確註冊碼下一位元組(已變換)
:00407FB6 8AC1                    mov al, cl    
:00407FB8 3ACA                    cmp cl, dl              <=====比較
:00407FBA 750E                    jne 00407FCA            <=====不相同就跳走
:00407FBC 83C302                  add ebx, 00000002
:00407FBF 83C602                  add esi, 00000002
:00407FC2 84C0                    test al, al
:00407FC4 75DC                    jne 00407FA2          <=====沒有比較完則繼續比較
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407FAE(C)
|
:00407FC6 33C0                    xor eax, eax
:00407FC8 EB05                    jmp 00407FCF

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407FAA(C), :00407FBA(C)
|
:00407FCA 1BC0                    sbb eax, eax
:00407FCC 83D8FF                  sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407FC8(U)
|
:00407FCF 85C0                    test eax, eax                 
:00407FD1 741B                    je 00407FEE                    <=====註冊比較正確時跳轉
:00407FD3 8B542410                mov edx, dword ptr [esp+10]    <=====註冊碼錯誤的程式段
:00407FD7 5F                      pop edi
:00407FD8 5E                      pop esi
:00407FD9 5D                      pop ebp
:00407FDA C782D000000001000000    mov dword ptr [ebx+000000D0], 00000001
:00407FE4 33C0                    xor eax, eax                    <=====執行到這裡就完了
:00407FE6 5B                      pop ebx
:00407FE7 81C4D0000000            add esp, 000000D0
:00407FED C3                      ret



* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00407F77(C), :00407FD1(C)
|
:00407FEE 8B442410                mov eax, dword ptr [esp+10]<=====如果註冊碼正確就會跳到這裡
:00407FF2 5F                      pop edi
:00407FF3 5E                      pop esi
:00407FF4 5D                      pop ebp
:00407FF5 C780D000000000000000    mov dword ptr [ebx+000000D0], 00000000<=====送標誌
:00407FFF B801000000              mov eax, 00000001          <=====哈哈,有沒有看到這個標誌?!
:00408004 5B                      pop ebx
:00408005 81C4D0000000            add esp, 000000D0
:0040800B C3                      ret

  這樣,只要將00407FD1處的跳轉指令74 1B(je 00407FEE)改為EB 1B(jmp 00407FEE)即可。用UltraEdit開啟S-Recorder.exe,修改偏移量為0x7FD1處的程式碼74 1B為EB 1B,哈哈,只修改了一個位元組!

  說明:由於本人功力不深,又懶得分析其機器程式碼的生成和使用者輸入註冊碼的多次變換,所以也寫不出一個通用的序號產生器,有興趣的可以分析一下上面的輪換機制。本人分析不當之處,請多多指教。
  收工~~~~~~

相關文章