首页
社区
课程
招聘
[原创]DOS 下可執行檔還原技巧 (.COM 篇)
2009-4-14 15:29 4555

[原创]DOS 下可執行檔還原技巧 (.COM 篇)

2009-4-14 15:29
4555
DOS 下可執行檔還原技巧 (.COM 篇)
1998 年前寫的, 有人需要, 就放上來了.
附件和所貼的內容完全相同. 排版做成 PDF

[本文開始]==============================================
#附標=保護與破解的攻防技巧(二)

#大標=可執行檔還原技巧* (.COM 篇)

#引言=在50期我們針對可執行檔的編碼保護作了一些簡單介紹,相信讀者們一定已經有了初步的認識.可是這樣的保護就夠了嗎?(引言)

#作者=/楊旭峰
zenix@ms10.hinet.net

(內文)
看過50期的介紹後,您是否覺得可執行檔的編碼保護很不錯?是否您也開始對您的程式開始編碼加密了呢?然而加密過的程式真的無法被修改和破解?我勸您不要對這樣的小程式抱太大的希望.保護與破解就像光和影是無法分開的.

#小標=■可執行檔編碼/解碼的簡介

#小小標=
關於可執行檔的編碼與解碼,雖然我們還沒有比較正式的專用名詞.但我們在網路上卻常用剝殼及加殼這兩種稱呼.底下我們對這兩種用詞加以解說一下:

◆        『加殼』:在檔案的外面加上一些程式碼.有如為程式加上一層外衣(外殼).程式被載入時會先執行最外層的程式碼(外衣/殼).常見的外加程式碼用途可以分為底下這幾種類型. 當然所加上的外衣可以同時擁有以下的幾項功能,不一定只限定單一功能.
(1)        .解壓縮.
(2)        .軟體保護.
(3).解碼/解密.
(4).病毒.現在我們先把病毒排除在外,一來因為病毒和軟體保護與破解比較沒有直接的關係.二來因為對於新手而言,試著和電腦病毒搏鬥是很危險的.

◆        『加殼機』:用來對檔案加殼的程式.依其功能來分有三大類.
(1).壓縮軟體(Packer): 如 PKLITE, LZEXE 及後起新秀 WWPACK 及 APACK等.
(2).軟體保護(Protector):通常是一些防破解或防修改的程式碼.像是有些防病毒軟體可以為程式注射疫苗,而這些所的疫苖就是一種外衣,它的工作就是檢查程式本身是有遭到修改.
(3).檔案編碼(Encryptor):如上一期介紹的CRYPTCOM.請注意Encryptor這個字不是正確的英文字,但您在網路上搜尋資料時就會發現大家都是用這個字.

◆        『剝殼』:把外加於檔案外層的程式碼除去.也就是把檔案還原回本來的真面目.也有人用『撥殼』這樣的稱呼.

◆        『剝殼機』:用來執行剝殼的工具程式.
(1).解壓縮軟體(Unpacker):用來把被壓縮過的檔案還原的程式.有些壓縮軟體本身有提供解壓縮的方法或程式,有些就沒有.
(2).拆除器(Remover):用來把外加保護拆除的程式.那些軟體保護的加殼機有外加保護於原始程式的外面卻沒有對原始程式編碼.我們就用這種簡單型檔案還原工具來剝殼.
(3).解碼器(Decryptor):用來把編碼過的檔案解碼還原的程式.我們這裡所說的解碼器可不是第四台在用的那種哦!

#小標=■掀開面紗,卸下外衣(小標)
#小小標=
在50期我們已經介紹過加殼的方法了,現在我們來看看一般破解者們如何把加密的檔案還原吧!
什麼!剛寫好的編碼保護你現在就要教別人如何破解?
沒錯!如果您是個軟體保護的工作者,您必須明白這一點.您每天努力地設計及加強保護,破解者們也未曾閒著.況且您看到50期編碼程式的同時,破解者們也看到了.也許您常常納悶著為什麼辛苦花費數個星期寫好的一個保護,總是在軟體推出的第二天就出現破解版.也許您會回答:破解比保護容易,破壞比建設簡單.您只答對了一半.真正的答案在於破解者完全明瞭您的保護方式,而您卻對破解者一無所知.所謂知己知彼方能百戰百勝.破解的人熟諳您的保護,所以能輕易地解拆.相對的您也應該仔細地研究各種破解手段,才能有效地擊退您的大敵—破解者.

