某檔案切割工具

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

一個重啟驗證軟體的破解思路

    破解作者
            yzez[DFCG][BCG][FCG]
    破解工具
            PEID、OLLYDBG1.09、脫殼工具Pe-scan
    破解目的
            不為破解而破解,只為交流技術而破解
    破解過程

    這兩天在看雪論壇上有網友提到關於重啟驗證軟體的破解如何破的問題,剛剛手頭有一個前天下的
軟體也是重啟驗證的,所以就破一破,講一講大致思路。為保護國產軟體隱去軟體相關資訊,這是一個檔案
切割的軟體。未註冊有功能限制,非明碼比較,所以要看懂註冊演算法思路。對於重啟驗證的軟體,一般的
方法是:使用FILEMON或者REGMON等軟體,監測軟體輸入註冊資訊後,會把註冊資訊儲存到何處,如果是儲存
在登錄檔中我們一般下:REGCREATEKEYA等斷點,如果是儲存到某個檔案當中,我們就要反彙編找到軟體在
什麼地主對這個檔案進行讀寫操作,然後有針對性地設下斷點,當然方法很多,這只不過是一個一般的思路
和過程,視具體情況而論,不要死守陳規,這個軟體監測後發現把註冊資訊儲存到登錄檔中,先下REGCREATEKEYA
斷點,按了N次F8,不太正常,不知道是我機子的問題還是什麼問題,不耐煩退出OD,重新開啟程式還是註冊
視窗,突然想到程式驗證以後,註冊不正確還是會彈出這個要求註冊的視窗,那麼我們就可以用別的斷點
方法找到比對的關鍵處,所以這個軟體的重啟驗證我們可以用另一種斷點方法來破,下面看過程。
1、用PEID檢測是PECompact 1.68 - 1.84 -> Jeremy Collake的殼,於是用Pe-scan自動脫殼,脫完殼後,
先執行脫殼後的程式,輸入註冊資訊:使用者名稱yzez,EMAIL:yzez@163.com,試驗碼:123456789987654321,
為什麼要輸入這麼多位數的試驗碼?請看下面的說明。輸入註冊資訊後,軟體要求重啟來驗證註冊正確與
否,點確定程式退出,用OD載入脫殼後的程式,在命令欄內輸入:bpx Messageboxa就是設下斷點,然後
按ENTER鍵,出現一個資訊框,在這個框裡的所有CALL上都設下斷點,按F9執行程式,連續按F9,如果跳不
過,按F2去掉這個斷點,這時你要留心四個視窗,等到出現你所輸入的註冊資訊後,這時就要停止F9,改按
F8,因為已經快到關鍵處了,下面看程式碼:

00404D7F   CALL    <JMP.&oleaut32.SysAllocStringLen>****在這個CALL出現了我輸入的試驗碼:123456789987654321,
******************我們已經快到關鍵處,記下這個地址,如果一次除錯不出,以後就要直接在這個CALL設下斷點!
00404D84   TEST    EAXEAX**************按F8往下走!
00404D86   JE      123.00404C58
00404D8C   POP     EDX                              
00404D8D   PUSH    DWORD PTR DS:[EDX]
00404D8F   MOV     DWORD PTR DS:[EDX], EAX
00404D91   CALL    <JMP.&oleaut32.SysFreeString>
00404D96   RETN***********返回指令!不要管,按F8繼續往下走,中間還有一個,對我們無用,省略,直到下面處:
===========================================================================================

0042F2B0  MOV     EAX, [LOCAL.2] ****直到這個地方,我們要慢慢走了,按F8往下!                 
0042F2B3  MOV     ECXEDI                      
0042F2B5  MOV     EDXESI                      
0042F2B7  CALL    123.00404E84                   
0042F2BC  MOV     EDX, [LOCAL.1]
0042F2BF  MOV     EAX, [ARG.1]
0042F2C2  CALL    123.004047DC
0042F2C7  XOR     EAXEAX
0042F2C9  POP     EDX                             
0042F2CA  POP     ECX                            
0042F2CB  POP     ECX                             
0042F2CC  MOV     DWORD PTR FS:[EAX], EDX
0042F2CF  PUSH    123.0042F2E9
0042F2D4  LEA     EAX, [LOCAL.2]
0042F2D7  MOV     EDX, 2******************把常數2賦EDX,幹嗎用?原來是取試驗碼的值,這裡指取試驗碼的第2位:2
0042F2DC  CALL    123.00404CA0************此CALL取出試驗碼的第2位:2,有興趣自己去跟。
0042F2E1  RETN****************************返回指令,繼續往下。
========================================================================================

