恶意代码分析-第十八章-加壳与脱壳
目錄
筆記:
實驗:
Lab18-1
Lab18-2
Lab18-3
筆記:
殼的功能:縮減程序的大小,阻礙對加殼程序的探測和分析
解析函數導入表:1.僅導入LoadLibrary和GetProcessAddress兩個函數。先脫出原始文件,再讀取原始可執行文件的導入函數信息。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.保持原始導入函數表的完整,讓Windows加載器加載所有的DLL及導入函數---->缺乏隱蔽性
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3.為原始導入表中的每個DLL保留一個導入函數,解析時只用查看每個導入庫中的一個函數---->比第二個隱蔽性高
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.不導入任何函數,脫殼存根從庫中查找所有需要的函數。
尾部跳轉:ret? call? NtContinue ZwContinue 隱藏跳轉
識別加殼程序:加殼標識----->導入函數僅有LoadLibrary和GetProcessAddress
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 只有少量代碼被識別
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 加殼警告
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 節名中包含加殼的警告
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .text原始數據大小為0,但虛擬大小不為0
? ? ? ? ? ? ? ? ? ? ? ?闋值計算------>壓縮或者加密數據更接近于隨機數據,因此有一個較高的闋值(Mandiant Red Curtain/Red Curtain)
脫殼:自動脫殼--->PE Explorer
? ? ? ? ? ?手動脫殼--->1.找到加殼算法,編寫一個程序逆向運行它
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.運行脫殼程序,讓脫殼存根幫你工作,讓它從內存中轉儲處進程,然后修正PE頭部
查找OEP:自動工具----->OllyDump,通過Section Hop調用Find OEP(如果一個call函數沒有返回,節與節之間的大跳轉)
? ? ? ? ? ? ? ? ? 手動查找----->查找尾部跳轉指令(jmp,ret)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在棧上設置讀斷點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在代碼每個循環后面設置斷點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在GetProcAddress函數設置斷點,多數脫殼器會使用GetProcAddress函數來解析原始函數的導出表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不要讓代碼執行向上跳
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不同程序:1.命令行程序--->Getversion與GetCommandlineA
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.GUI程序------->GetModuleHandleA與Getversion
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?OllyDbg的Run Trace選項
手動修復導入表:利用OD標注導入函數
常見殼:UPX:壓縮殼? ? ? ? ? ? ? ?
? ? ? ? ? ? ? PECompact:包含反調試異常和混淆代碼
? ? ? ? ? ? ? ASPack:自我修改代碼-----設置硬件斷點
? ? ? ? ? ? ? Petite:單步異常---------硬件斷點---------每個庫至少導出一個函數
? ? ? ? ? ? ? WinUpack:有GUI終端的殼優化壓縮--------GetModuleHandleA/GetCommandlineA
? ? ? ? ? ? ? Themida:復雜,具有反調試與反逆向分析。會在原始程序運行后繼續運行。---------ProcDump轉儲Windows進程的內容
不完全脫殼的情況下分析:并不需要讓其完全脫殼再去分析這個程序。進行轉儲,IDApro分析特定的節,找到一個地址,標記為代碼,拿strings分析。
加殼的dll:在OD中加載dll時,DllMain函數會在od中斷之前就運行。
? ? ? ? ? ? ? ? ? 解決:定位IMAGE_FILE_HEADER,在0x2000處的值為1,表示是一個DLL文件,但如果為0,表示一個EXE文件。? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
ProcDump
實驗:
Lab18-1
加了殼的軟件
明顯的尾部跳轉
Lab18-2
加殼
?使用od插件尋找OEP,然后轉化為code
Lab18-3
可以看出來加殼了,但用od插件并不能定位到OEP
查看代碼尾部跳轉
然而這里也并不能找到OEP
程序的開始位置,有pushfd和pushad的操作把寄存器的值壓入棧,當脫殼完成后。這些寄存器的值還會pop出來
所以執行到如圖位置后,在esp中下硬件訪問斷點。
再次運行,停在OEP位置,然后轉化為代碼
Lab18-4
同樣利用上面的那個esp堆棧平衡
Lab18-5
這個殼隱藏了導入信息,同樣利用上面的那個esp堆棧平衡
總結
以上是生活随笔為你收集整理的恶意代码分析-第十八章-加壳与脱壳的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小白必看,react和jsx/tsx有啥
- 下一篇: 2019北京国际眼镜展 北京思柏润携旗下