#小標=■用除錯程式來追蹤(小標)
#小小標=
對於一般的加殼機,破解者們的手上早就擁有一堆剝殼機可以應付了,現在我們就先不介紹這種情形.假設今天我們拿到程式,它所加的外殼還沒有現成的剝殼機可用.一位破解者要如何把殼剝掉呢? 今天我們先介紹還原.COM檔的各種方法.您還記得.COM檔的特徵嗎?還原.COM檔只需要知道這兩點:
(1).載入執行時第一道指令的位置是在 CS:100h,也就是 IP=100h.
(2).CS=DS=ES=SS(=PSP)
再來我們需要知道的就是一般外殼到最後都要返回原程式的第一道指令.我們稱之為『原始進入點』.這一點是哪裡呢?沒錯就是CS:100h.也就是說,程式一開始執行是從CS:100h處開始,不管外殼執行哪些動作,它最後還是要回到CS:100h來執行原來的程式.也許您會問找到原始進入要有什麼作用?我們可以把此時的記憶體內容回存成檔案,這就是程式原來的樣子了.
再來我們要知道的是返回的方法(指令)有哪些呢?常見的有:
        (1). 返回系列: Ret/RetF/Iret.
        (2). 跳躍系列: Jmp/Jmp far/Jxx
        (3). 呼叫系列: Call/Call far
使用上述三類以外的方式返回的是比較高等技術的作法,我們在此先不討論.看到這裡您心裡是否覺得若有所悟了呢?嗯,具體做法如下:
        (1).先用除錯程式載入要還原的檔案.此時IP=100h
        (2).慢慢追蹤直到程式返回到CS:100h為止.
        (3).計算檔案大小然後存檔.
好!就是這麼簡單.我們先拿50期的CRYPTCOM來試試吧!我們寫了這個國際知名的Hello World!程式來編碼:
;;=============================================
;; This is the famous "Hello world!" program.
;; 這個程式的功能是印出/顯示 Hello world!
;; --------------------------------------------
        .MODEL  TINY
        .CODE
        org 100h
Start:
        Mov  Ah, 09h
        Mov  Dx, Offset Msg
        Int  21h
        Mov  Ah, 4ch
        Int  21h
Msg     Db   0ah, 0dh,'Hello world!',0ah,0dh,'$'
End     Start

我們用Symdeb(除錯程式)載入後反組譯出來的內容如下:
-U
102A:0100 B409           MOV    AH,09
102A:0102 BA0B01         MOV    DX,010B
102A:0105 CD21           INT    21
102A:0107 B44C           MOV    AH,4C
102A:0109 CD21           INT    21
--以下省略--

經過CRYPTCOM編碼後,我們再載入到Symdeb中反組譯來看看:
-U
102A:0100 60             PUSHA   
102A:0101 E91C00         JMP    0120
102A:0104 A812           TEST   AL,12
102A:0106 A01219         MOV    AL,[1912]
102A:0109 DA37           FIDIV  DWord Ptr [BX]
--以下省略

