“破解大牛是怎么煉成的”之殼與ESP定律


文章難易度:★★★
文章閱讀點/知識點:逆向破解
文章作者:Sp4ce
文章來源: i春秋     
關鍵字:網絡 信息安全技術

本文參與i春秋社區原創文章獎勵計划,未經許可禁止轉載!
一、前言
通過前面幾篇的學習,我們學會了利用暴力破解達到繞過注冊機制和追蹤注冊碼來達到“合法”用軟件的方法,但是我們往往會遇到代碼經過混淆器混淆的程序,此類混淆器可以稱之為殼,殼又可分為壓縮殼(常見的有UPX、北斗、ASDPack、Npack、PECompact等)和保護殼(如強殼Safengine、VMprotect、winlicense、Themida等),壓縮殼作用是把程序進行體積縮小化處理,保護殼主要作用是混淆或加密代碼防止他人進行逆向程序、破解程序。我們可以通過一些偵殼程序進行識別,但有些殼會采用偽裝技術來混淆偵殼程序。
本次文章是UPX壓縮殼的脫殼工作。
二、目錄

1、前期工作

2、OD操作

3、小結

三、正文

我們先看下加殼軟件和未加殼對比

左邊是沒有加殼的,右邊是加殼的,明顯的發現體積縮小了一半

我們再用PEID對比下加殼前和加殼后的EP段和一些有用的信息

我們載入OD后會發現這個提示,為了方便接下來的操作,我們在這里選否

載入后的OD

我們F8單步走走,注意右面寄存器FPU的顯示,當有且只有ESP和EIP為紅色時,我們可以用ESP定律了

下圖就是這樣的例子,我們這時候可以右鍵ESP后面那個地址,然后選擇在數據窗口中跟隨

也可以直接在下面的Command窗口中輸入dd 0012FFA4 后回車

這兩種方法最終的效果都會在數據窗口中跟隨到0012FFA4這個地址,然后我們可以右鍵那一段地址任意HEX設置斷點→硬件訪問→word型

這個操作也可以在command窗口輸入 HR 0012FFA4 回車后完成,然后我們按F9運行程序,此時程序會暫停在我們設置的斷點位置

然后我們F8單步走,到了jnz位置后不要再按F8了(這是向上跳轉的),我們用鼠標點擊她的下一行然后按F4,讓程序強制轉到跳轉下面繼續運行,到達jmp后我們必須跳過去,因為接下來就有可能是程序的OEP領空

OEP:程序的入口點,軟件加殼就是隱藏了OEP(或者用了假的OEP)

 

這里就是易語言/VC程序的OEP

然后我們就可以脫殼了,脫殼前我們先把斷點清理掉,以免出錯【調試→硬件斷點→刪除】

然后右擊程序當前位置第一行代碼,選擇OllyDump脫殼調試進程

然后我們在彈出的窗口中選擇脫殼,然后輸入要另存為的文件名

此時,我們已經脫殼結束,檢查下程序能否正常運行

 

我們再看下PEID對比脫殼前和脫殼后的不同

EP段提示UPX0是因為我沒有優化區段

我們可以點>>來詳細看下對比

脫殼后

未脫殼

到此,脫殼完成。

3、小結

程序在下面,部分語言OEP

delphi:

  55            PUSH EBP
  8BEC          MOV EBP,ESP
  83C4 F0       ADD ESP,-10
  B8 A86F4B00   MOV EAX,PE.004B6FA8


vc++
   55            PUSH EBP
   8BEC          MOV EBP,ESP
   83EC 44       SUB ESP,44
   56            PUSH ESI

vc6.0
  55                 push ebp
  8BEC               mov ebp,esp
  6A FF              push -1

vc7.0

  6A 70              push 70
  68 50110001        push hh.01001150
  E8 1D020000        call hh.010017B0
  33DB               xor ebx,ebx

vb:


00401166  - FF25 6C104000   JMP DWORD PTR DS:[<&MSVBVM60.#100>]      ; MSVBVM60.ThunRTMain
0040116C >  68 147C4000     PUSH PACKME.00407C14
00401171    E8 F0FFFFFF     CALL <JMP.&MSVBVM60.#100>
00401176    0000            ADD BYTE PTR DS:[EAX],AL
00401178    0000            ADD BYTE PTR DS:[EAX],AL
0040117A    0000            ADD BYTE PTR DS:[EAX],AL
0040117C    3000            XOR BYTE PTR DS:[EAX],AL


bc++
0040163C > $ /EB 10         JMP SHORT BCLOCK.0040164E
0040163E     |66            DB 66                                    ;  CHAR 'f'
0040163F     |62            DB 62                                    ;  CHAR 'b'
00401640     |3A            DB 3A                                    ;  CHAR ':'
00401641     |43            DB 43                                    ;  CHAR 'C'
00401642     |2B            DB 2B                                    ;  CHAR '+'
00401643     |2B            DB 2B                                    ;  CHAR '+'
00401644     |48            DB 48                                    ;  CHAR 'H'


00401645     |4F            DB 4F                                    ;  CHAR 'O'
00401646     |4F            DB 4F                                    ;  CHAR 'O'
00401647     |4B            DB 4B                                    ;  CHAR 'K'
00401648     |90            NOP
00401649     |E9            DB E9
0040164A   . |98E04E00      DD OFFSET BCLOCK.___CPPdebugHook
0040164E   > \A1 8BE04E00   MOV EAX,DWORD PTR DS:[4EE08B]
00401653   .  C1E0 02       SHL EAX,2
00401656   .  A3 8FE04E00   MOV DWORD PTR DS:[4EE08F],EAX
0040165B   .  52            PUSH EDX
0040165C   .  6A 00         PUSH 0                                   ; /pModule = NULL
0040165E   .  E8 DFBC0E00   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
00401663   .  8BD0          MOV EDX,EAX

dasm:

00401000 >/$  6A 00         PUSH 0                                   ; /pModule = NULL
00401002  |.  E8 C50A0000   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
00401007  |.  A3 0C354000   MOV DWORD PTR DS:[40350C],EAX
0040100C  |.  E8 B50A0000   CALL <JMP.&KERNEL32.GetCommandLineA>     ; [GetCommandLineA
00401011  |.  A3 10354000   MOV DWORD PTR DS:[403510],EAX
00401016  |.  6A 0A         PUSH 0A                                  ; /Arg4 = 0000000A
00401018  |.  FF35 10354000 PUSH DWORD PTR DS:[403510]               ; |Arg3 = 00000000
0040101E  |.  6A 00         PUSH 0                                   ; |Arg2 = 00000000
00401020  |.  FF35 0C354000 PUSH DWORD PTR DS:[40350C]               ; |Arg1 = 00000000

本節出現的名詞解釋

EP段:EntryPoint,入口點
OD命令:
HR 訪問時進行硬件中斷
DD 轉存在堆棧格式
EIP:寄存器的一種,EIP寄存器里存儲的是CPU下次要執行的指令的地址
ESP:寄存器的一種,寄存器里存儲的是是棧的棧底指針,通常叫棧基址

 

四、總結

有看客私下問我能不能直接學破解網絡驗證,那么我的回答是不能,沒有基礎的人,直接上難度高的,會喪失自信心,網絡驗證往往會伴隨各種暗樁,輕則關機重啟藍屏,重則格盤毀MBR放毒,這些我在后面都會有提到

更多安全技術、精品好文、白帽黑客大佬盡在:http://bbs.ichunqiu.com/portal.php


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM