病毒基本概念
计算机病毒的定义:
计算机病毒是计算机程序中被嵌入的一组破坏计算机功能或毁坏数据的计算机指令或者程序代码。
病毒对抗技术:
特征码扫描,启发式扫描,虚拟机技术,主动防御技术,自免疫技术
病毒生命周期:
开发期→传染期→潜伏期→发作期→发现期→消化期→消亡期
计算机病毒的分类:
按照计算机病毒的破坏情况分类
良性病毒:是不包含对计算机系统产生直接破坏作用的代码的计算机病毒。
恶性病毒:指在代码中包含有破坏计算机系统操作代码的计算机病毒。
按传播媒介来分类
单机病毒:单机病毒的载体是磁盘或光盘。常见的是通过从软盘传入硬盘,感染系统后,再传染其它软盘。软盘又感染其它系统。
网络病毒:网络为病毒提供了最好的传播途径,它的破坏力是前所未有的。网络病毒利用计算机网络的协议或命令以及Email等进行传播,常见的是通过QQ、BBS、Email、FTP、Web等传播。
按寄生方式和传染途径分类:
引导型
文件型
混合型
病毒生命周期:
传染阶段:
潜伏阶段:
触发阶段:
发作阶段:表现/破坏
病毒命名:
<病毒前缀(病毒种类)>.<病毒名>.<病毒后缀(变种特征)>
引导区病毒
DPT主分区表
CHS寻址
将硬盘划分为磁头(Heads)、柱面 (Cylinder)、扇区 (Sector)
开机检查:
- 检查引导区标志,一切正常则跳转到7C00
- MOV DI,7DFE
- CMP WORD PTR [DI],AA55
- JNZ DISPLAY_MSG
JMP 0000:7C00
系统引导过程:
(1)BIOS加电自检(POST),此时电源稳定后,CPU从内存地址FFFF:0000处开始执行。
(2)将硬盘第一个扇区读入内存地址0000:7C00处。
(3)检查0000:7dfe是否等于0xaa55,若不等于则转去尝试其他启动介质。
(4)跳转到0000:7C00处执行MBR中的程序。
(5)MBR首先将自身重定位到0000:0600处,然后继续执行。
(6)在主分区表中搜索标志为活动的分区。
(7)将活动分区的第一个扇区读入内存地址0000:7C00处。
(8)跳转到0000:7C00处继续执行特定的系统启动程序。
定位到0000:7C00
- CLI
- XOR AX,AX
- MOV SS,AX
- MOV SP,7C00
- MOV SI,SP
- PUSH AX
- POP ES
- PUSH AX
- POP DS
- STI
把MBR重定位到0600
- MOV DI,0600
- MOV CX,0100
- REPNZ
- MOVSW
在新位置继续执行MBR,查找活动分区
- JMP 0000:061D
- MOV SI,07BE
- MOV BL,04
- SEARCH_LOOP1:CMP BYTE PTR [SI],80
- JZ FOUND_ACTIVE
- CMP BYTE PTR [SI],00
- JNZ NOT_ACTIVE
继续查找,直到找到活动分区
- ADD SI,10
- DEC BL
- JNZ SEARCH_LOOP1
- FOUND_ACTIVE: MOV DX, [SI]
- MOV CX,[SI+02]
MOV BP,SI
将活动分区第一个扇区读入内存地址0000:7C00
- MOV BX,7C00
- MOV AX,0201
- INT 13
引导型病毒工作原理:
引导型病毒占据主引导扇区或引导扇区的全部或一部分,将分区表信息或引导记录移到磁盘的其他位置,并在文件分配表(FAT)中将这些信息标明为坏簇。病毒在计算机引导时首先获取系统控制权,将病毒的主要部分调入内存并驻留在内存高端,修改常规内存容量大小字单元[0:413H],将常规内存容量虚假减少,防止以后系统内存调度时覆盖占用内存高端的病毒体。同时修改某些常用中断的中断向量,使之指向内存高端的病毒程序。最后一条跳转指令转向主引导记录或引导记录的位置,将控制权交回系统以完成正常的系统启动工作。以后只要调用这些中断,就会先执行常驻内存高端的病毒体,病毒搜索并感染其他可能有的磁盘,或执行病毒体的表现部分,破坏计算机系统的正常工作。若不满足激发条件,病毒也可以继续潜伏,将系统控制权交回系统。
引导型病毒是在操作系统引导前就已驻留内存高端。由于主引导记录和引导记录在系统启动结束后不再执行,因此引导型病毒必须修改中断向量,指向自己,才有被激活已完成感染,潜伏、破坏等功能的机会。大多数引导型病毒会修改1NT 13H中断,当用户读写磁盘,
如执行DIR、EDIT、Windows中列文件目录等命令时,就会执行1NT 13H,激活病毒体。
引导型病毒的主要特点为:
⑴引导型病毒是在安装操作系统之前进入内存,寄生对象又相对固定,因此该类型病毒基本上不得不采用减少操作系统所掌管的内存容量方法来驻留内存高端.而正常的系统引导过程一般是不减少系统内存的.
⑵引导型病毒需要把病毒传染给软盘,一般是通过修改INT 13H的中断向量,而新INT 13H中断向量段址必定指向内存高端的病毒程序.
⑶引导型病毒感染硬盘时,必定驻留硬盘的主引导扇区或引导扇区,并且只驻留一次,因此引导型病毒一般都是在软盘启动过程中把病毒传染给硬盘的.而正常的引导过程一般是不对硬盘主引导区或引导区进行写盘操作的.
⑷引导型病毒的寄生对象相对固定,把当前的系统主引导扇区和引导扇区与干净的主引导扇区和引导扇区进行比较,如果内容不一致,可认定系统引导区异常.
PE文件型病毒
文件格式:
可选映象头:
AddressOfEntryPoint:开始执行的位置
ImageBase:默认地址
DataDirectory[]:数据目录
RVA:Relative Virtual Address,表示相对虚拟地址。它是相对内存中ImageBase的偏移位置。
VA:Virtual Address,表示虚拟地址,即装载到内存中之后的位置。(VA=ImageBase+RVA)
装载器如何把一个节映射到内存中?
- 获取文件节的数目(NumberOfSections)
- 定位节表(SizeOfHeaders)
- 获得该节在磁盘上的存储位置及大小(PointerToRawData,SizeOfRawData)
- 把该节映射进内存(VirtualAddress,ImageBase)
- 设置该节的属性(Characteristics)
节表:
代码节 .text或CODE
已初始化的数据节 .data或DATA
未初始化的数据节 .bbs
引入函数节 .rdata
引出函数节 .edata
资源节
如何判断一个文件是否为PE文件?
- 检验文件头部第一个字的值是否等于MZ,如果是,则DOS头有效。
- 用DOS头的字段e_lfanew来定位PE头。
- 比较PE透的第一个双字的值是否等于45500000H(PE\0\0)。
节表的结构数组:
VritualAddress:相对虚拟地址
SizeOfRawData:对齐后的尺寸
20000000H:可执行
40000000H:可读
80000000H:可写
引出节:
AddressOfFunction:指向函数地址的指针
AddressOfName:函数名的指针
AddressOfNameOrdinals:输出序列号
NUmberOfFunction:addressOfFuntion数组的项数
NumberOfName:AddressOfName数组的项数
病毒获取API函数地址
静态方式:调用时,根据函数名查引入表,就可以获取该函数的地址。
动态方式:使用函数LoadLibrary装载需要调用的函数所在的dll文件,获取模块句柄。然后调用GetProcAddress获取需要调用的函数地址。这种方式是在需要调用函数时才将函数所在的模块调入到内存中,同时也不需要编译器为函数在引入表中建立相应的项。
两个有用的API,这两函数是系统模块kernel32.dll提供的:
LoadLibrary加载一个DLL,返回DLL地址
GetProcAddress通过DLL地址和API函数名获得API函数的地址
得到模块kernel32的地址方法1:
由于程序入口点是被kernel32某个函数调用的,所以这个调用函数肯定在kernel32的地址空间上。
那么我们只要取得这个返回地址,就得到了一个kernel32空间中的一个地址。
通过这个地址,我们可以从高地址向低地址方向进行搜索,通过PE标志的判断,
搜索到kernel32模块的基地址!
汇编实现:
病毒对PE文件的修改方式
- 添加节
- 扩展节
- 插入节
增加新一节步骤
先把病毒代码追加到文件尾部。
- 在节表中增加一个section header各项数据填写正确(VirtualSize,VirtualAddress,PointerToRawData…..)。
- 在FILEHEADER中修改节表项数目: +1。
- 重新计算SizeofHeaders,并替换原值。
- 重新计算SizeofImage,并替换原值。
- 记录未感染时的AOEP(入口地址),因为在病毒代码结束时要让宿主程序正常执行。所以要先记录AOEP,在病毒程序结束后JMP跳到宿主程序的AOEP。
- 修改OptionalHEADER中的AddressOfEntryPoint,让它指向新加节的入口代码
加长最后一节修改PE
先把病毒代码追加到最后一个节的尾部。
修改节表中最后一项section header并增加 SizeOfRawData 的大小和内存布局大小
插入节方式修改PE
这种方式不增加节的个数和文件长度,病毒搜寻到一个可执行文件后,分析每个节,查询节的空白空间是否可以容纳病毒代码,若可以,则感染之。CIH病毒就是采用这种方法感染可执行文件的。
SizeOfRawData - VirtualSize
病毒感染PE文件的基本方法
感染文件的基本步骤(添加节)
(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)写入病毒代码到新节指向的文件偏移中。
蠕虫病毒
蠕虫的原始定义
最早的蠕虫病毒最基本特征:“可以从一台计算机移动到另一台计算机”和“可以自我复制”。
蠕虫技术角度的定义:“计算机蠕虫可以独立运行,并能把自身的一个包含所有功能的版本传播到另外的计算机上”。
蠕虫与病毒之间的区别及联系
ShellCode:
是指能完成特殊任务的自包含的二进制代码,根据不同的任务可能是发出一条系统调用或建立一个高权限的Shell, Shellcode因此得名。最终目的:获取目标机器的控制权。
ShellCode特点:
Shellcode一般是作为数据形式发送给服务器,制造溢出得以执行代码并获取控制权的
长度受限
不能使用特殊字符,例如\x00、\xff等
具有重定位能力
一定的兼容性
缓冲区溢出的避免:
不要用%n formatter
不要把用户的输入作为参数传到格式化字符串处理函数中,例如,printf("%s", argv[1])。
字符串处理避免使用strcpy,strcat,sprintf,gets。应该使用strncpy,strncat,snprintf。strlcpy和strlcat都是NULL结尾。尽量使用std::string,MFC::CString
使用C++ I/O函数
使用安全的C Runtime Time函数*_s function,关于安全函数请看https://msdn.microsoft.com/library/wd3wzwts.aspx
检查文件路径的长度,不要超过系统允许的最大值。
木马
木马定义:
木马主要是根据其意图来定义的,
木马的意图通常是窃取信息、实施远程监控等
木马与病毒区别:
木马一般不进行感染和传播自身,但也可能具、有寄生性,比如一些捆绑在合法程序中得到安装、启动木马的权限(文件捆绑器、dll劫持)。
木马结构:
木马软件一般由木马配置程序、控制端程序和被控端程序三部分组成
木马常用的传播方式:
以邮件附件的形式传播
通过MSN、QQ等聊天工具软件传播
通过共享软件网站(Web/FTP/BBS)传播
木马程序一般非常小,只有是几K到几十K,如果把木马捆绑到其它正常文 件上,用户是很难发现的,所以,有一些网站被人利用,提供的下载软件往 往捆绑了木马文件,在用户执行这些下载的文件的同时,也运行了木马
通过一般的病毒和蠕虫传播
通过磁盘和光盘进行传播
自启动:
利用注册表自启动
利用注册表启动项启动
利用注册文件关联启动
利用映象挟持启动
与其他文件捆绑启动
利用特定系统文件和其他方式启动
隐藏技术:
运行形式的隐藏
通信形式的隐藏
端口寄生
潜伏技术
Rootkit端口隐藏
木马链接方式:
获取本地连接
建立通信连接
TCP正向
TCP逆向连接(防火墙)
UDP通信
ICMP通信
HTTP隧道(数据封装进HTTP包中)
木马的结构:
与其他病毒的区别:
病毒会传染,而木马不会传染;
病毒入侵电脑后会有感觉,而木马不会,主要原因是便其开展后续“工作”;
病毒主要是以“破坏”著称,而木马主要是用来盗取用户信息。