按F8走,我們又會來到這裡:
00477615  PUSH    [LOCAL.2]***************我們來到這裡
00477618  EAX, [LOCAL.3]
0047761B  PUSH    EAX
0047761C  MOV     ECX, 1******************賦ECX的值1,即取一位
00477621  MOV     EDX, 6******************取試驗碼的第6位!
00477626  MOV     EAXDWORD PTR DS:[EBX]*試驗碼:123456789987654321移入EAX中
00477628  CALL    123.0042F284************取試驗碼的第6位:6
0047762D  PUSH    [LOCAL.3]
00477630  LEA     EAX, [LOCAL.4]
00477633  PUSH    EAX
00477634  MOV     ECX, 1*****************賦ECX的值1,取1位試驗碼
00477639  MOV     EDX, 0A****************賦EDX的值:A(十進位制值是10),取第10位試驗碼
0047763E  MOV     EAXDWORD PTR DS:[EBX]*試驗碼:123456789987654321移入EAX中
00477640  CALL    123.0042F284************取出試驗碼的第10位:9
00477645  PUSH    [LOCAL.4]
00477648  LEA     EAX, [LOCAL.5]
0047764B  PUSH    EAX
0047764C  MOV     ECX, 1
00477651  MOV     EDX, 0E*****************取試驗碼的0E位,即第14位
00477656  MOV     EAXDWORD PTR DS:[EBX]
00477658  CALL    123.0042F284************取出試驗碼的第14位:5
0047765D  PUSH    [LOCAL.5]
00477660  LEA     EAX, [LOCAL.6]
00477663  PUSH    EAX
00477664  MOV     ECX, 1
00477669  MOV     EDX, 4******************取試驗碼的第4位
0047766E  MOV     EAXDWORD PTR DS:[EBX]
00477670  CALL    123.0042F284
00477675  PUSH    [LOCAL.6]
00477678  LEA     EAX, [LOCAL.7]
0047767B  PUSH    EAX
0047767C  MOV     ECX, 1
00477681  MOV     EDX, 8******************取試驗碼的第8位
00477686  MOV     EAXDWORD PTR DS:[EBX]
00477688  CALL    123.0042F284************取出試驗碼的第8位:8
0047768D  PUSH    [LOCAL.7]
00477690  LEA     EAX, [LOCAL.8]
00477693  PUSH    EAX
00477694  MOV     ECX, 1
00477699  MOV     EDX, 0C*****************取試驗碼的0C位即第12位
0047769E  MOV     EAXDWORD PTR DS:[EBX]
004776A0  CALL    123.0042F284************取出試驗碼的第12位:7
004776A5  PUSH    [LOCAL.8]
004776A8  LEA     ECX, [LOCAL.9]
004776AB  MOV     EDX, 1******************取試驗碼的第1位
004776B0  MOV     EAXDWORD PTR DS:[EBX]
004776B2  CALL    123.0042F200************取出試驗碼的第1位:1
004776B7  PUSH    [LOCAL.9]
004776BA  LEA     EAX, [LOCAL.1]
004776BD  MOV     EDX, 8******************賦EDX的值8,8位取完了嗎?
004776C2  CALL    123.004048D4************取出的8位數值連線起來組成一組新值:26954871
004776C7  MOV     EAX, [LOCAL.1]**********把這組新值移到EAX
004776CA  PUSH    EAX
004776CB  MOV     EAXDWORD PTR DS:[47DC68]
004776D0  PUSH    EAX*********************內建的字串:軟體名XXXXXX入棧
004776D1  LEA     ECX, [LOCAL.11]
004776D4  MOV     EDX, 1
004776D9  MOV     EAXDWORD PTR DS:[47DC6C]
004776DE  CALL    123.0042F190
004776E3  EAX, [LOCAL.11]
004776E6  PUSH    EAX
004776E7  LEA     EAX, [LOCAL.10]
004776EA  PUSH    EAX
004776EB  MOV     ECX, 123.00477740**********移入固定的字串"Xenotrix"
004776F0  MOV     EDXDWORD PTR DS:[47DC78]*把輸入的EMAIL:yzez@163.com移入EDX
004776F6  MOV     EAXDWORD PTR DS:[47DC74]
004776FB  CALL    123.004773A8***************再取使用者名稱:yzez,把上述內容全部連線起來,組成一個長
*****字串:yzezyzez@163.comXenotrixiSplit4Ii`w,這個字串就是在這個CALL中而得到,我不貼程式碼了,
*****要不然這篇文章真的成了垃圾文章!但這個CALL我們一定要進!因為關鍵值在這個CALL裡計算得到!關鍵CALL。
00477700  MOV     EDX, [LOCAL.10]************把上面運算的結果:150DDFC1,大寫字母轉換成小寫:150ddfc1
00477703  POP     EAX                            
00477704  CALL    123.00404960***************比較CALL,比較上述運算的值:150ddfc1與取出的8位試驗碼:
************************************26954871是否相等!
00477709  SETE    AL*************************相等則置AL的值為1,這是成功標誌位,軟體重啟驗證這個標誌位!
0047770C  MOV     EBXEAX
0047770E  XOR     EAXEAX
00477710  POP     EDX                           
00477711  POP     ECX                           
00477712  POP     ECX                         
00477713  MOV     DWORD PTR FS:[EAX], EDX
00477736  C3            RETN

======================================================================================
關鍵CALL跟進後我們在這裡:

004773A8  PUSH    EBP
004773A9  MOV     EBPESP
*******************************省略部分程式碼!***********************************
004773FD  MOV     EDX, [ARG.1]
00477400  MOV     EAX, [LOCAL.1]****把得到的值:yzezyzez@163.comXenotrixiSplit4Ii`w入EAX
00477403  CALL    123.00477308******演算法CALL跟進,按F7
00477408  XOR     EAXEAX
0047740A  POP     EDX                             
0047740B  POP     ECX                            
0047740C  POP     ECX                             
0047740D  MOV     DWORD PTR FS:[EAX], EDX
00477410  PUSH    123.0047742A
00477415  LEA     EAX, [LOCAL.2]
00477418  MOV     EDX, 2
0047741D  CALL    123.00404578
00477422  RETN
 
