模擬追蹤脫殼法
一丶模擬追蹤
1.1 模擬追蹤簡介
模擬追蹤 重點是模擬兩字, 含義就是程序代替人手工的F7(步進) 或者 F8(步過)
回想我們手工脫殼的時候,最笨的方法就是遇到Call跳過(F8) 如果跑飛就遇到Call F7
但是往往最笨的方法就是最好用的方法. 原理也說過.單步跟蹤法是 殼代碼在執行之后總會跳轉到OEP
執行的,其中到達OEP的方式很多中,但是原理就是修改EIP (push + ret jmp)
單步跟蹤方法就是模擬人手工這樣操作了, 你下一個條件斷點. 那么我們主要學習的就是這個條件斷點.這個思路.
網絡上有很多種,我們只知其一不知其二,這里原理也說一下,做一下補充.
其中原理懂了,就不在乎我們使用什么調試器了.
網絡上有內存鏡像法 + 模擬追蹤法
1.2 模擬追蹤法的原理
我們學習模擬追蹤法,學習的其實就是條件斷點的設置,讓程序自動單步或者步過,那么條件該怎么設置?
不知道大家有想過這么一個問題嗎. 殼代碼執行之后總會跳轉到OEP,而且是一個大跳
緊接着因為跳轉了,所以EIP會進行修改了 那么我們條件斷點着重就在於這個EIP上.
我們隨便打開一個程序觀看其內存鏡像
首先我列一個表格如下
鏡像基址 | 大小 | 節(鏡像)名稱 |
---|---|---|
0x0040000 | 0x1000 | dxpack.exe |
0x00401000 | 0x4000 | .text |
0x00405000 | 0x1000 | .data |
0x00406000 | 0x5000 | .idata |
0x0040C000 | 0x1000 | .reloc |
0x40D000 | 0x1000 | .dxpack |
請注意最后一個節,是殼代碼的自身節. 其基地址為0x40D000
那么我們條件斷點怎么設置.
可以設置為 當 EIP < 0x40D000 則進行中斷 為什么是 <
1.首先,脫殼的時候OEP會有一個大跳,直接從0x40D000跳轉到 .text節中的OEP位置. 而.text節的基址 + 大小,明顯小於0x40D000的.
2.為什么要跟.text節對比.原因是OEP是在代碼區,熟悉PE的應該知道.text節中,會有我們OEP,也就是代碼會從OEP開始執行, 殼不管怎么來說.都是最后要跳轉到OEP.所以要 < 殼自身
1.3 網絡上的內存鏡像法與模擬追蹤
首先說一下為什么使用網絡鏡像法,在使用模擬追蹤, 原因就是模擬追蹤只不過是調試器自動跟你你設置的條件來進行單步或者步入的,以我們自己來說,如果我們知道哪里是殼代碼,我們還會去追蹤嗎. 根本不會. 你只是尋找OEP而已.所以會不斷的(F7 F8) 而內存鏡像法其實就是給追蹤設置一個起點.
讓其在這個起點位置進行追蹤.進而更快的到達你的斷點處. 也就是你的條件斷點.
當然你如果不想設置起點,直接在入口點就設置條件斷點也是可以的,只不過就是時間問題.時間的快慢而已.
二丶調試工具的使用
2.1 x64dbg追蹤的使用
如下圖
隨便點擊一個
讓其自動跟蹤即可.
2.2 Ollydbg工具的使用
OllyDbg 以及 X64都可以使用命令進行快速設置的.以及其調試界面也集成了追蹤可以自由選擇
ollydbg中首先要設置條件 (CTRL + T) 而后才能使用 跟蹤步過(CTRL + F12) 或者跟蹤步入(CTRL + F11)
三丶總結
總結來說就是
模擬追蹤是調試器模擬 F7 F8 重要的是條件斷點的設置,條件斷點原理就是OEP會在.text節中.
而EIP始終會跳轉到.text節中.而.text節小於殼代碼,所以設置的就是 EIP < 殼代碼基址