
之前分享了关于病毒的的一些小知识,有坛友对PE文件病毒比较感兴趣,于是,把之前学过的PE文件型病毒知识整理分享一下。
是Windows系统病毒之一,在安全模式下可以删除。
该病毒是将可执行文件的代码中程序入口地址改为病毒的程序入口,这样就会导致用户在运行的时候执行病毒文件,这是黑客比较常用的方式。
:如何判断一个文件是否为PE文件?
1、检验文件头部第一个字的值是否等于MZ,如果是,则DOS头有效。
2、用DOS头的字段e_lfanew来定位PE头。
3、比较PE透的第一个双字的值是否等于45500000H(PE\0\0)。
#定义局部变量
IMAGE_DOS_HEADER dos_header;
IMAGE_NT_HEADER nt_header;
CFile fp;
fp.Read(&dos_header,sizeof(dos_header));
If(dos_header.e_magic!=0x5A4D) #用DOS头的字段e_lfanew来定位PE头。
{…..}
fp.Seek(dos_header.e_lfanew,CFile::begin);
if(nt_header.Signature!=0x00004550) #比较PE透的第一个双字的值是否等于45500000H(PE\0\0)。
定位、获取API函数、搜索目标文件、感染、破坏。
病毒是在宿主的运行环境下运行,所以无法像在自己本身的运行环境下一样访问自己的静态(全局)变量的数据和直接调用系统API。
(1)判断目标文件开始的两个字节是否为“MZ”;
(2)判断PE文件标记“PE”;
(3)判断感染标记,如果已被感染过则跳过这个文件,否则继续;
(4)获得Directory(数据目录)的个数,每个数据目录信息占8个字节;
(5)得到节表起始位置:Directory的地址+数据目录占用的字节数=节表起始位置;
(6)得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节):
节表起始位置+节的个数×(每个节表占用的字节数28H)=目前最后节表的末尾偏移
(7)开始写入新的节表项
①写入节名(8字节);
②写入节的实际字节数(4字节);
③写入新节在内存中的开始偏移地址(4字节),同时可以计算出病毒入口位置:
上节在内存中的开始偏移地址+(上节大小/节对齐+1)×节对齐
④写入新节(即病毒节)在文件中对齐后的大小;
⑤写入新节在文件中的开始位置:
上节在文件中的开始位置+上节对齐后的大小(8) 修改映像文件头中的节表数目
(9)修改AddressOfEntryPoint(即程序入口点指向病毒入口位置),同时保存旧的AddressOfEntryPoint,以便返回HOST继续执行。
(10)更新SizeOfImage(内存中整个PE映像尺寸=原SizeOfImage+病毒节经过内存节对齐后的大小);
(11)写入感染标记(可以放在PE头中);
(12)写入病毒代码到新节指向的文件偏移中。
病毒要用到变量,在病毒感染host程序后,由于它依附到host程序中的位置各不
相同,因此病毒随着host载入内存后,病毒中的各个变量在内存中的位置会随着host程序的位置而发生变
化,因此,病毒程序要能正常使用变量。必须采用重定位技术。
1.call指令跳转到下一条指令,使下一条指令感染后在内存中的实际地址进栈。
2.用pop EXX,[ESP]指令取出栈顶内容,得到感染后下一条指令内存中的实际地址Base。
3.varstart为感染前call指令的下一条指令地址,varlable为感染前变量地址,则感染后var实际地址为(Base-Offset varstart)(基
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-65351-1.html
主要是他是无害通过
坐等上映
纯网时代下的新生代经济——给新生代偶像搭建了一个全方位展示其商业价值的平台