看起來和原程式一點都不像了.好了接下來要怎麼追蹤呢?那就是(2).慢慢追蹤直到找到上面所列的指令.單步追蹤我們常用的是T指令和P指令.我們可以一路劈(P)下去直到它的位址再度停在CS:100的位址.此時我們就找到原始進入點了.接下來就是(3).計算檔案大小然後存檔.檔案大小的計算需要一些經驗和技巧,如果您不確定,那您可以把檔案大小設定大一點,只要不超過60K一般而言都沒問題.也有一些破解者偷懶,直接把檔案大小設定為60K.從追蹤過程的分析與了解中我們發現(如果您有心成為頂尖破解者,請您務必要分析與了解您所追蹤的程式.),在程式開頭CS:101處有JMP 0120的程式碼 E9 1C 00.從而得知原來檔案大小為 1Ch Byte.底下是我們破解的過程:
-P
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0101   NV UP EI PL NZ NA PO NC
102A:0101 E91C00         JMP    0120                              
-P
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0120   NV UP EI PL NZ NA PO NC
102A:0120 B91C00         MOV    CX,001C                           
-P
AX=0000  BX=0000  CX=001C  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0123   NV UP EI PL NZ NA PO NC
102A:0123 BE0400         MOV    SI,0004                           
-P
AX=0000  BX=0000  CX=001C  DX=0000  SP=FFEE  BP=0000  SI=0004  DI=0000  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0126   NV UP EI PL NZ NA PO NC
102A:0126 BF0001         MOV    DI,0100                           
-P
AX=0000  BX=0000  CX=001C  DX=0000  SP=FFEE  BP=0000  SI=0004  DI=0100  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0129   NV UP EI PL NZ NA PO NC
102A:0129 03F7           ADD    SI,DI                              
-P
AX=0000  BX=0000  CX=001C  DX=0000  SP=FFEE  BP=0000  SI=0104  DI=0100  
DS=102A  ES=102A  SS=102A  CS=102A  IP=012B   NV UP EI PL NZ NA PO NC
102A:012B AC             LODSB                                    
-P
AX=00A8  BX=0000  CX=001C  DX=0000  SP=FFEE  BP=0000  SI=0105  DI=0100  
DS=102A  ES=102A  SS=102A  CS=102A  IP=012C   NV UP EI PL NZ NA PO NC
102A:012C 32C1           XOR    AL,CL                              
-P
AX=00B4  BX=0000  CX=001C  DX=0000  SP=FFEE  BP=0000  SI=0105  DI=0100  
DS=102A  ES=102A  SS=102A  CS=102A  IP=012E   NV UP EI NG NZ NA PE NC
102A:012E AA             STOSB                                    
-P
AX=00B4  BX=0000  CX=001C  DX=0000  SP=FFEE  BP=0000  SI=0105  DI=0101  
DS=102A  ES=102A  SS=102A  CS=102A  IP=012F   NV UP EI NG NZ NA PE NC
102A:012F E2FA           LOOP   012B                              
-P
AX=0024  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0120  DI=011C  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0131   NV UP EI PL NZ NA PE NC
102A:0131 61             POPA                                      
-P
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0132   NV UP EI PL NZ NA PE NC
102A:0132 680001         PUSH   0100                              
-P
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFFC  BP=0000  SI=0000  DI=0000  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0135   NV UP EI PL NZ NA PE NC
102A:0135 C3             RET                                       
-P
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000  
DS=102A  ES=102A  SS=102A  CS=102A  IP=0100   NV UP EI PL NZ NA PE NC
102A:0100 B409           MOV    AH,09    ; 就是這裡了.IP=100h
-U
102A:0100 B409           MOV    AH,09
102A:0102 BA0B01         MOV    DX,010B
102A:0105 CD21           INT    21
102A:0107 B44C           MOV    AH,4C                         ;'L'
102A:0109 CD21           INT    21
-RCX 1C    ;設定檔案大小
-N OUT1.COM ; 設定回存檔名
-W ; 回存
Writing 001C bytes
-Q ; 完成,離開.

看起來似乎不太需要什麼技術就可以把這個編碼保護給解開了.然而您要寫出這樣的編碼程式卻不知要經過多少的學習.這樣的事實您在看眼裡,不知是什麼樣的感想?的確,這種速成的破解法很適合初學者.但是如果用這種方法來破解,您又學到了什麼?雖然這是初學者必經之路,但如果多年之後您還是只會用這一類的方法來破解,那就真是太不長進了.

在這裡我們要補充說明一些小技巧:
(1).如果您使用T指令來追蹤也是可以,只是步驟比較多.要追比較久.
 P指令和T指令的差別請參閱Run!PC雜誌48期第166-168頁.
(2).如果您覺得這樣一路慢慢劈(P)下去還是很累人的話,那我再教您一個訣竅.因為一般的破解者也沒那麼笨地一路劈(P)到底,更何況要叫他們慢慢踢(T)到原始進入點了.你還記得之前我要您注意的三大類型的指令嗎?會改變程式執行流程的大約就是那些指令.雖然還有些像Int和Loop等的指令也可以改變執行流程,但在破解的過程通常我們都會先忽略它.因此較快的破解步驟如下:
(1).先用除錯程式載入欲還原的檔案.
        (2).往下找到改變執行流程的指令.
