怎樣才能讓軟體成為自身的序號產生器-讓軟體自動輸出註冊碼的一種方法 (10千字)

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

怎樣才能讓軟體成為自身的序號產生器-讓軟體自動輸出註冊碼的一種方法

作  者:lzrlzr
信  箱:lzrlzr_crack@163.com
時  間:2003年3月3日
目標軟體:試卷生成系統III
主程式: Dandelion.exe 檔案大小:930304
下載網站:http://myprg.yeah.net
破解環境:Win98 第二版
破解工具:Peditor,hiew681,softice4.05

宣告: 此文僅用於學習及交流,若要轉載請保持文章完整。


  由於給一家公司作電腦培訓考試,想出一份考試題,就從網上下載了一個試卷生成系統III,但這個軟體要求註冊,就隨手把它破解了。這個軟體破解挺簡單,是明文比較,在softice中下bpx hmemcpy ,正確的註冊碼就可以從softice中跟蹤得到,但由於我一直想寫一篇軟體自動輸出註冊碼的的文章,剛好就拿它作例子了。
這個軟體對註冊碼的判斷有兩次,可能是單機版和網路版兩種版本的註冊碼不一樣,如果註冊碼不正確,彈出一個請輸入正確的註冊碼等等的提示視窗。註冊成功後註冊碼儲存在(試卷生成系統III(網路版)資料)檔案目錄中的SysDB08.DB資料庫中。刪檔案除這個資料庫檔案後,就又變為未註冊版本。

修改思想:
  在得到正確的註冊碼的地址以後,加入一段呼叫Messagebox的程式碼,把正確的註冊碼輸出在Messagebox上。這是我以前的修改方法。(一般軟體都用到了Messagebox函式,基本上不用手工引入函式)
  但在這個軟體的主程式 Dandelion.exe的輸入表(Import Table)中,竟沒有發現Messagebox函式,那麼它的註冊碼出錯的視窗是怎樣來的(這是我的第一反應),請看以下的關鍵程式碼的分析


======這一段是軟體註冊的關鍵程式碼

0167:0041F782  E8F9FCFFFF          CALL      0041F480 *********計算出正確的註冊碼的過程(1eb82h)。
0167:0041F787  8B45F8              MOV      EAX,[EBP-08]******EAX 中存放的是真正的註冊碼。(A)
0167:0041F78A  50                  PUSH      EAX
0167:0041F78B  8D55EC              LEA      EDX,[EBP-14]
0167:0041F78E  8B83DC020000        MOV      EAX,[EBX+000002DC]
0167:0041F794  E843A0FFFF          CALL      004197DC
0167:0041F799  8B55EC              MOV      EDX,[EBP-14]***EDX 中存放的是假註冊碼
0167:0041F79C  58                  POP      EAX************EAX 中存放的是真正的註冊碼。
0167:0041F79D  E8E619FEFF          CALL      00401188*******這是比較註冊碼是否正確的過程。
0167:0041F7A2  746C                JZ        0041F810*******跳走後,註冊正確。
0167:0041F7A4  BA84FA4100          MOV      EDX,0041FA84
0167:0041F7A9  B8A4FA4100          MOV      EAX,0041FAA4
0167:0041F7AE  E8051AFEFF          CALL      004011B8
0167:0041F7B3  85C0                TEST      EAX,EAX
0167:0041F7B5  0F8544020000        JNZ      0041F9FF******如果不是網路版,跳走,出現錯誤視窗。
0167:0041F7BB  8D55FC              LEA      EDX,[EBP-04]
0167:0041F7BE  8B83CC020000        MOV      EAX,[EBX+000002CC]
0167:0041F7C4  E8B723FEFF          CALL      00401B80
0167:0041F7C9  8D45FC              LEA      EAX,[EBP-04]
0167:0041F7CC  50                  PUSH      EAX
0167:0041F7CD  8D55F4              LEA      EDX,[EBP-0C]
0167:0041F7D0  8B83E4020000        MOV      EAX,[EBX+000002E4]
0167:0041F7D6  E8A523FEFF          CALL      00401B80
0167:0041F7DB  8B55F4              MOV      EDX,[EBP-0C]
0167:0041F7DE  58                  POP      EAX
0167:0041F7DF  E88C19FEFF          CALL      00401170
0167:0041F7E4  8B45FC              MOV      EAX,[EBP-04]
0167:0041F7E7  8D55F8              LEA      EDX,[EBP-08]
0167:0041F7EA  E891FCFFFF          CALL      0041F480**********計算出正確的註冊碼的過程。
0167:0041F7EF  8B45F8              MOV      EAX,[EBP-08]******EAX 中存放的是真正的註冊碼。(B)
0167:0041F7F2  50                  PUSH      EAX
0167:0041F7F3  8D55EC              LEA      EDX,[EBP-14]
0167:0041F7F6  8B83DC020000        MOV      EAX,[EBX+000002DC]
0167:0041F7FC  E8DB9FFFFF          CALL      004197DC
0167:0041F801  8B55EC              MOV      EDX,[EBP-14]***EDX 中存放的是假註冊碼
0167:0041F804  58                  POP      EAX************EAX 中存放的是真正的註冊碼。
0167:0041F805  E87E19FEFF          CALL      00401188*******這是比較註冊碼是否正確的過程。
0167:0041F80A  0F85EF010000        JNZ      0041F9FF*******不跳走,註冊正確。
=====================底下這一段是註冊碼正確以後的處理過程,就省略不講了

