一個網友求助的軟體的演算法分析------explzh好象是壓縮與解壓縮軟體

看雪資料發表於2015-11-15

標 題:一個網友求助的軟體的演算法分析------explzh好象是壓縮與解壓縮軟體 

發信人:txm123

時 間: 2003年9月23日 11:24 

詳細資訊:



一個網友求助的軟體的演算法分析------explzh好象是壓縮與解壓縮軟體
    說明:這個軟體的破解是一個網友給我發了一封EMAIL,求助這個軟體的破解,原信如下:
發件人: "Chris Wahl" <smalltalk-80@tom.com>
收件人: 隱去我的郵件地址  抄送: (無)
傳送時間: 2003-09-17 15:00:56  優先順序: 普通
標題: help me to understand Float Computing 
Hello ,  would you like to help me ?, 
I am learning crack . 
the progie I want to crack is explzh, a file compress software
like WinRAR. 
I use OllyDbg 1.09 too, but I found there are lots of floating 
calculation in the code. I am confused. 
 
fortunately , I found your article http://www.jxlb.com/cgi-bin/view.cgi?forum=2&topic=2155
and I think  I can get some help from you. 
 
the progie's site is , the updated version has only Japanese version.
I hope you will not reject 
http://village.infoweb.ne.jp/~fwhv5283/mirror.htm
 
regrards.
Chris
     這是一封英文信件,我的英語水平太菜,看了很久才明白,昨天晚上看到這封信,軟體也發到了我的郵箱,
所以就下來看一看,這是一個日本人做的解壓縮軟體,軟體介面的文字我又不認得,找了半天才找到註冊處,弄
清了演算法,就貼出來看一看,註冊錯誤有資訊,但反彙編找不到,所以只能動態除錯找關鍵點。下載地址在:
http://village.infoweb.ne.jp/~fwhv5283/mirror.htm這也是一個日本網站。

     軟體介紹:好象這是一個壓縮與解壓縮的軟體,我自己也不太清楚。
     破解作者:
  yzez[DFCG]
     破解工具:
  OLLYDBG1.09
     破解過程:
1、OLLYDBG1.09載入要破的程式,點選選單欄上的外掛,選命令列,然後在出現的資訊框裡輸入:bpx hmemcpy,
按Enter鍵,又會出現一個呼叫的CALL的框 ,在所有的CALL上都設定好斷點,然後按F9,反覆按,直至出現註冊
資訊框,輸入註冊資訊,使用者名稱:yzez[DFCG],Email:yzez@163.com,試驗碼:12345678-87654321,點確定,程式
中斷在004B9781處,程式碼如下,說明也在下面:

