计算机病毒分析与对抗————3、PE文件型病毒

病毒如何感染PE文件?

首先,判断文件是否是PE文件,接下来添加节:


主要涉及到的技术如下:

1、病毒感染重定位技术

重定位的过程可以通过以下步骤进行:

  • 用CALL指令跳转到下一条指令,使下一条指令感染后在内存中的实际地址进栈。
  • 用POP指令取出栈顶的内容,这样就可以得到感染后下一条指令在内存中的实际地址
  • 感染后变量的地址=步骤(2)的地址-偏移地址

代码如下:

call test
pop  eax
sub  eax  , offset test

test为感染前call指令的下一条指令的地址。
eax为感染前变量的地址

2、获取API函数地址


要获取API函数地址,首先要获得Kernel32的基地址,再从Kernel32中找到需要调用的API地址。

获取Kernel32基地址的方法:

PEB、SEH、TOPSTACK

Kernel32中得到API函数的地址:

得到了Kernel32模块地址以后,就可以在该模块中搜索需要的API地址。对于给定的API,搜素其地址可以直接通过Kernel32.dll的引出表信息检索,也可以先搜索出GetProcAddress和LoadLibrary两个API函数的地址,然后利用这两个API函数得到所需要的API函数地址。

LoadLibraryGetProcAddress

LoadLibrary加载一个DLL,返回DLL地址

GetProcAddress通过DLL地址和API函数名获得API函数的地址

C语言实例

DLL地址 = LoadLibrary(“DLL名”);

API函数地址 = GetProcAddress(DLL地址,“函数名”);

3、添加新节感染

PE病毒常见的感染其他文件的方法是在文件中添加一个新节,然后往该新节中添加病毒代码和病毒执行后的返回Host程序的代码,并修改文件头中代码开始执行位置(AddressOfEntryPoint)指向新添加的病毒节的代码入口,以便程序运行后先执行病毒代码。

病毒感染文件的步骤如下:

(1)判断目标文件开始两个字节是否为“MZ”

(2)判断PE文件标记“PE”

(3)判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续

(4)获得Directory(数据目录)的个数(每个数据目录占用8个字节)

(5)得到节表起始位置(Directory的偏移地址+数据目录占用的字节数=节表起始位置)

(6)得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节)

(7)节表起始位置+节的个数*(每个节占用的字节数28H)=目前最后节表的末尾偏移。

(8)开始写入节表:

  •  写入节名(8字节)
  • 写入节的实际字节数(4字节)
  • 写入新节在内存中的开始偏移地址(4字节),同时可以计算出病毒入口位置。
  • 写入本节(即病毒节)在文件中对齐后的大小
  • 吸入本节在文件中的开始位置

(9)修改映像文件头中的节表数目

(10)修改AddressofEntryPoint,同时保存就得AddressOfEntryPoint,以便返回HOST继续执行。

(11)更新SizeOfImage(内存中整个PE映像尺寸=原SizeOfImage+病毒节经过内存节对齐后的大小)

(12)写入感染标记

(13)写入病毒代码到新添加的节中

(14)将当前文件位置设为文件末尾

简单概括:

判断是否是PE文件——》判断是否被感染过——》通过节表信息得到当前最后一个节表的末尾偏移量——》
添加一个新节——》修改节表信息——》修改AddressOfEntryPoint——》修改SizeOfImage——》
写入感染标记——》写入病毒代码到新添加的节中——》将当前文件位置设置为文件末尾。


猜你喜欢

转载自blog.csdn.net/fly_hps/article/details/80066556