0167:0041F810  8B83EC020000        MOV      EAX,[EBX+000002EC]
0167:0041F816  E819A0FFFF          CALL      00419834
......
......
0167:0041F9F1  E8625EFFFF          CALL      00415858
0167:0041F9F6  8BC3                MOV      EAX,EBX
0167:0041F9F8  E82B24FEFF          CALL      00401E28
0167:0041F9FD  EB15                JMP      0041FA14
=======================================================
跳到這裡後,出現錯誤視窗。
這一段註冊碼不正確的處理過程,是我們分析的重點:

0167:0041F9FF  6A00                PUSH      00
0167:0041FA01  668B0D54FA4100      MOV      CX,[0041FA54]
0167:0041FA08  B201                MOV      DL,01
0167:0041FA0A  B880FC4100          MOV      EAX,0041FC80 **這是出現在視窗上的字串。
0167:0041FA0F  E8445EFFFF          CALL      00415858******這裡彈出錯誤視窗。**********(1)
0167:0041FA14  33C0                XOR      EAX,EAX
0167:0041FA16  5A                  POP      EDX
0167:0041FA17  59                  POP      ECX
跟進(1)後,來到這裡:
0167:00415858  FF25E8DC4600        JMP      [0046DCE8]
0167:0041585E  8BC0                MOV      EAX,EAX

分析:

  註冊碼不正確後,跳到這裡,出現錯誤視窗,本來以為這是一個Messagebox,在softice中下bpx Messagebox斷點,竟然沒有中斷,後來在 (1)處跟進後,才發現這裡是呼叫另外一個動態庫(vcl40.bpl)中的一個函式,於是猜測這是一個可以輸出各種視窗的函式,(後來試著改動了引數值以後,證明這個猜測是正確的)有了這個發現後,就想呼叫這個函式輸出註冊碼。
  但首先得知道這個函式的原型和引數型別。分析這個函式的引數,共有四個,請看下面如何分析得到每一個引數的型別和值。

在0167:0041FA0F處向上看:

PUSH      00*************這是一個引數,猜測應是彈出視窗的父視窗的控制程式碼。一般值應是 0
MOV      CX,[0041FA54]**這是第二個引數,跟蹤後可知 [0041FA54]中的值是04,
             應該是彈出視窗的型別。
MOV      DL,01**********這是第三個引數,應該是視窗上的圖示的型別,值01應該是代表錯誤的紅圖示。
MOV      EAX,0041FC80 **這是出現在視窗上的字串。EAX中存放的是字串的首地址。
CALL      00415858********這個是輸出各種視窗的函式的呼叫。

把以上第二個引數,第三個引數值進行改變(加1或減1),從視窗介面的變化可以得到,
CX 是視窗按鈕的型別,CX值不同,視窗上的按鈕的多少和按鈕名程就不同
DL 是視窗上的圖型 DX值不同,視窗上的圖形就不同。

分析結果:
把這個函式的呼叫引數用匯編語言的過程來表達(為了方便理解,我給這個函式命名為 Message)

Message PROTO hwnd:DWORD
CX 的值代表了彈出視窗的型別
DL 中的值是視窗上的圖示的型別,01是代表錯誤的紅圖示,02是一個提示圖示
EAX 中存放的是出現在視窗上的字串的首地址

修改軟體主程式:

  經過以上的分析,得到Message的函式原型。下來就是在那個地方呼叫這個Message。跟蹤得知以上(A)和(B)處,註冊碼剛生成,EAX中存放的就是正確的註冊碼的首地址,那麼就在(A)和(B)處加入自已的程式碼,以下是我修改後的程式碼,請注意和原來不同的地方
