• Virut.ce-感染型病毒分析报告


    1.样本概况

    病毒名称 Virus.Win32.Virut.ce
    MD5 6A500B42FC27CC5546079138370C492F
    文件大小 131 KB (134,144 字节)
    壳信息 无壳
    文件名 9-29_vir.exe(感染程序)
    数字签名 NO
    时间戳 2000年1月10日, 12:00:00

    1.1 样本行为

     恶意代码为感染型病毒,母体病毒通过将正常的PE文件进行加密,然后每个受感染的文件又可以进行全盘传播,通过连接国外IP服务器发送上线报文。

    1.2 测试环境及工具

    操作系统 Windows7(x86)
    行为检测 Wireshark、Api Monitor、Malware Defender
    文件检测 010 Editor、PEID
    虚拟机平台 VMware10
    调试工具 OD、IDA

    1.3 分析目标

     1)样本的网络行为、文件行为

     2)感染传播的方式

    2、具体行为分析

    2.1 主要行为概述

    2.2 恶意程序对用户造成的危害

    2.2.1 感染途径

    • 通过母体文件,或被母体文件感染过的文件感染。

    • 运行后会将恶意代码以及模块注入explorer.exeConhost.exewinlogo.exedwm.exe等进程。

    2.2.2 恶意行为

    • 感染已经打开的进程和磁盘可执行文件,重写程序入口点的代码并指向病毒代码。

    • 与国外IP发送数据包进行通讯连接。

    2.3 恶意代码分析

    2.3.1 恶意程序加固方式

     1)加密处理:病毒代码处理经过多层的解密指令,运行过程中对后续代码进行解密,解密代码会变形。例如原反汇编指令代码如下:

    
    00424772 imul edx,eax,0xCFA924B3
    00424778 mov ecx,0x1A7DDAE2
    0042477D sbb byte ptr ss:[ebp-0x223],dh; 带借位减法指令,这里会修改42479D位置的ret变成call
    00424783 pop edi
    00424784 lea edi,dword ptr ds:[edi-0x69B4>
    0042478A test dl,bh ; dl = 4D('M');查找文件头
    0042478C mov dl,ah
    0042478E adc al,bl
    00424790 adc al,cl
    00424792 push dword ptr ss:[ebp-0x17D]
    00424798 add edi,ebp ; 9-29_vir.004249C0
    0042479A xchg cl,cl
    0042479C pop edx
    0042479D retn    ; import - NoTips ---- By Jmp2 -
    0042479E add al,0x3
    004247A0 add byte ptr ds:[eax],al
    004247A2 mov edi,edi
    
    

     执行完【0042477D sbb byte ptr ss:[ebp-0x223],dh】这条语句后,机器码为C3的改成了E8,ret就变成了call。修改后的代码如下:

    图:指令被修改

     2)花指令:代码会在指令中增加00,在鼠标滑动时指令发生变化。

    图:花指令

    2.3.2 恶意行为过程截获

    • 恶意行为
      (1)修改其他进程的内存:

    图:修改其程序内存

    (2)API行为监控:

    图:API行为监控

    (3)感染文件变化:

    图:源文件与感染文件对比

    • 网络行为

     通过Malware Defender对被感染的文件进行监控,发现每个被感染的文件自成母体病毒文件向当前的系统进程dwm.exe进行了修改。通过dwm.exe文件访问国外IP。

    图:注入进程,进程访问网络

     病毒运行后会访问国外IP:148.81.111.121,通过VT查询该IP与多个恶意代码HASH绑定,Wireshark抓包后的数据包:

    图:访问IP

     通过Windows系统自带的DNS记录跟踪大量域名后,通过系统命令确定病毒感染后访问的国外IP绑定的域名为ant.trenz.pl。

    图:Windwos自带DNS记录访问的域名

    图:系统命令关联域名的IP地址

    2.3.3 恶意程序的代码分析记录

    2.3.3.1 调用病毒代码

     病毒代码执行前,首先获取kernel32.dll入口循环遍历代码所需函数,通过IDA静态可查看代码运行的结构是在不断进行循环。

    图:OD-kernel32入口地址

    图:IDA-kernel32函数地址遍历

     当面对这类感染类病毒,很多使用寄存器进行传值的指令是无法用IDA轻轻松松F5查看源码的。

     所以分析过程中我采用通过行为监控+动态调试的思路分析!打开Malware Defender,借助吾爱破解OD进行F8单层步过直到程序结束。当Malware Defender出现关键行为时,对走过的call进行记录,然后深入这个call再逐层分析。

     跟踪到第6个函数时,程序出现了修改其他进程内存、其他进程中创建线程的行为。

    图:第6个call为重点分析函数

     通过反复还原虚拟机快照对比,发现该病毒在感染后 [cmp al,bl]执行的分支是不一样的,如果没有被感染的系统JNZ不跳转程序继续向下执行,否则JNZ则跳转到下一个分支处。对比值是eax与ebx的寄存器的低位值。此时的AL与BL的值分别为:Al=B7,Bl=00。

     为了验证这个【B7】的值是否为随机值,切换到另外一台虚拟机再次单步跟踪有操作EAX的的位置,发现在00424A38地址处执行完【mov eax,dword ptr ds:[eax+0x34];】,B7的值就没有发生过改变,由此得出B7这个值就是病毒判断系统有没有被感染的标识,对比反汇编代码如下:

    00424A38 mov eax,dword ptr ds:[eax+0x34]; 获取感染标志位
    00424A3B jmp short 9-29_vir.00424A5D
    00424A3D and al,0xFF
    00424A3F cmc
    00424A40 mov edx,0x8B090FE1
    00424A45 sete dh
    00424A48 inc ch
    00424A4A push 0xC0FCDCDC
    00424A4F call 9-29_vir.00424845     ; ----
    00424A54 and al,al
    00424A56 xor ecx,ebp                ; 9-29_vir.004249C0
    00424A58 call 9-29_vir.00424841     ; -----
    00424A5D cmp al,bl                  ; 判断是否被感染
    00424A5F jnz short 9-29_vir.00424A6A; 已感染则跳转
    00424A61 xchg dh,al                 ; 该分支1在未感染时,执行
    00424A63 xchg esi,edx
    00424A65 call 9-29_vir.00424702     ; ;重点分析函数;import
    00424A6A push 0xBC8257D8            ; 感染后执行的分支2
    00424A6F jmp short 9-29_vir.00424A74
    00424A71 mov ebx,ebx                ; kernel32.75EC0000
    00424A73 clc
    00424A74 xchg ch,cl
    
    

    所有寄存器当前的值如下:

    EAX 000000B7
    ECX 0012FF70
    EDX 00000000
    EBX 75EC0000 kernel32.75EC0000
    ESP 0012FF38
    EBP 004249C0 9-29_vir.004249C0
    ESI E2FCE64A
    EDI 00000506
    EIP 00424A5D 9-29_vir.00424A5D
    C 1  ES 0023 32位 0(FFFFFFFF)
    P 1  CS 001B 32位 0(FFFFFFFF)
    A 0  SS 0023 32位 0(FFFFFFFF)
    Z 1  DS 0023 32位 0(FFFFFFFF)
    S 0  FS 003B 32位 7FFDE000(4000)
    T 0  GS 0000 NULL
    D 0
    O 0  LastErr ERROR_ALREADY_EXISTS (000000B7)
    EFL 00000247 (NO,B,E,BE,NS,PE,GE,LE)
    ST0 empty 0.0
    ST1 empty 0.0
    ST2 empty 0.0
    ST3 empty 0.0
    ST4 empty 0.0
    ST5 empty 0.0
    ST6 empty 0.0
    ST7 empty 0.0
                   3 2 1 0      E S P U O Z D I
    FST 0000  Cond 0 0 0 0  Err 0 0 0 0 0 0 0 0  (GT)
    FCW 027F  Prec NEAR,53  掩码    1 1 1 1 1 1
    
    

     当前已知关键感染代码都在00424A65地址的call内,那么按照原有思路继续根据行为找关键call,F8单步跟踪所有的call后借助监控行为软件的结果细化分析各层call内的反汇编指令。

    2.3.3.2 代码混淆

     病毒代码处理存在两种方式,一种是对后续代码进行解密,解密代码会变形。另一种是后续代码是明文未加密直接调用明文。例如原反汇编指令代码如下:

    
    00424772 imul edx,eax,0xCFA924B3
    00424778 mov ecx,0x1A7DDAE2
    0042477D sbb byte ptr ss:[ebp-0x223],dh   ; 带借位减法指令,这里会修改42479D位置的ret变成call
    00424783 pop edi
    00424784 lea edi,dword ptr ds:[edi-0x69B4>
    0042478A test dl,bh                       ; dl = 4D('M');查找文件头
    0042478C mov dl,ah
    0042478E adc al,bl
    00424790 adc al,cl
    00424792 push dword ptr ss:[ebp-0x17D]
    00424798 add edi,ebp                      ; 9-29_vir.004249C0
    0042479A xchg cl,cl
    0042479C pop edx
    0042479D retn                             ; import - NoTips ---- By Jmp2 -
    0042479E add al,0x3
    004247A0 add byte ptr ds:[eax],al
    004247A2 mov edi,edi
    
    

    执行完【0042477D sbb byte ptr ss:[ebp-0x223],dh】这条语句后,机器码为C3的改成了E8,ret就变成了call。修改后的代码如下:

    图:指令被修改

    在跟随中遇到获取kernel32.dll解密代码的算法。反汇编代码如下:

    00424896 xor eax,eax                    ; kernel32.BaseThreadInitThunk
    00424898 imul eax,eax,0xF               ; eax == eax*0xF
    0042489B lea ebx,dword ptr ds:[esi-0x18]; ebx = esi - 0x18
    0042489E inc ebx                        ; ebx = ebx + 1
    0042489F lea ebx,dword ptr ds:[eax-0x3] ; ebx = eax-0x3
    004248A2 movzx ecx,byte ptr ds:[esi+0x3]; Kernel32函数存放
    004248A6 sbb bh,0xCB                    ; bh = bh - bh - CF
    004248A9 dec ebx                        ; ebx = ebx - 1
    004248AA adc bl,0x25                    ; bl =bl + 0x25 + CF
    004248AD not ebx                        ; 位翻转指令,将操作数中的每一位翻转
    004248AF sub eax,ecx                    ; eax = eax - ecx
    004248B1 sub esi,-0x12
    004248B4 lea esi,dword ptr ds:[esi-0x11]; 取有效地址
    004248B7 cmp byte ptr ds:[esi+0x3],0xA  ; 获取所有kernel32.dll函数
    004248BB jnb short 9-29_vir.00424898    ;大于或等于转移,因为kernel32.dll函数后的下一个是0xA(换行符)
    
    

    图:OD-反汇编代码

    指令块通过jmp连接,跳转后有指令变形的红色提示。

    图:通过JMP连接

    2.3.3.3 挂钩底层API函数

     进入代码变形后的指令继续跟踪,发现挂钩了底层API函数。对应的七个函数分别为ZwCreateFile、ZwOpenFile、ZwCreateProcess、ZwCreateProcessEx、ZwCreateUserProcess、ZwQueryInformationProcess、ZwDeviceIoControlFile;反汇编指令如下:

    0041E339 mov eax,dword ptr ss:[ebp+0xD2723C6]    ; ntdll.ZwCreateFile
    0041E33F push dword ptr ds:[eax+0x1]
    0041E342 pop dword ptr ss:[ebp+0xD277592]
    0041E348 cmp dword ptr ss:[ebp+0xD277592],0xFFFF
    0041E352 ja 9-29_vir.0041E2A9
    0041E358 mov eax,dword ptr ss:[ebp+0xD2723E2]    ; ntdll.ZwOpenFile
    0041E35E push dword ptr ds:[eax+0x1]
    0041E361 pop dword ptr ss:[ebp+0xD277617]
    0041E367 cmp dword ptr ss:[ebp+0xD277617],0xFFFF
    0041E371 ja 9-29_vir.0041E2A9
    0041E377 mov eax,dword ptr ss:[ebp+0xD2723CA]    ; ntdll.ZwCreateProcess
    0041E37D push dword ptr ds:[eax+0x1]
    0041E380 pop dword ptr ss:[ebp+0xD277621]
    0041E386 cmp dword ptr ss:[ebp+0xD277621],0xFFFF
    0041E390 ja 9-29_vir.0041E2A9
    0041E396 mov ecx,dword ptr ss:[ebp+0xD2723CE]    ; ntdll.ZwCreateProcessEx
    0041E39C jecxz short 9-29_vir.0041E3D8
    0041E39E push dword ptr ds:[ecx+0x1]
    0041E3A1 pop dword ptr ss:[ebp+0xD27762E]
    0041E3A7 cmp dword ptr ss:[ebp+0xD27762E],0xFFFF
    0041E3B1 ja 9-29_vir.0041E2A9
    0041E3B7 mov ecx,dword ptr ss:[ebp+0xD2723D6]    ; ntdll.ZwCreateUserProcess
    0041E3BD jecxz short 9-29_vir.0041E3D8
    0041E3BF push dword ptr ds:[ecx+0x1]
    0041E3C2 pop dword ptr ss:[ebp+0xD27763B]
    0041E3C8 cmp dword ptr ss:[ebp+0xD27763B],0xFFFF
    0041E3D2 ja 9-29_vir.0041E2A9
    0041E3D8 mov ecx,dword ptr ss:[ebp+0xD2723F2]    ; ntdll.ZwQueryInformationProcess
    0041E3DE jecxz short 9-29_vir.0041E3FC
    0041E3E0 push dword ptr ds:[ecx+0x1]
    0041E3E3 pop dword ptr ss:[ebp+0xD27766F]
    0041E3E9 cmp dword ptr ss:[ebp+0xD27766F],0xFFFF
    0041E3F3 jbe short 9-29_vir.0041E3FC
    0041E3F5 and dword ptr ss:[ebp+0xD2723F2],0x0
    0041E3FC lea eax,dword ptr ss:[ebp+0xD2721A4]
    0041E402 lea edi,dword ptr ss:[ebp+0xD277934]
    0041E408 push eax                                ; ntdll.ZwDeviceIoControlFile
    
    

    图:OD-挂钩七个底层API函数

    2.3.3.4 自身映射到开辟的内存中

     第三层数第3个call后。F8跟踪过程中有一个底层API函数,ZwMapViewOfSection作用为创建内存将自身映射到进程中:

    图:OD-调用ZwMapViewOfSection

    2.3.3.5 解密代码

     第三层第4个call中还在进行多个循环进行判断解密长度、解密数据,当这个call运行完毕,指令块发生改变。

    001F035B sub ebx,0x66E4
    001F0361 and ecx,0x7FFF
    001F0367 bt dword ptr ss:[ebp+0xD271C9E],ebx
    001F036E jnb short 001F0373
    001F0370 inc esi
    001F0371 jmp short 001F0399
    001F0373 cmp dword ptr ss:[ebp+0xD271E1A],0x0
    001F037A je short 001F0398
    001F037C mov eax,ebx
    001F037E sub eax,dword ptr ss:[ebp+0xD271E1A]
    001F0384 jb short 001F0398
    001F0386 cmp eax,0x4
    001F038B jnb short 001F0398
    001F038D mov al,byte ptr ds:[eax+ebp+0xD271E1E]
    001F0394 inc esi
    001F0395 stos byte ptr es:[edi]
    001F0396 jmp short 001F0399
    001F0398 movs byte ptr es:[edi],byte ptr ds:[esi]
    001F0399 inc ebx
    001F039A loopd short 001F0367                    ; 循环204次
    001F039C inc dl
    001F039E pop esi                                 ; 001F0780
    001F039F cmp dl,byte ptr ss:[ebp+0xD27189D]      ; 比对条件,对指令变形
    001F03A5 jb short 001F0340
    001F03A7 push 0x2E
    001F03AC lea esi,dword ptr ss:[ebp+0xD271E22]
    001F03B2 pop ecx                                 ; 001F0780
    001F03B3 movzx edx,word ptr ds:[esi]
    001F03B6 movzx eax,word ptr ds:[esi+0x4]
    001F03BA movzx ebx,word ptr ds:[esi+0x2]
    001F03BE sub eax,ebx
    001F03C0 mov dword ptr ds:[edx+ebp+0xD271000],eax
    001F03C7 sub ebx,edx
    001F03C9 mov al,byte ptr ds:[edx+ebp+0xD270FFF]
    001F03D0 cmp ebx,0x4                             ; 比对长度
    001F03D3 jnz short 001F0401
    001F03D5 cmp al,0xE8
    001F03D7 je short 001F0401
    001F03D9 cmp al,0xE9
    001F03DB je short 001F0401
    001F03DD cmp al,0xEB
    001F03DF jnz short 001F03EB
    001F03E1 mov byte ptr ds:[edx+ebp+0xD270FFF],0xE9
    001F03E9 jmp short 001F0401
    001F03EB mov al,0xF
    001F03ED xchg byte ptr ds:[edx+ebp+0xD270FFE],al
    001F03F4 cmp al,0xF
    001F03F6 je short 001F0401
    001F03F8 add al,0x10
    001F03FA mov byte ptr ds:[edx+ebp+0xD270FFF],al
    001F0401 add esi,0x6
    001F0404 loopd short 001F03B3                    ; 循环46次  
    
    

    图:OD-Loop循环结束,指令块发生改变

    2.3.3.6 遍历进程

     跟进001F0796这个call内,病毒在此处进行了遍历进程的操作,但在此之前调用了FreeLibrary、CloseHandle可见已经进行了加载某个模块的操作。通过CreateToolhelp32Snapshot通过获取进程信息、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照,然后跳过前4个进程后程序继续向下执行,反汇编代码如下:

    001F07C9 call dword ptr ss:[ebp+0xD2722E6]; kernel32.CreateToolhelp32Snapshot
    001F07CF mov ecx,0x128
    001F07D4 xchg eax,edi
    001F07D5 sub esp,ecx
    001F07D7 mov dword ptr ss:[esp],ecx
    001F07DA push esp                         ; 进程结信息结构体
    001F07DB push edi                         ; 句柄
    001F07DC call dword ptr ss:[ebp+0xD27233E]; kernel32.Process32First
    001F07E2 xor esi,esi
    001F07E4 and dword ptr ss:[ebp+0xD277A94],0x0
    001F07EB push esp                         ; 进程结信息结构体
    001F07EC push edi                         ; 句柄
    001F07ED call dword ptr ss:[ebp+0xD272342]; kernel32.Process32Next
    001F07F3 test eax,eax
    001F07F5 je short 001F0865
    001F07F7 inc esi
    001F07F8 cmp esi,0x4                      ; 前4个进程名则继续遍历
    001F07FB jb short 001F07EB
    001F07FD push dword ptr ss:[esp+0x8]      ; 进程标示符
    001F0801 push 0x0                         ; 是否继承句柄
    001F0803 push 0x2A                        ; 渴望得到的访问权限
    

    图:OD-遍历进程

    2.3.3.7 创建远程线程注入

    前四个进程遍历后使用OpenProcess做打开操作, CreateRemoteThread创建远程线程,反汇编如下:

    001F07F8 cmp esi,0x4       ; 前4个进程名则继续遍历
    001F07FB jb short 001F07EB
    001F07FD push dword ptr ss:[esp+0x8]; 进程标示符
    001F0801 push 0x0          ; 是否继承句柄
    001F0803 push 0x2A         ; 渴望得到的访问权限
    001F0805 call dword ptr ss:[ebp+0xD27233A]; kernel32.OpenProcess
    001F080B test eax,eax
    001F080D je short 001F07EB
    001F080F xchg eax,ebx
    001F0810 call 001F2574
    001F0815 xor ecx,ecx
    001F0817 xchg eax,ecx
    001F0818 jecxz short 001F085C
    001F081A cmp dword ptr ss:[ebp+0xD277A94],eax
    001F0820 jnz short 001F085C
    001F0822 mov edx,dword ptr ss:[esp+0x24]
    001F0826 or edx,0x20202020
    001F082C cmp edx,0x73727363
    001F0832 je short 001F085C
    001F0834 add ecx,0x3C38
    001F083A push eax
    001F083B push esp
    001F083C push eax
    001F083D push esi
    001F083E push ecx
    001F083F push eax
    001F0840 push eax                         ; 指向SECURITY_ATTRIBUTES结构指定新的线程安全描述符
    001F0841 push ebx                         ; 进程句柄
    001F0842 call dword ptr ss:[ebp+0xD2722DE]; kernel32.CreateRemoteThread
    
    

    图:OD-创建远程线程注入

    2.3.3.8 修改进程内存

     单步跟踪发现每次经过001F0810地址的call便会出现修改其他进程内存的操作, 深入分析,发现这个call内会挂钩其七个api函数,挂钩的已知Api函数名为:ZwOpenSection、ZwMapViewOfSection、ZwDeviceIoControlFile、ZwCreateFile、ZwOpenFile、ZwCreateProcess、ZwCreateProcessEx、ZwCreateUserProcess、ZwQueryInformationProcess,反汇编如下:

    001F255D push eax
    001F255E call dword ptr ss:[ebp+0xD2723EA]; ntdll.ZwOpenSection
    001F2564 add esp,0x20
    001F2567 xor edx,edx
    001F2569 test eax,eax
    001F256B setns dl
    001F256E neg edx
    001F2570 pop eax    ; 001F0863
    001F2571 and eax,edx
    001F2573 retn       ; 这里直接跳转到下一个函数
    001F2574 push edi
    ……….
    001F2574 push edi
    001F2575 xor edi,edi
    001F2577 call 001F252F
    001F257C je 001F2661
    001F2582 push eax
    001F2583 push 0xB7C4
    001F2588 mov edx,esp
    001F258A push 0x0
    001F258C mov ecx,esp
    001F258E push 0x40    ; Win32Protect
    001F2590 push 0x100000; AllocationType
    001F2595 push 0x2     ; InheritDisposition
    001F2597 push edx     ; ViewSize
    001F2598 push 0x0     ; SectionOffset
    001F259A push 0xB7C4  ; CommitSize
    001F259F push 0x0     ; ZeroBits
    001F25A1 push ecx     ; *BaseAddress
    001F25A2 push ebx     ; ProcessHandle
    001F25A3 push eax     ; SectionHandle
    001F25A4 call dword ptr ss:[ebp+0xD2723DE]; ntdll.ZwMapViewOfSection
    001F25AA pop edi
    001F25AB pop ecx
    001F25AC call dword ptr ss:[ebp+0xD2722C6]; kernel32.CloseHandle
    001F25B2 test edi,edi
    001F25B4 je 001F2661
    001F25BA mov ecx,dword ptr ss:[ebp+0xD271891]
    001F25C0 jecxz short 001F25CE
    001F25C2 lea edx,dword ptr ss:[ebp+0xD271000]
    001F25C8 add edx,ecx
    001F25CA push edi
    001F25CB push ebx
    001F25CC call edx                            ; ntdll.KiFastSystemCallRet
    001F25CE>test dword ptr ss:[ebp+0xD275B83],0x
    001F25D8 je short 001F25EF
    001F25DA mov eax,dword ptr ss:[ebp+0xD2723DA]; ntdll.ZwDeviceIoControlFile
    001F25E0 test eax,eax
    001F25E2 je short 001F25EF
    001F25E4 lea ecx,dword ptr ds:[edi+0x68B1]
    001F25EA call 001F2477
    001F25EF mov eax,dword ptr ss:[ebp+0xD2723C6]; ntdll.ZwCreateFile
    001F25F5 lea ecx,dword ptr ds:[edi+0x6591]
    001F25FB call 001F2477
    001F2600 mov eax,dword ptr ss:[ebp+0xD2723E2]; ntdll.ZwOpenFile
    001F2606 lea ecx,dword ptr ds:[edi+0x6616]
    001F260C call 001F2477
    001F2611 mov eax,dword ptr ss:[ebp+0xD2723CA]; ntdll.ZwCreateProcess
    001F2617 lea ecx,dword ptr ds:[edi+0x6620]
    001F261D call 001F2477
    001F2622 mov eax,dword ptr ss:[ebp+0xD2723CE]; ntdll.ZwCreateProcessEx
    001F2628 test eax,eax
    001F262A je short 001F2637
    001F262C lea ecx,dword ptr ds:[edi+0x662D]
    001F2632 call 001F2477
    001F2637 mov eax,dword ptr ss:[ebp+0xD2723D6]; ntdll.ZwCreateUserProcess
    001F263D test eax,eax
    001F263F je short 001F264C
    001F2641 lea ecx,dword ptr ds:[edi+0x663A]
    001F2647 call 001F2477
    001F264C mov eax,dword ptr ss:[ebp+0xD2723F2]; ntdll.ZwQueryInformationProcess
    001F2652 test eax,eax
    001F2654 je short 001F2661
    001F2656 lea ecx,dword ptr ds:[edi+0x666E]
    001F265C call 001F2477
    001F2661 mov eax,edi
    001F2663 pop edi
    001F2664 retn
    
    

    图:OD-挂钩底层API函数

    2.3.3.9 发送网络数据包

    在远程线程注入执行后,在winlogon.exe进程出现了联网行为。再此之前的单步跟踪则是dwm.exe进行联网访问,推测病毒是将联网执行的恶意代码注入到某个进程后,将联网操作交给了被注入的进程中。且联网的进程是存在随机性的。

    图:联网行为监控

    运行后会访问国外IP:148.81.111.121,通过VT查询该IP与多个恶意代码HASH绑定,Wireshark抓包后的数据包:

    图:访问IP

    通过Windows系统自带的DNS记录跟踪大量域名后,用系统命令确定病毒感染后访问的国外IP绑定的域名为ant.trenz.pl。

    图:Windwos自带DNS记录访问的域名

    图:系统命令关联域名的IP地址

    PChunter查看winlogon已经被注入了3个线程。

    2.3.3.10 恢复执行原始文件

    跟到最后的几个call,已经是运行原先程序的代码。因为我用母体感染的是我自己写的程序。printf(“11111111”)就是。。。

    3、思考小结

    这个病毒分析起来还是有难度的,病毒没有跟完,没有办法像某些常见病毒一样可以IDA F5大法轻松查看伪C代码。C和汇编的基础需要提升的前提下,也引发了一些思考。

    1、病毒分析方面

    • 1)使用OD动态调试对于病毒运行的流程架构不像IDA一般清晰,如何使用IDAPython辅助将esi等寄存器传值的函数在IDA中标识出来让自己通过静态分析,提升分析速度。
    • 2)对于挂钩底层API函数这里,是在同事指点下修正过了。网上的文章分析中提到使用了zwXXXXX这类函数就是挂钩了内核函数是不严谨的。只能相当于调用了系统DLL中比较底层的函数,距离内核还差一段距离。

    2、编程技术方面

    • 1)如果是我自己写这类程序,还有什么思路可以隐藏进程。
    • 2)注入到系统进程内存中的数据,采用什么手段可以排查。

    4、参考

    virut详细分析 - 米哈伊尔 - 博客园
    http://www.cnblogs.com/Mikhail/p/5615286.html

  • 相关阅读:
    mysql 主从架构搭建
    tomcat+nginx 反向代理 动静分离
    ELK(Elasticsearch + Logstash + Kibana)安装部署对nginx的日志收集
    Kibana server is not ready yet出现的原因
    apache+tomcat+单机双实例+动静分离+负载均衡
    docker的基本安装和简单使用+Dockerfile常用指令
    LVS+keepalived+DR 负载均衡高可用
    md5sum摘要
    python爬虫
    python和数据库
  • 原文地址:https://www.cnblogs.com/17bdw/p/7776877.html
Copyright © 2020-2023  润新知