一篇SMC補丁方法的教程 (7千字)

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

用SMC的補丁方法來破解加殼的幻影2003-一篇SMC補丁方法的教程


作者:lzrlzr
郵箱:crack_lzrlzr@163.com
日期:2002年11月24日
軟體:幻影2003
加密方式:機器碼+註冊碼,主執行檔案huanying.exe被加殼ASPack 1.08.03,
     未註冊前有功能限制,不能儲存、列印、發email。
難度:中等
所用工具:lodepe,softice,hiew6.83,topo
破解環境:win98第二版

本文僅在研究破解技術,請大家支援軟體作者製作出更優秀的軟體。

請大家多提意見,完善文章內容,造福於所有的crack

1、登錄檔中存放執行次數和註冊碼的地方

REGEDIT4

[HKEY_CURRENT_USER\Software\BraveTech\PhotoBuilder\regno]
"showme"=dword:00000000
"opensample"=dword:00000001
"lastbk"="C:\\PROGRAM FILES\\幻影2003\\backgrnd\\BCG_094.JPG"
"runtimes"=dword:00000005
"bserino"="F9R9-B3C9-J5D9-P0L0"*******註冊碼以明文存放在這裡

2、軟體破解
    軟體的主執行檔案huanying.exe被加殼ASPack 1.08.03,用衝擊波可得到入口地址OEP,脫殼後反
彙編,得到如下程式碼段,修改410B6E處的程式碼為9090或7500,則軟體破解完成(註冊碼的破解比較簡單,
採用的是明碼比較,這裡就不講了)。

OEP:  452564==>0043DF6C

* Referenced by a CALL at Addresses:
(四個呼叫檢測註冊碼的程式碼段的地址,分別對應了四個功能。)
|:00406531  , :0040A218  , :00414BF8  , :00414DE5 
|
0167:00410820 6AFF                push FFFFFFFF
.......
.......
0167:00410B6E  750D                JNZ      00410B7D  ********************
0167:00410B70  C744242C01000000    MOV      DWORD PTR [ESP+2C],00000001
0167:00410B78  E9C8010000          JMP      00410D45
0167:00410B7D  33DB                XOR      EBX,EBX
0167:00410B7F  53                  PUSH      EBX
0167:00410B80  8D4C2444            LEA      ECX,[ESP+44]
0167:00410B84  E8178BFFFF          CALL      004096A0

3、此軟體的破解並不難,手工或藉助工具脫殼後修改一個位元組就可完成破解;取消所有功能限制;
但用來作為一個學習SMC補丁方法的例子剛好。(因為我的本意不是講脫殼,所以這一部分略,若有
人需要,可來信討論,不過本人脫殼的水平不敢恭維。)

4、SMC的補丁方法(加殼ASPack 1.08.03 -> Alexey Solodovnikov)
分析:因為軟體加殼,所以0167:00410B6E  750D  JNZ      00410B7D
這一句程式碼是在記憶體動態生成的。那麼首先看這一句是由哪一段程式碼生成的。
用 Softice loader啟動huanying.exe檔案,下斷點bpm 410b6e,
ice中斷後,用D 410b6e來看程式碼是不是750D  JNZ      00410B7D,
若不是,按F5繼續,直到程式碼生成為止。

我們來分析最後一次中斷後的地方:
0167:00452333  8B85B5504400        MOV      EAX,[EBP+004450B5]
0167:00452339  6800800000          PUSH      00008000***************
0167:0045233E  6A00                PUSH      00
0167:00452340  50                  PUSH      EAX
0167:00452341  FF95BD504400        CALL      [EBP+004450BD]
0167:00452347  83C608              ADD      ESI,08
0167:0045234A  833E00              CMP      DWORD PTR [ESI],00
0167:0045234D  0F8546FFFFFF        JNZ      00452299
0167:00452353  8B9DDF4A4400        MOV      EBX,[EBP+00444ADF]
0167:00452359  0BDB                OR        EBX,EBX
0167:0045235B  7408                JZ        00452365
0167:0045235D  8B03                MOV      EAX,[EBX]

在00452339地址前,程式碼已經生成,所以我決定在此句前修改00410B6E的程式碼。用PE工具得到
程式碼00452339也是動態生成的,所以也要找到生成00452339的程式碼段。
用 Softice loader啟動huanying.exe檔案,下斷點bpm 00452339,
ice中斷後,用D 00452339來看程式碼是不是6800800000  PUSH      00008000 ,
若不是,按F5繼續,直到程式碼生成為止。

我們來分析最後一次中斷後的地方:
0167:004520B7  8B85B5504400        MOV      EAX,[EBP+004450B5]
0167:004520BD  6800800000          PUSH      00008000***************
0167:004520C2  6A00                PUSH      00
0167:004520C4  50                  PUSH      EAX
0167:004520C5  FF95BD504400        CALL      [EBP+004450BD]
0167:004520CB  8D85374C4400        LEA      EAX,[EBP+00444C37]
0167:004520D1  50                  PUSH      EAX
0167:004520D2  C3                  RET