(3).直接執行(G)到那裡,然後再踢(T)過去.
(4).檢查是否所在位址停在CS:100h處.若不是則重覆(2)-(4)的動作.
(5).計算檔案大小然後存檔.
哦,你騙人!上一種破解法只要三個步驟,你這種方法卻至少要五個步驟.沒錯,上一種方法比較單純並且單調,但很多時候反而比較累人.我們現在來實際用第二種方法破解看看吧.底下就是我們的破解過程.

-U
102A:0100 60             PUSHA   

102A:0101 E91C00         JMP    0120   ; 跳躍指令
102A:0104 A812           TEST   AL,12
102A:0106 A01219         MOV    AL,[1912]
-G101   ; 直接執行(G)到那裡
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0101   NV UP EI PL NZ NA PO NC
102A:0101 E91C00         JMP    0120
-T  ;然後再踢(T)過去
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0120   NV UP EI PL NZ NA PO NC
102A:0120 B91C00         MOV    CX,001C  ; 不是停在CS:100h
-U
102A:0123 BE0400         MOV    SI,0004
102A:0126 BF0001         MOV    DI,0100
102A:0129 03F7           ADD    SI,DI
102A:012B AC             LODSB
102A:012C 32C1           XOR    AL,CL
102A:012E AA             STOSB
102A:012F E2FA           LOOP   012B
102A:0131 61             POPA
-U  ; 再往下找
102A:0132 680001         PUSH   0100
102A:0135 C3             RET  ;  返回指令
102A:0136 56             PUSH   SI
102A:0137 26A18008       MOV    AX,ES:[0880]
102A:013B 2D1F00         SUB    AX,001F
102A:013E 50             PUSH   AX
102A:013F 8E069656       MOV    ES,[5696]
102A:0143 26FF367A03     PUSH   ES:[037A]
-G135   ; 直接執行(G)到那裡
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFFC  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0135   NV UP EI PL NZ NA PE NC
102A:0135 C3             RET
-T  ;然後再踢(T)過去
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0100   NV UP EI PL NZ NA PE NC
102A:0100 B409           MOV    AH,09  : 是停在CS:100h
-RCX 1C  ;  原來檔案長度
-N OUT1.COM   ; 另存新檔到 OUT1.COM
-W  ;  寫入
Writing 001C bytes
-Q  :  完成,離開.

同樣地也不太需要什麼技術就可以把這個編碼保護給解開了.

-------------------------------------------------
#小標=■除錯程式失靈?

#小小標=
看到這裡您是否對還原檔案有了基本概念了呢?如果這個原理您懂了,此時聰明的你應該要提出下面這個疑問的.既然我們的最終目的就是要把程式的執行流程停止在解碼後的原始進入點上,而我們又早就知道要這個原始進入點就在CS:100h上,為什麼還要這麼麻煩地慢慢追蹤,最後還是回到我們本來就知道的位址CS:100h上呢?為什麼不直接G100讓它停在CS:100h的位址就好了?問得好!我們就來試試您的方法吧!
-R ; 先看一下
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0100   NV UP EI PL NZ NA PO NC
102A:0100 60             PUSHA
-G100 ;  執行直到 CS:100h 才停止

Hello world!

Program terminated normally (36)

咦!怎麼不會停在 CS:100h?我們再試另一種方式看看.
-P
AX=0000  BX=0000  CX=0036  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0101   NV UP EI PL NZ NA PO NC
102A:0101 E91C00         JMP    0120  ;此時 IP 不為 100h 了.
-G100

Hello world!

Program terminated normally (36)