========================================================================================
演算法CALL跟進後,來到這裡:
00477308  PUSH    EBP
00477309  MOV     EBPESP
0047730B  ADD     ESP, -8
0047730E  PUSH    EBX
0047730F  PUSH    ESI
00477310  PUSH    EDI                            
00477311  XOR     ECXECX
00477313  MOV     [LOCAL.2], ECX
00477316  MOV     [LOCAL.1], EDX
00477319  MOV     EDIEAX
0047731B  XOR     EAXEAX
0047731D  PUSH    EBP
0047731E  PUSH    123.0047739A
00477323  PUSH    DWORD PTR FS:[EAX]
00477326  MOV     DWORD PTR FS:[EAX], ESP
00477329  XOR     EBXEBX
0047732B  MOV     EAXEDI                        
0047732D  CALL    123.00404814
00477332  TEST    EAXEAX
00477334  JLE     SHORT 123.0047735F
00477336  MOV     ESI, 1***********************賦ESI的值1,ESI做計數器!
0047733B  MOV     DLBYTE PTR DS:[EDI+ESI-1]**取出第一個字串:y(ASCII碼值是:79)
0047733F  XOR     DLBL***********************DL ^ BL=79,BL的初始值是:0
00477341  AND     EDX, 0FF*********************與0FF=79
00477347  MOV     EDXDWORD PTR DS:[EDX*4+47C094>**把地址:EDX*4+47C094存放的值:29D9C998入EDX
0047734E  SHR     EBX, 8***********************EBC右移8位!
00477351  AND     EBX, 0FFFFFF*****************與運算!
00477357  XOR     EDXEBX*********************EDX XOR EBX=29D9C998
00477359  MOV     EBXEDX*********************把29D9C998移入EBX中,參與下一步運算!
0047735B  INC     ESI**************************ESI加1
0047735C  DEC     EAX**************************EAX減1,EAX存放上述值的位數是:23
0047735D  JNZ     SHORT 123.0047733B***********跳回迴圈,一共迴圈23(35)次,得到最後的值:150DDFC1
0047735F  PUSH    32                              
00477361  CALL    <JMP.&kernel32.Sleep>        
00477366  MOV     EAXEBX*********************把150DDFC1由EBX移入EAX中
00477368  XOR     EDXEDX
0047736A  PUSH    EDX                           
0047736B  PUSH    EAX                             ASCII "yzezyzez@163.comXenotrixiSplit4Ii`w"
0047736C  LEA     EDX, [LOCAL.2]                   ; |
0047736F  MOV     EAX, 8                           ; |
00477374  CALL    123.004089D8                     ; 123.004089D8
00477379  MOV     EAX, [LOCAL.2]
0047737C  MOV     EDX, [LOCAL.1]
0047737F  CALL    123.00408588
00477384  XOR     EAXEAX
00477386  POP     EDX                              ;  123.00477408
00477387  POP     ECX                              ;  123.00477408
00477388  POP     ECX                              ;  123.00477408
00477389  MOV     DWORD PTR FS:[EAX], EDX
0047738C  PUSH    123.004773A1
00477391  LEA     EAX, [LOCAL.2]
00477394  CALL    123.00404554
00477399  RETN*******************************返回到前面我們再看!

  簡單結論:
  這個軟體是從註冊碼中取出8位值,分別是:第2、6、10、14、4、8、12、1位,依次取,得到一組值,
然後再把這個值與:使用者名稱,郵箱與軟體內建的字串運算後得到的一組值比較,相等就註冊成功!
  一個可用的註冊碼:使用者名稱yzez
                    EMAIL:yzez@163.com
                    註冊碼:113d557f908c6d4321
 主要是註冊碼的第2、6、10、14、4、8、12、1位有規定,其它的位數可以任意!最近工作太忙,個人也有點懶,
所以演算法不完全,主要程式碼太多,迴圈也多,用到了除,所以也不想再更多的分析了.好在我在前面就宣告,這是關於
軟體重啟驗證的一種破解方法,我想這個過程省略也無所謂了.

相關文章