在4520bd的地方,程式碼已經生成,所以我要在4520bd這一句前給軟體補丁;用PE工具得到這一段
程式碼在huanying.exe檔案中是存在的,不需要再補丁。


現在理一下SMC的補丁方法來破解加殼軟體的思路:
程式執行的過程:
程式執行-->在004520BD生成00452339程式碼段-->在00452339生成00410B6E程式碼段-->00410B6E程式碼段執行

程式補丁的過程:
程式執行-->在004520BD補丁00452339程式碼段-->在00452339補丁00410B6E程式碼段-->補丁後的00410B6E程式碼執行,軟體破解。

從上面可以看出,補丁的程式碼要兩處,第二處補丁第一處程式碼;以此類推,再複雜的加殼,第二處補丁第一處程式碼,
第三處補丁第二處程式碼,第四處補丁第三處程式碼,在經過多次的補丁,最後也會補成功。

具體步聘:
1,用topo 在huanying.exe檔案中尋找空白程式碼段,我得到的是00453250
用hiew6.83修改原始檔,在453250處加程式碼:

0167:00453250  6800800000          PUSH      00008000
0167:00453255  C7056E0B41007500C744MOV      DWORD PTR [00410B6E],44C70075********
0167:0045325F  E9DAF0FFFF          JMP      0045233E

這一句就是修改410b6e的程式碼,修改為
0167:00410B6E  7500                JNZ      00410B70***********


2、用hiew6.83修改原始檔,修改004520BD處的程式碼為
0167:004520BD  E9120F0000          JMP      00453264

3、用hiew6.83修改原始檔,在453264處加程式碼:
0167:00453264  6800800000          PUSH      00008000
0167:00453269  C70539234500E9120F00MOV      DWORD PTR [00452339],000F12E9***********
0167:00453273  C6053D23450000      MOV      BYTE PTR [0045233D],00
0167:0045327A  E943EEFFFF          JMP      004520C2
這一句就是修改00452339 的程式碼,修改為00452339  E9120F0000    JMP    00453250
4、執行軟體,成功,補丁完成。試一試,功能限制已沒有,破解完成。


================ 附修改結果

0167:004520B7  8B85B5504400        MOV      EAX,[EBP+004450B5]
0167:004520BD  E9A2110000          JMP      00453264***********
0167:004520C2  6A00                PUSH      00
0167:004520C4  50                  PUSH      EAX
0167:004520C5  FF95BD504400        CALL      [EBP+004450BD]
0167:004520CB  8D85374C4400        LEA      EAX,[EBP+00444C37]
0167:004520D1  50                  PUSH      EAX
0167:004520D2  C3                  RET

================ 附增加的程式碼段
*****************************************************************************
0167:00453250  6800800000          PUSH      00008000
0167:00453255  C7056E0B41007500C744MOV      DWORD PTR [00410B6E],44C70075
0167:0045325F  E9DAF0FFFF          JMP      0045233E
0167:00453264  6800800000          PUSH      00008000
0167:00453269  C70539234500E9120F00MOV      DWORD PTR [00452339],000F12E9
0167:00453273  C6053D23450000      MOV      BYTE PTR [0045233D],00
0167:0045327A  E943EEFFFF          JMP      004520C2
*****************************************************************************


================附動態補丁的結果

0167:00452333  8B85B5504400        MOV      EAX,[EBP+004450B5]
0167:00452339  E9120F0000          JMP      00453250***********
0167:0045233E  6A00                PUSH      00
0167:00452340  50                  PUSH      EAX
0167:00452341  FF95BD504400        CALL      [EBP+004450BD]
0167:00452347  83C608              ADD      ESI,08
0167:0045234A  833E00              CMP      DWORD PTR [ESI],00

================附動態補丁的結果(破解軟體的關鍵地方)
:u 410b6e l 30
0167:00410B6E  7500                JNZ      00410B70***********
0167:00410B70  C744242C01000000    MOV      DWORD PTR [ESP+2C],00000001
0167:00410B78  E9C8010000          JMP      00410D45
0167:00410B7D  33DB                XOR      EBX,EBX
0167:00410B7F  53                  PUSH      EBX
0167:00410B80  8D4C2444            LEA      ECX,[ESP+44]
0167:00410B84  E8178BFFFF          CALL      004096A0
0167:00410B89  B306                MOV      BL,06
0167:00410B8B  8D4C2420            LEA      ECX,[ESP+20]


希望能和大家互相交流經驗,也希望能為crack們作一點貢獻。

下一篇準備寫
1,怎樣修改軟體檔案,讓軟體自動輸出註冊號,自己成為自己的序號產生器。
2,怎樣修改軟體檔案,破解多模組加密狗(rokey)的方法。(一個國內非常有名的軟體,採用加密狗加密,
而且是多模組軟體。)
轉載請保證文章內容的完整。

相關文章