dxPack殼工作邏輯
(
總結一下整個殼的loader的工作過程
)
:
1
基礎資料初始化和獲取kerner32。dll函式地址,
有
VirtualAlloc,VirtualProtect,VirtualFree;
2
從
401000備份0x4d長度的資料到棧中,其中包含源區塊數量,解密資料長度,匯入表資訊等其他資訊;
3
以40104d作為源資料起始位置解密0x9f38長度的資料到申請的堆記憶體中;
4
最後從解密後的資料中恢復原pe的資料;
其中包含區塊表、匯入表、各區塊資料。。。
5
執行入口點前的一些回撥函式,例如Tls_callback;
6
轉入原始入口點;
樣本資訊:
1
MD5: 8C2AE7C7D7D62904ED800029A45CA5C8
2
SHA1: 1141C391385E410B14969530ACBA201A233F335F
3
CRC32: 2DCBB0DA
分析工具:IDA xdbg
資料初始化
開頭一個jmp,進入loc_427005,loc_427005函式開頭主要是初始化一些資料,比如載入基址:400000,程式碼開始RVA:1000。
緊接著載入kernel32。dll,並獲取函式地址儲存下來。
獲取的函式有以下三個:
資料備份
然後從401000處複製4d位元組資料到棧中(EBP-78h),後面使用訪問資料時將會使用棧中的這部分資料。
下面是copydata(dst, src, len)函式,就是單位元組複製,第三個引數控制迴圈次數。
資料解密
緊接著從40104d開始解密9f38長度的資料到申請的堆記憶體中。
解密函式在此不過多贅述
,按照一定的方式
把
資料解出來即可。
由於工作中已經實
現
過了DecryptFun
解
密函式的
c++程式碼, 這裡就不再具體闡述
解
密步驟,接著往下說
邏輯。
解密後的原PE資料恢復
解密完資料後,後面恢復原PE資料的邏輯才是關鍵的,主要有以下幾個過程:
a。 原pe塊資料抹除
b。更改區塊個數
c。區塊表資料恢復
d。對應區塊資料恢復
e。DataDirectory中項資料恢復
f。匯入表修復
g。入口點恢復
這裡先把從401000複製到ebp-78h的資料結構展示一下,下面會使用到。
從
401000
複製
4
dh->
|——ebp-78
|
|4dh
|
|——ebp-2b
|
ebp-
78
。
rsrc:
00401000
03
db
3
secnum
ebp-
77
。
rsrc:
00401001
38
9
F
00
00
dd
9
F38h declen
ebp-
73
。
rsrc:
00401005
54
A4
00
00
dd 0A454h decsize
ebp-
6
F 。
rsrc:
0040100
9
00
70
02
00
dd
27000
h zerosize
ebp-
6
b 。
rsrc:
0040100
D
00
60
02
00
dd
26000
h importrva
ebp-
67
。
rsrc:
00401011
44
01
00
00
dd
144
h importsize
ebp-
63
。
rsrc:
00401015
40
46
02
00
dd
24640
h oep
ebp-
5
F 。
rsrc:
0040101
9
00
00
00
00
dd
0
ebp-
5
b 。
rsrc:
0040101
D
00
00
00
00
dd
0
a。 原pe塊資料抹除
上面DecryptFun解密函式執行完畢後,就會從401000開始把資料清零,清零的長度由[ebp-6f]指定。
M
emsetProc函式很簡單,使用第二個引數進行資料填充,先4位元組,最後完成後面的不足4位元組部分。
b。更改區塊數量
先定位到FileHeader,使用[ebp-78]填充FileHeander。NumberOfSections
c。區塊表資料恢復
這部分有三步,先清空對應的28h的區塊表項
資料,然後從解密出的堆資料中拼
接出來新的資料,最後把新的資料寫回。
當
然了這是個
迴圈,要把所有的區塊資料都恢復出來。
d。對應區塊資料恢復
從解密出來的資料中迴圈恢復對應區塊的資料,每個區塊恢復的長度由最新的區塊表中的SizeOfRawData指定。
e。DataDirectory資料項恢復
各個區塊資料恢復完畢後,所有資料都已經歸位了,剩下的就是修正個別資料的正確性了。
(恢復資源表項)
f。匯入表修復
這部分會遍歷匯入表,呼叫LoadLibrary,GetProcAddress修正匯入表函式地址;程式碼較多,邏輯過程不一一說明了。
g。修復重定位
程式碼中還有這部分的修復邏輯,針對exe應該沒有必要,估計是殼設計時考慮到了dll之類的。
h。呼叫TLs CallBack
TLS也是從DataDirectory中獲取的,在exe執行入口點前,先呼叫了一遍。
i。執行原始入口點
原始入口點儲存中[ebp-63]處,然後加上基址,跳轉進入,到此整個殼恢復邏輯就結束啦。
END
辰信領創
專業可信賴的終端安全生產商
物聯網安全|終端安全|大資料安全