哇!怎麼還是不會停在 CS:100h 上?可是為什麼我們之前的G101和G135就都會乖乖地停在我們指定的地方?
因為當我們用G100指令時,除錯軟體會在CS:100的位址偷偷換上一個0CCh(Int 03)的碼,也就是在那個位址下中斷點.等程式執行到CS:100的0CCh時就會產生Int 03中斷把那個位址的程式碼再偷偷換回來,並且把程式停下來,控制權交還給除錯程式.然而上面的例子裡,在解碼過程中會把解碼後的程式覆蓋在CS:100h上,也就把除錯程式的0CCh(Int 03)的碼給洗掉了.當程式再度執行到 CS:100h時那裡已經不是0CCh(Int 03)了,而是0B4h(Mov Ah,xx).
也許有人會說,我不相信G指令會偷偷在我們指定要停下來的位址換上 0CCh 碼,然後又偷偷換回來?就好像你說當我閉上眼睛時所有的人都變成黑色,可是當我張開眼睛時所有的人又變回來了.叫我如何相信呢?什麼!不相信的話,您可以寫個程式去檢查啊!開個玩笑啦,不必這麼麻煩,我們現在就用Symdeb來測試G指令,看它老不老實.這裡我們要用點小技巧,那就是我們指定一個位址騙它G過去,可是事實上我們根本就不會執行到這個位址.也就是它不會有機會執行到Int 03來把0CCh碼換回來.
-D 80 80  ; 這個位址不會被執行到
102A:0080  00 ;  原來的值是 00
-G80  ;  騙它G到這裡

Hello world!

Program terminated normally (36)  ;  程式結束了.
-D 80 80   ;  檢查一下吧!
102A:0080  CC  ;  看到沒? 原來的 00 被改成 CC 了.
-

看到這裡是否又有所領悟?可以利用這一點來防止這種除錯軟體的破解?

#小標=■卻罷不能,再解 PKLITE

#小小標=
學到一個新技巧了,您是否開始手癢了?也想開始您的第一次剝殼破解?嗯,我們就拿眾所皆知的PKLITE來試試吧!因為我們原來的IN.COM檔案太小,PKLITE拒絕壓縮,所以我們再把它改寫成PKLITE可以壓縮的檔案.
;;=============================================
;; This is the famous "Hello world!" program.
;; 這個程式的功能是印出/顯示 Hello world!
;; --------------------------------------------
        .MODEL  TINY
        .CODE
        org 100h
Start:
        Mov  Ah, 09h
        Mov  Dx, Offset Msg
        Int  21h
        Mov  Ah, 4ch
        Int  21h
Msg     Db   0ah, 0dh,'Hello world!',0ah,0dh,'$'
        Db   200h DUP('UnPack Me!') ;; 這裡是為了給PKLITE壓縮用的.
End     Start

接下來您就可以用PKILTE將它壓縮,然後再試著自己用Symdeb把檔案還原吧!在此我們不再大量地列出追蹤過程.取而代之,我們告訴您等級較高的破解者另一種作法.大部份的壓縮軟體都是利用RetF來返回原始進入點.而RetF的程式碼為0CBh.所以破解流程可以更簡單:
-S CS:IP,IP+200 CB ;從程式一開始往底下的200 個指令中找尋 RetF指令
102A:012D
102A:0299
-G12D ;直接執行到第一個RetF的位址
AX=FCB0  BX=0000  CX=102A  DX=006A  SP=FFFA  BP=0000  SI=02C2  DI=FDF4
DS=102A  ES=102A  SS=102A  CS=102A  IP=012D   NV UP EI PL ZR NA PE NC
102A:012D CB             RETF
-T ;然後一步踢(T)過去.
AX=FCB0  BX=0000  CX=102A  DX=006A  SP=FFFE  BP=0000  SI=02C2  DI=FDF4
DS=102A  ES=102A  SS=102A  CS=1FF5  IP=0000   NV UP EI PL ZR NA PE NC
1FF5:0000 FD             STD  ; 不是停在 CS:100h
-S CS:IP,IP+200 CB ;再從這裡開始往底下的200 個指令中找尋 RetF指令
1FF5:011B  ;又找到了!真幸運.
-G11B ;直接執行到這一個RetF的位址
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFFA  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=1FF5  IP=011B   NV UP EI PL ZR NA PE NC
1FF5:011B CB             RETF
-T ;然後一步踢(T)過去.
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0100   NV UP EI PL ZR NA PE NC
102A:0100 B409           MOV    AH,09   ;是停在CS:100上沒錯.完成!
這樣您已經追到解碼後的原始進入點了,只要把記憶體回存後就得到還原後的檔案了.現在我們的問題在於如何取得檔案大小.
我們再度分析這個程式時發現它是用MOVSB來把解壓縮後的程式碼回存,而且執行MOVSB時D旗標是清除的.因此當解壓縮的資料回存完畢後.它的DI暫存器應該指向原來檔案內容的最底部.而且我們也要找出解壓縮的資料回存完畢後,程式會跳到CS:108去.於是我們就把程式停在CS:108上看看DI暫存器的值:
-G108
AX=00FF  BX=0003  CX=0109  DX=0008  SP=FFFE  BP=0000  SI=FCB0  DI=151C
DS=102A  ES=102A  SS=102A  CS=1FF5  IP=0108   NV UP EI PL ZR NA PE NC
1FF5:0108 33C0           XOR    AX,AX

