加殼器是一種防止逆向工程的手段,不管是病毒或商用軟體都可能會加殼來保護執行檔,防止輕易的被逆向工程破解或是避免被防毒軟體偵測。加殼就像是把執行檔套了一層殼,執行時才會動態剝殼,一般分析很容易就被檔在外面的殼。根據加殼器的實作,常見的殼可分為壓縮殼、加密殼和虛擬機殼。本次專題將會透過會實作壓縮殼了解基本加殼器的運作方式、執行檔從一個靜態檔案到被執行起來的流程和 anti-reverse engineering 的技術。
- 作業系統
- Windows 10/11
- 編譯器
- MinGW:用於編譯加殼器
- FASM:用於編譯殼
- Debug
- x64dbg
- PE-bear
- 程式語言
- C:用於撰寫加殼器
- ASM:用於撰寫殼
- 先判斷目標是不是 PE 格式的檔案
- 利用開源輕量的 aPLib 套件壓縮各個 section、section header、解殼需要的資訊
- 給各個 section 寫入的權限,用於解殼時恢復 section 內容、section 的 SizeOfRawData 和 PointerToRawData 欄位設為 0
- 新增 .mop1、.mop2、.mop3 三個 section
- .mop1:儲存壓縮後的資料,其包括加殼前各個 section 的內容、加殼前的 section header、解殼需要的資訊
- .mop2:存放 stub,用組合語言撰寫,負責解殼的程式片段
- .mop3:存放不能壓縮的資料,像是 resource、load configuration 等等
- push 各個 register、flag
- 解壓 .mop1 的內容
- 根據解壓後的原資料復原各個 header
- 模擬 loader 把解壓縮後的原 section 內容根據 section header 放到指定位置
- 模擬 loader 遍歷原 import table,手動 load 一個個 dll 進來和根據原 import name table 一個一個復原 IAT 的內容
- pop 各個 register、flag
- 成功解殼,跳到原程式的 oep
fasm ./stub/stub.asm ./stub/stub.bin
gcc packer.c -o packer.exe