004B9774  |.  CALL    EXPLZH.004B96EC
004B9779  |.  CMP     DWORD PTR DS:[EDI], 0
004B977C  |.  MOV     ESIEAX
004B977E  |.  JE      SHORT EXPLZH.004B97A8
004B9780  |.  PUSH    ESI                              
004B9781  |.  CALL    DWORD PTR DS:[<&USER32.GetWindow>****此CALL設斷,F9執行程式,輸入任意註冊資訊
004B9787  |.  LEA     ECXDWORD PTR DS:[EAX+1]************點確定,程式被斷,按F8走,這裡連續按F8走
004B978A  |.  PUSH    ECX**********************************會在中斷處迴圈兩次,不要管,繼續按F8,直
004B978B  |.  MOV     ECX, [ARG.3]*************************到00403088處,才到核心段
004B978E  |.  PUSH    EAX
********************************省略************************************************
004B97B3  |>  POP     EDI                              
004B97B4  |.  POP     ESI                              
004B97B5  |.  POP     EBP                              
004B97B6  .  RETN    0C

***********************程式核心段的程式碼如下!***************************************
00403088   .  MOV     EAXDWORD PTR DS:[503C30]*****進入核心處,我們停在這裡!
0040308D   .  MOV     DWORD PTR SS:[ESP+10], EAX
00403091   .  MOV     EAXDWORD PTR SS:[EBP+5C]
00403094   .  MOV     DWORD PTR SS:[ESP+22C], 0
0040309F   .  MOV     ECXDWORD PTR DS:[EAX-8]
004030A2   .  TEST    ECXECX
*************************************省略N行程式碼!*********************************************
004031C6   .  E8 2DEE0A00   CALL    EXPLZH.004B1FF8
004031CB   .  8D4C24 14     LEA     ECXDWORD PTR SS:[ESP+14]
004031CF   .  C68424 2C0200>MOV     BYTE PTR SS:[ESP+22C], 0
004031D7   .  E8 2FED0A00   CALL    EXPLZH.004B1F0B
004031DC   .  8B4424 18     MOV     EAXDWORD PTR SS:[ESP+18]
004031E0   .  8B5424 1C     MOV     EDXDWORD PTR SS:[ESP+1C]
004031E4   .  8B1B          MOV     EBXDWORD PTR DS:[EBX]
004031E6   .  2BF0          SUB     ESIEAX
004031E8   .  1BFA          SBB     EDIEDX
004031EA   .  81EE D78A6E3C SUB     ESI, 3C6E8AD7
004031F0   .  53            PUSH    EBX                             
004031F1   .  MOV     ECX, EXPLZH.0050A328             
004031F6   .  SBB     EDI, 0                           
004031F9   .  CALL    EXPLZH.0042AF60**********這裡是關鍵CALL,按F7跟進!                 
004031FE   .  TEXT    EAXEAX*****************測試EAX的值,註冊成功EAX的值為1,反之值為0
00403200   .  JE      SHORT EXPLZH.00403214****相等就跳,跳就失敗
00403202   .  PUSH    EDI                            
00403203   .  PUSH    ESI                             
00403204   .  MOV     ECXEBP                      
00403206   .  CALL    EXPLZH.004032B0                  
0040320B   .  MOV     ECXEBP
0040320D   .  CALL    EXPLZH.004AE153**********到了這裡我們就是快樂的CRACKER,註冊成功!
00403212   .  JMP     SHORT EXPLZH.0040327F
00403214   >  PUSH    81C7*********************上面不等就會跳到這裡!,向下走幾步,就要你交錢!註冊失敗                             
00403219   .  LEA     ECXDWORD PTR SS:[ESP+14]      
0040321D   .  CALL    EXPLZH.004B24CE                 
00403222   .  ECXDWORD PTR DS:[50A3A0]
00403228   .  MOV     EDXDWORD PTR SS:[ESP+10]
0040322C   .  PUSH    10
0040322E   .  PUSH    ECX
0040322F   .  JMP     SHORT EXPLZH.00403259
00403231   >  MOV     EAXDWORD PTR DS:[50A390]
00403236   .  LEA     EDXDWORD PTR SS:[ESP+24]
0040323A   .  PUSH    200                             
0040323F   .  PUSH    EDX                             
00403240   .  PUSH    80E0*********************** "入力されたレジストコ`ドは" 這是失敗資訊!

**********************************關鍵CALL的程式碼!****************************************

0042AF60  /$  MOV     EAXDWORD PTR FS:[0]****進入關鍵CALL後,我們就在這裡!
0042AF66  |.  PUSH    -1
0042AF68  |.  PUSH    EXPLZH.004CEA68
0042AF6D  |.  PUSH    EAX
0042AF6E  |.  MOV     DWORD PTR FS:[0], ESP
0042AF75  |.  SUB     ESP, 14
0042AF78  |.  PUSH    EBX
0042AF79  |.  PUSH    EBP
0042AF7A  |.  PUSH    ESI
0042AF7B  |.  MOV     ESIDWORD PTR SS:[ESP+30]       
0042AF7F  |.  PUSH    EDI
0042AF80  |.  MOV     EBXECX                         
0042AF82  |.  CMP     BYTE PTR DS:[ESI], 0
0042AF85  |.  JE      EXPLZH.0042B101
0042AF8B  |.  PUSH    0
0042AF8D  |.  PUSH    EXPLZH.004FD278                 
0042AF92  |.  LEA     EAXDWORD PTR SS:[ESP+18]
0042AF96  |.  PUSH    EXPLZH.004FD290                 
0042AF9B  |.  PUSH    EAX
0042AF9C  |.  CALL    EXPLZH.004C57E7
0042AFA1  |.  MOV     EAXDWORD PTR SS:[ESP+10]
0042AFA5  |.  MOV     DWORD PTR SS:[ESP+2C], 0
0042AFAD  |.  MOV     ECXDWORD PTR DS:[EAX-8]
0042AFB0  |.  TEST    ECXECX                        
0042AFB2  |.  JE      EXPLZH.0042B0F0
0042AFB8  |.  PUSH    0
0042AFBA  |.  PUSH    0
0042AFBC  |.  PUSH    EAX
0042AFBD  |.  MOV     ECXEBX
0042AFBF  |.  CALL    EXPLZH.0042B130***************此CALL對使用者名稱進行處理,處理過程是這樣,取使用者名稱各位的
**************ASCII碼值,然後把它們相加,我輸入的使用者名稱是yzez[DFCG],其結果是這樣:79+7A+65+7A+5B+44+46+43+
**************47+5D=39E,結果儲存在EAX中,程式碼就不列了,有興趣自己跟進去看一看!
0042AFC4  |.  PUSH    ESI***************************輸入的試驗碼入ESI
0042AFC5  |.  LEA     ECXDWORD PTR SS:[ESP+14]****儲存使用者名稱運算的結果!
0042AFC9  |.  MOV     DWORD PTR SS:[ESP+20], EAX
0042AFCD  |.  MOV     DWORD PTR SS:[ESP+24], EDX
0042AFD1  |.  CALL    EXPLZH.004B2048
0042AFD6  |.  PUSH    2D****************************2D入棧,2D是“-”的ASCII碼值,註冊碼中必須有“-”,故
************************註冊碼的形式應是:XXXXXXXX-YYYYYYYY
0042AFD8  |.  LEA     ECXDWORD PTR SS:[ESP+14]
0042AFDC  |.  CALL    EXPLZH.004B23B9***************此CALL檢驗註冊碼中是否有“-”,有,就把第一組註冊碼的
*******************位數賦給EAX,沒有EAX賦值為FFFFFFFF(-1)
0042AFE1  |.  MOV     EBPEAX**********************第一組註冊碼的位數8移入EBP中
0042AFE3  |.  CMP     EBP, -1***********************比較EBP是不是-1
0042AFE6  |.  JE      EXPLZH.0042B0F0***************相等就跳,一跳就送你去睡覺!所以註冊碼中必須有“-”
0042AFEC  |.  PUSH    EBP***************************不跳就往下,位數8入棧!我們繼續往下走!
0042AFED  |.  LEA     ECXDWORD PTR SS:[ESP+1C]
0042AFF1  |.  PUSH    0
0042AFF3  |.  PUSH    ECX                             
0042AFF4  |.  LEA     ECXDWORD PTR SS:[ESP+1C]
0042AFF8  |.  CALL    EXPLZH.004AA18B
0042AFFD  |.  PUSH    EXPLZH.0050021C
0042B002  |.  LEA     EDXDWORD PTR SS:[ESP+18]
0042B006  |.  PUSH    EAX
0042B007  |.  PUSH    EDX
0042B008  |.  MOV     BYTE PTR SS:[ESP+38], 1
0042B00D  |.  CALL    EXPLZH.004B2154
0042B012  |.  PUSH    EAX
0042B013  |.  LEA     ECXDWORD PTR SS:[ESP+14]
0042B017  |.  MOV     BYTE PTR SS:[ESP+30], 2
0042B01C  |.  CALL    EXPLZH.004B1FF8
0042B021  |.  LEA     ECXDWORD PTR SS:[ESP+14]
0042B025  |.  MOV     BYTE PTR SS:[ESP+2C], 1
0042B02A  |.  CALL    EXPLZH.004B1F0B
0042B02F  |.  LEA     ECXDWORD PTR SS:[ESP+18]
0042B033  |.  MOV     BYTE PTR SS:[ESP+2C], 0
0042B038  |.  CALL    EXPLZH.004B1F0B
0042B03D  |.  MOV EAXDWORD PTR SS:[ESP+10]****把試驗碼的第一組12345678,注意後面加了H,代表是十六進位制值入EAX
0042B041  |.  PUSH    EAX***********************試驗碼第一組入棧,準備處理
0042B042  |.  CALL    EXPLZH.00478D80
0042B047  |.  MOV     ECXEAX
0042B049  |.  CALL    EXPLZH.00479060
0042B04E  |.  MOV     ECXDWORD PTR SS:[ESP+1C]****把使用者名稱計算後的結果入ECX,這裡是39E,開始計算第一組註冊碼!
0042B052  |.  MOV     ESIEAX**********************第一組試驗碼12345678移入ESI
0042B054  |.  MOV     EDIEDX**********************EDX的值為0,賦EDI的值為0
0042B056  |.  MOV     EDXDWORD PTR SS:[ESP+20]****賦EDX的值為0
0042B05A  |.  SUB     EAXECX**********************EAX=EAX-ECX=12345678-39E=123452DA                         
0042B05C  |.  MOV     ECXEDI**********************EDI的值入ECX
0042B05E  |.  SBB     ECXEDX**********************ECX=ECX-EDX=0
0042B060  |.  SUB     EAX, 3C6E8AD7*****************EAX=EAX-3C6E8AD7=123452DA-3C6E8AD7=D5C5C803
0042B065  |.  SBB     ECX, 0************************ECX=ECX-0=0
0042B068  |.  PUSH    ECX                              
0042B069  |.  PUSH    EAX***************************上述計算後的結果:D5C5C803入棧!
0042B06A  |.  MOV     ECXEBX
0042B06C  |.  CALL    EXPLZH.0042AE00***************在這裡進行比較,我們按F7進去看一看!比較CALL
0042B071  |.  TEST    EAXEAX**********************上面CALL的比較成功,這裡EAX的值為FFFFFFFE,否則EAX的值為0
0042B073  |.  MOV     DWORD PTR SS:[ESP+1C], EAX****儲存EAX的值
0042B077  |.  JE      SHORT EXPLZH.0042B0F0*********相等就跳,一跳就失敗,爆破點1,改成NOP
0042B079  |.  CMP     EAX, -1***********************與-1比較
0042B07C  |.  JE      SHORT EXPLZH.0042B0F0*********相等就跳,一跳就失敗,此處不必改!
0042B07E  |.  MOV     ECXDWORD PTR SS:[ESP+34]****試驗碼入ECX,準備取第二組試驗碼
0042B082  |.  LEA     EDXDWORD PTR DS:[ECX+EBP+1]*第二組試驗碼所在的地址賦給EDX
0042B086  |.  LEA     ECXDWORD PTR SS:[ESP+10]****試驗碼的地址賦給ECX
0042B08A  |.  PUSH    EDX
0042B08B  |.  CALL    EXPLZH.004B2048
0042B090  |.  MOV     EBPDWORD PTR SS:[ESP+1C]****FFFFFFFE(-2)入EBP
0042B094  |.  MOV     EAXDWORD PTR DS:[EAX]*******第二組的試驗碼的地址給EAX
0042B096  |.  CMP     EBP, -2***********************比較EBP是不是-2
0042B099  |.  JNZ     SHORT EXPLZH.0042B0AE*********不相等就跳,跳到下面
0042B09B  |.  CMP     BYTE PTR DS:[EAX], 31*********第二組試驗碼的第一位與31(1)比較
0042B09E  |.  JNZ     SHORT EXPLZH.0042B0AE*********不相等就跳
0042B0A0  |.  MOV     DLBYTE PTR DS:[EAX+1]
0042B0A3  |.  MOV     CL, 34
0042B0A5  |.  CMP     DLCL
0042B0A7  |.  JNZ     SHORT EXPLZH.0042B0AE
0042B0A9  |.  CMP     BYTE PTR DS:[EAX+2], CL
0042B0AC  |.  JE      SHORT EXPLZH.0042B0E2
0042B0AE  |>  PUSH    EXPLZH.0050021C***************跳到這裡!
0042B0B3  |.  LEA     ECXDWORD PTR SS:[ESP+14]
0042B0B7  |.  CALL    EXPLZH.004B229B
0042B0BC  |.  MOV     EAXDWORD PTR SS:[ESP+10]
0042B0C0  |.  PUSH    EAX
0042B0C1  |.  CALL    EXPLZH.00478D80
0042B0C6  |.  MOV     ECXEAX
0042B0C8  |.  CALL    EXPLZH.00479060
0042B0CD  |.  SUB     ESIEAX*********************ESI=ESI-EAX=12345678(第一組試驗碼)-
******************************87654321(第二組試驗碼)=8ACF1357
0042B0CF  |.  MOV     ECXEBX
0042B0D1  |.  SBB     EDIEDX
0042B0D3  |.  PUSH    EDI
0042B0D4  |.  PUSH    ESI**************************上述計算的值8ACF1357入棧
0042B0D5  |.  CALL    EXPLZH.0042AE00**************進行第二次比較,呼叫同一個比較CALL
0042B0DA  |.  TEST    EAXEAX*********************比較的值不相等就賦EAX的值為0
0042B0DC  |.  JE      SHORT EXPLZH.0042B0F0********相等就跳,EAX的值為0就跳,一跳就失敗!不能跳,爆破點2,改JNZ
0042B0DE  |.  CMP     EBPEAX*********************比較EBP與EAX
0042B0E0  |.  JE      SHORT EXPLZH.0042B118********相等就跳,跳就成功!爆破點3,改JE為JMP
0042B0E2  |>  PUSH    -1
0042B0E4  |.  PUSH    10
0042B0E6  |.  PUSH    81EB
0042B0EB  |.  CALL    EXPLZH.004B9A50
0042B0F0  |>  LEA     ECXDWORD PTR SS:[ESP+10]
0042B0F4  |.  MOV     DWORD PTR SS:[ESP+2C], -1
0042B0FC  |.  CALL    EXPLZH.004B1F0B
0042B101  |>  XOR     EAXEAX
0042B103  |>  MOV     ECXDWORD PTR SS:[ESP+24]
0042B107  |.  POP     EDI                              
0042B108  |.  POP     ESI                              
0042B109  |.  POP     EBP                            
0042B10A  |.  POP     EBX                              
0042B10B  |.  MOV     DWORD PTR FS:[0], ECX           
0042B112  |.  ADD     ESP, 20
0042B115  |.  RETN    4
0042B118  |>  LEA     ECXDWORD PTR SS:[ESP+10]*****跳到這裡!
0042B11C  |.  MOV     DWORD PTR SS:[ESP+2C], -1
0042B124  |.  CALL    EXPLZH.004B1F0B
0042B129  |.  MOV     EAX, 1*************************在這裡賦EAX的值為1,這是註冊成功的標誌位
0042B12E  .^ JMP     SHORT EXPLZH.0042B103
0042B130  /$  PUSH    EBX
0042B131  |.  PUSH    EBP
0042B132  |.  MOV     EBPDWORD PTR SS:[ESP+C]       
0042B136  |.  PUSH    ESI
0042B137  |.  PUSH    EDI
0042B138  |.  PUSH    EBP                              
0042B139  |.  XOR     EDIEDI                         ; |
0042B13B  |.  XOR     EBXEBX                         ; |
0042B13D  |.  CALL    DWORD PTR DS:[<&KERNEL32.lstrlen>; lstrlenA
0042B143  |.  MOV     ESIEAX
0042B145  |.  TEST    ESIESI
0042B147  |.  JNZ     SHORT EXPLZH.0042B152
0042B149  |.  POP     EDI                              
0042B14A  |.  POP     EBP                              
0042B14C  |.  XOR     EDXEDX
0042B14E  |.  POP     EBX                              
0042B14F  |.  0C

**********************************比較CALL的程式碼************************************************

0042AE00  /$  MOV     EAXDWORD PTR SS:[ESP+8]****進入比較CALL後我們停在這裡!0入EAX
0042AE04  |.  MOV     ECXDWORD PTR SS:[ESP+4]****把上述運算過的值:D5C5C803移入ECX中
0042AE08  |.  CMP     EAX, 1***********************EAX的值和1比較
0042AE0B  |.  JG      EXPLZH.0042AED0**************如果大於就跳走,不進行後面的比較
0042AE11  |.  JL      SHORT EXPLZH.0042AE1F********如果小於就跳到下面去進行比較
0042AE13  |.  CMP     ECX, 6132023A
0042AE19  |.  JA      EXPLZH.0042AED0
0042AE1F  |>  CMP     ECX, 6132023A****************計算過的值與6132023A比較
0042AE25  |.  JNZ     SHORT EXPLZH.0042AE30********不相等就跳,跳到下面繼續進行比較!
0042AE27  |.  CMP     EAX, 1***********************EAX與1比較
0042AE2A  |.  JE      EXPLZH.0042AEC8**************相等就跳!
0042AE30  |>  TEST    EAXEAX
0042AE32  |.  JG      SHORT EXPLZH.0042AE96
0042AE34  |.  JL      SHORT EXPLZH.0042AE3E********跳到0042AE96
0042AE36  |.  CMP     ECX, F87A404F
0042AE3C  |.  JA      SHORT EXPLZH.0042AE96
0042AE3E  |>  CMP     ECX, F87A404F****************比較計算的值與F87A404F
0042AE44  |.  JNZ     SHORT EXPLZH.0042AE4A********不相等就跳,跳到下面!
0042AE46  |.  TEST    EAXEAX
0042AE48  |.  JE      SHORT EXPLZH.0042AE8E
0042AE4A  |>  CMP     ECX, 87A30DE3****************再與87A30DE3比較
0042AE50  |.  JNZ     SHORT EXPLZH.0042AE56********不相等就跳
0042AE52  |.  TEST    EAXEAX
0042AE54  |.  JE      SHORT EXPLZH.0042AE86
0042AE56  |>  CMP     ECX, B64FBAC4****************與B64FBAC4比較
0042AE5C  |.  JNZ     SHORT EXPLZH.0042AE62********不相等就跳
0042AE5E  |.  TEST    EAXEAX
0042AE60  |.  JE      SHORT EXPLZH.0042AE7E
0042AE62  |>  CMP     ECX, BD507501****************與BD507501比較
0042AE68  |.  JNZ     EXPLZH.0042AF4D**************不相等就跳,跳就失敗
0042AE6E  |.  TEST    EAXEAX*********************測試EAX的值
0042AE70  |.  JNZ     EXPLZH.0042AF4D**************不相等就跳,跳就失敗
0042AE76  |.  MOV     EAX, -2**********************到這裡賦EAX的值為FFFFFFFE(-2)
0042AE7B  |.  RETN    8****************************子程式結束!

2、演算法小結:
   註冊碼的形式是:XXXXXXXX-YYYYYYYY
   第一組註冊碼減去使用者名稱計算的值再減去3C6E8AD7必須等於BD507501
   第一組註冊碼減去第二組註冊碼也必須等於BD507501,所以其演算法如下:

   計算用到使用者名稱,使用者名稱計算是這樣,取使用者名稱的各位ASCII碼值相加,設計算的結果是:T。
   設第一組註冊碼是S1,S1=T+3C6E8AD7+BD507501
   設第二組註冊碼是S2,S2=S1-BD507501
3、驗證演算法:
   使用者名稱為:yzez[DFCG]
   使用者名稱計算的值:T=79+7A+65+7A+5B+44+46+43+47+5D=39E
   第一組註冊碼S1=39E+3C6E8AD7+BD507501=F9BF0376
   第二組註冊碼S2=F9BF0376-BD507501=3C6E8E75
  所以對應使用者名稱yzez[DFCG]的註冊碼是:F9BF0376-3C6E8E75,輸入進去我們看看,註冊成功了吧!
4、爆破:
  點1:0042B077  |.  JE改成NOP
  點2:0042B0DC  |.  JE改成JNZ
  點3:0042B0E0  |.  JE改成JMP
   上述修改,在輸入的註冊碼中間必須有“-”,如果任意輸入都成功,還要在0042AFE6  |.  JE處改
  點4:0042AFE6  |.  JE改成NOP或者:JNZ
  這樣修改,輸入任意資訊都可成為註冊版。

相關文章