因此原來檔案的大小為DI-100h.為什麼要減掉100h呢?因為程式是從DS:100h開始載入的,而不是從DS:0h.

#小標=■更強力的破解工具 Soft-ICE

#小小標=
如果我們使用Soft-ICE之類軟體來追蹤,因為可以使用除錯暫存器來下中斷點.我們就可以利用下列更簡便的方法來讓流程直接停在原始進入點CS:100h上.
(1).G 100
(2).BPX CS:100
        G
(3).BPMB X CS:100
        G
只是Soft-ICE本身並沒有提供將記憶體內容回寫成檔案的功能.但是您可以在網路上找到檔案回寫的工具程式,可以讓您搭配Soft-ICE使用.

#小標=■還原基本法

#小小標=
這是另一種懶人專用的剝殼方法.很懶,不需要什麼技術.但是對破解而言卻意外地方便.我們都知道加殼的原理了.不管您對檔案如何編碼,如何保護,到最後一定要在記憶體中把它解開,然後執行.因此我們想到一種不勞而獲的方法.等它完全執行完畢後再從記憶體中把它回存.不過這種方法的缺點是不容易正確地記算原來檔案的大小.但對於破解者而言,只要程式能正常執行,回存的檔案太大並沒有關係.這種方法我們依舊拿CRYPTCOM和PKLITE配合第二個Hello world程式來試試吧!
這是使用CRYPTCOM編碼過的檔案.
-R
AX=0000  BX=0000  CX=1436  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0100   NV UP EI PL NZ NA PO NC
102A:0100 60             PUSHA
-G ;直接執行到程式結束.

Hello world!

Program terminated normally (36)
-U100 ; 看! 底下是解碼後的原始程式碼.
102A:0100 B409           MOV    AH,09
102A:0102 BA0B01         MOV    DX,010B
102A:0105 CD21           INT    21
102A:0107 B44C           MOV    AH,4C                         ;'L'
102A:0109 CD21           INT    21
102A:010B 0A0D           OR     CL,[DI]
102A:010D 48             DEC    AX
102A:010E 65             DB     65

這是使用PKLITE縮壓過的檔案.
-R
AX=0000  BX=0000  CX=022C  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=102A  ES=102A  SS=102A  CS=102A  IP=0100   NV UP EI PL NZ NA PO NC
102A:0100 B81C28         MOV    AX,281C
-G

Hello world!

Program terminated normally (36)
-U100  ; 看! 底下是解碼後的原始程式碼.
102A:0100 B409           MOV    AH,09
102A:0102 BA0B01         MOV    DX,010B
102A:0105 CD21           INT    21
102A:0107 B44C           MOV    AH,4C                         ;'L'
102A:0109 CD21           INT    21
102A:010B 0A0D           OR     CL,[DI]
102A:010D 48             DEC    AX
102A:010E 65             DB     65

接下來只要設定適當的檔案大小,然後把記憶體內容回存即可.
這種破解法真是令編碼保護的作者頭疼.不到幾秒鐘就把檔案恢復了.完全不需要任何高深的技術和知識.這種剝殼法雖有缺點,但仍然是對加殼機的一大威脅

#小標=■永不熄滅的戰火

#小小標=
本文所告訴您的雖然只是一小部份的方法,但也已包含了剝殼的基本概念.我也還沒有在這一期為您介紹防破解技巧以及如何識破及閃過這些技巧.如果您有興趣,可以試著剝看看50期所附的那版有加上一點防破解技巧的CRYPTCOM.如果您有需要這兩種版本的CRYPTCOM, (懶得動手照著雜誌Key-In的話.),可以向本雜誌社索取.希望您能從破解中學到一些經驗和技術.我們下回見了!

============================================= [本文結束]

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
onbadday 2009-4-15 19:03
2
0
古董级别的了
游客
登录 | 注册 方可回帖
返回