文章難易度:★★★
文章閱讀點/知識點:逆向破解
文章作者: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