病毒分析之dxpack脫殼手記

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

病毒分析之dxpack脫殼手記

病毒分析之dxpack脫殼手記

資料初始化

開頭一個jmp,進入loc_427005,loc_427005函式開頭主要是初始化一些資料,比如載入基址:400000,程式碼開始RVA:1000。

病毒分析之dxpack脫殼手記

緊接著載入kernel32。dll,並獲取函式地址儲存下來。

病毒分析之dxpack脫殼手記

獲取的函式有以下三個:

病毒分析之dxpack脫殼手記

病毒分析之dxpack脫殼手記

資料備份

然後從401000處複製4d位元組資料到棧中(EBP-78h),後面使用訪問資料時將會使用棧中的這部分資料。

病毒分析之dxpack脫殼手記

下面是copydata(dst, src, len)函式,就是單位元組複製,第三個引數控制迴圈次數。

病毒分析之dxpack脫殼手記

病毒分析之dxpack脫殼手記

資料解密

緊接著從40104d開始解密9f38長度的資料到申請的堆記憶體中。

病毒分析之dxpack脫殼手記

解密函式在此不過多贅述

,按照一定的方式

資料解出來即可。

由於工作中已經實

過了DecryptFun

密函式的

c++程式碼, 這裡就不再具體闡述

密步驟,接著往下說

邏輯。

病毒分析之dxpack脫殼手記

解密後的原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]指定。

病毒分析之dxpack脫殼手記

M

emsetProc函式很簡單,使用第二個引數進行資料填充,先4位元組,最後完成後面的不足4位元組部分。

病毒分析之dxpack脫殼手記

b。更改區塊數量

先定位到FileHeader,使用[ebp-78]填充FileHeander。NumberOfSections

病毒分析之dxpack脫殼手記

c。區塊表資料恢復

這部分有三步,先清空對應的28h的區塊表項

資料,然後從解密出的堆資料中拼

接出來新的資料,最後把新的資料寫回。

然了這是個

迴圈,要把所有的區塊資料都恢復出來。

病毒分析之dxpack脫殼手記

d。對應區塊資料恢復

從解密出來的資料中迴圈恢復對應區塊的資料,每個區塊恢復的長度由最新的區塊表中的SizeOfRawData指定。

病毒分析之dxpack脫殼手記

e。DataDirectory資料項恢復

各個區塊資料恢復完畢後,所有資料都已經歸位了,剩下的就是修正個別資料的正確性了。

(恢復資源表項)

病毒分析之dxpack脫殼手記

f。匯入表修復

這部分會遍歷匯入表,呼叫LoadLibrary,GetProcAddress修正匯入表函式地址;程式碼較多,邏輯過程不一一說明了。

病毒分析之dxpack脫殼手記

g。修復重定位

程式碼中還有這部分的修復邏輯,針對exe應該沒有必要,估計是殼設計時考慮到了dll之類的。

病毒分析之dxpack脫殼手記

h。呼叫TLs CallBack

TLS也是從DataDirectory中獲取的,在exe執行入口點前,先呼叫了一遍。

病毒分析之dxpack脫殼手記

i。執行原始入口點

原始入口點儲存中[ebp-63]處,然後加上基址,跳轉進入,到此整個殼恢復邏輯就結束啦。

病毒分析之dxpack脫殼手記

病毒分析之dxpack脫殼手記

END

辰信領創

專業可信賴的終端安全生產商

病毒分析之dxpack脫殼手記

物聯網安全|終端安全|大資料安全