0167:0041F77F  8D55F8              LEA      EDX,[EBP-08]
0167:0041F782  E8F9FCFFFF          CALL      0041F480
0167:0041F787  8B45F8              MOV      EAX,[EBP-08]
0167:0041F78A  50                  PUSH      EAX
0167:0041F78B  6A00                PUSH      00************引數1
0167:0041F78D  66B90400            MOV      CX,0004*******引數2
0167:0041F791  90                  NOP
0167:0041F792  90                  NOP
0167:0041F793  90                  NOP
0167:0041F794  B201                MOV      DL,02*********引數3,02值是一個提示圖示
0167:0041F796  90                  NOP
0167:0041F797  90                  NOP
0167:0041F798  90                  NOP
0167:0041F799  E8BA60FFFF          CALL      00415858********這就是輸出註冊碼的視窗的函式的呼叫
0167:0041F79E  90                  NOP
0167:0041F79F  90                  NOP
0167:0041F7A0  90                  NOP
0167:0041F7A1  90                  NOP
0167:0041F7A2  90                  NOP
0167:0041F7A3  90                  NOP
0167:0041F7A4  BA84FA4100          MOV      EDX,0041FA84
0167:0041F7A9  B8A4FA4100          MOV      EAX,0041FAA4
0167:0041F7AE  E8051AFEFF          CALL      004011B8
0167:0041F7B3  85C0                TEST      EAX,EAX
0167:0041F7B5  90                  NOP
0167:0041F7B6  90                  NOP
0167:0041F7B7  90                  NOP
0167:0041F7B8  90                  NOP
0167:0041F7B9  90                  NOP
0167:0041F7BA  90                  NOP
0167:0041F7BB  8D55FC              LEA      EDX,[EBP-04]
0167:0041F7BE  8B83CC020000        MOV      EAX,[EBX+000002CC]
0167:0041F7C4  E8B723FEFF          CALL      00401B80
0167:0041F7C9  8D45FC              LEA      EAX,[EBP-04]
0167:0041F7CC  50                  PUSH      EAX
0167:0041F7CD  8D55F4              LEA      EDX,[EBP-0C]
0167:0041F7D0  8B83E4020000        MOV      EAX,[EBX+000002E4]
0167:0041F7D6  E8A523FEFF          CALL      00401B80
0167:0041F7DB  8B55F4              MOV      EDX,[EBP-0C]
0167:0041F7DE  58                  POP      EAX
0167:0041F7DF  E88C19FEFF          CALL      00401170
0167:0041F7E4  8B45FC              MOV      EAX,[EBP-04]
0167:0041F7E7  8D55F8              LEA      EDX,[EBP-08]
0167:0041F7EA  E891FCFFFF          CALL      0041F480
0167:0041F7EF  8B45F8              MOV      EAX,[EBP-08]
0167:0041F7F2  50                  PUSH      EAX
0167:0041F7F3  6A00                PUSH      00************引數1
0167:0041F7F5  66B90400            MOV      CX,0004*******引數2
0167:0041F7F9  B201                MOV      DL,02*********引數3,02值是一個提示圖示
0167:0041F7FB  90                  NOP
0167:0041F7FC  E85760FFFF          CALL      00415858********這就是輸出註冊碼的視窗的函式的呼叫
0167:0041F801  8B55EC              MOV      EDX,[EBP-14]
0167:0041F804  58                  POP      EAX
0167:0041F805  E87E19FEFF          CALL      00401188
0167:0041F80A  E9F0010000          JMP      0041F9FF*******不讓軟體註冊
0167:0041F80F  90                  NOP
0167:0041F810  8B83EC020000        MOV      EAX,[EBX+000002EC]
0167:0041F816  E819A0FFFF          CALL      00419834

執行結果:
  修改後執行,在註冊時輸入學校名和姓名,輸入假的註冊碼,彈出一個視窗(見圖1),上面是真正的註冊碼,點確定後,又彈出一個視窗(見圖2),上面是另外一個版本的註冊碼。至此,修改成功。

  一個軟體的破解,有多種方法。這個軟體也可以不這樣麻煩的輸出註冊碼,還有另外一種修改方法,直接將正確的註冊碼寫入軟體儲存註冊碼的地方,就更方便了,第二種修改方法的教程請大家來寫吧,我想告訴大家的就是如果破解時碰到困難,可以改變一下自已的分析思路,可能會有意想不到的收穫。

另外,我在破解時在這個軟體中發現這麼一段文字,但沒有看到軟體中彈出這個視窗介面:

:0041F5BD 8BC7                    mov eax, edi
* Possible StringData Ref from Code Obj ->"恭喜你,你破解成功了。你是否覺得很容易呢?其實"
                                        ->"本系統的註冊碼並沒有設計得多複雜,只要提醒使用"
                                        ->"者要支援國產軟體而已。對於你的破解,我倒是想說"
                                        ->"一聲:“感謝你”,如果沒有你的破解,我的軟體將"
                                        ->"流行不起來。" 
哈哈,原來如此。

相關文章