【实验名称】 PE病毒分析
【实验目的】
1.属性PE文件结构
2.熟悉PE编辑查看工具,详细了解PE文件格式
3.掌握文件型病毒的发现方法及PE病毒的染毒原理
【实验原理】
1.PE文件常用字段解释:
a)文件偏移地址(FileOffset):PE文件存储在磁盘上时,各数据相对文件初始地址的偏移量。即,UltraEdit打开文件所显示的地址。
.text段第一个数据的文件偏移地址是:0x400
b)虚拟地址(Virtual Address,VA):PE文件载入内存后,各数据的地址。
.text段第一个数据的VA是:0x0040 1000
c)基地址(ImageBase):载入内存的起始地址。PE文件可选头部中定义。
可执行文件的ImageBase:0x0040 0000
d)相对虚拟地址(Relative Virtual Address,RVA):虚拟地址相对于基地址的偏移量。
.text段第一个数据的RVA是:0x0000 1000
e)文件偏移地址和虚拟地址的转换。图2-1-3为例,计算.rdata段文件偏移地址FileOffset为0x630分别对应的虚拟地址。
FileOffset相对于.rdata段的偏移值为:30
.rdata段在内存中的起始地址为:0x00402000,故FileOffset对应的虚拟地址为:0x00402030
2.PE文件数据结构几个字段
a)OEP(Address of entry point):程序执行的第一行代码的内存地址。PE文件可选头部中定义。
一般文件的OEP为.text段的地址:0x00401000
b)ImageBase:程序载入内存的起始地址。PE文件可选头部中定义。
c)SizeofImage:程序载入内存占用内存的大小。PE文件可选头部中定义。
d)Section Header一些字段:以.data段为例
i.Virtual Size:.data段在内存中的大小
ii.Virtual Address:.data段虚拟地址,内存中的地址
iii.Size of Raw data:.data段在文件中的大小
iv.Point to Raw data:.data段文件中的偏移地址
【实验内容】
(1)完成实验步骤。
[1].Filemon等软件监控laborDayVirus病毒行为,观察文件、注册表、进程的变化
1)FileMon和RegMon的界面设置:
a)字体:Option-Font(选项-字体)
b)禁止自动滚动
c)监控前清空屏幕记录
2)FileMon和RegMon的过滤设置
a)“Filter”按钮可以设置并查看过滤项规则
b)新建过滤规则:
i.“排除:”选项后面添加不需要监控的进程: vmtoolsd.exe;ctfmon.exe;TPAutoconnect.exe;Lsass.exe;FileMon.exe;Regmon.exe;tcpview.exe;procexp.exe;System等。
ii.设置日志监控方式:选择“日志写入”“日志成功”
[2].【实验步骤】
一、病毒感染程序
(1)新建文件夹“text”,将无毒文件“hei0.txt”拷贝至“text”文件夹中。将病毒文件“LaborDayVirus.rar”解压后将“LaborDayVirus.exe”拷贝至“text”文件夹中。
(2)将系统时间调整为5月1日,双击“text”文件夹中“LaborDayVirus.exe”获得染毒文件hei0.exe。
(3)记录hei0.exe染毒前后的文件大小、程序的入口点(OEP),(可使用PEiD或PE explorer)。
感染病毒前:
大小:2.50KB EOP:00001000
感染病毒后:
大小:8.50KB EOP:00003200
二、为染毒程序脱壳
问题1:感染病毒的文件hei0.exe是否加壳?
*程序加壳的判断条件 1)程序入口点不在第一节(.text section),是程序是否加壳的条件之一。
2)PEiD,查看EP section,如果存在非标准的section 名,也是加壳的判断条件之一。
3)查看上图,第一个WBCPACK Section,内存大小V.size不为空,文件大小R.size为空,也是加壳的判断条件之一。
思考:为什么会弹出该窗口?
提示:用PE explorer 查看该文件,观察sizeofcode字段,sizeofImage字段,Address of entry point(OEP)字段的值
(2)找到OEP(0x00403200),留意OEP后面所有的跳转方向向上的jmp。
在0x00404818,按F2设置断点,随后按F9运行,程序在会断点0x00404818上中断,观察跳转对象EAX的值为( 00401000)。
问题2:为什么要跳转到EAX的值,EAX的含义?
EAX的含义是.text段的入口地址,即源程序的OEP。执行完病毒代码后,跳转到源程序的OEP,为了执行源程序。
(3)执行实验步骤一(2)
注:如何在被感染的程序中找到原程序的OEP。
OD打开染毒的hei0.exe,跳转方向向上的跨节长跳(.data section到.text section),可以考虑为——由病毒代码返回到原始程序的OEP。
三、病毒感染机制分析
(1)准备一个无毒的可执行程序“hei0.exe”和染毒的可执行程序“hei.exe”,复制到新的文件夹“text1”中。使用PE Explorer分别打开“hei0.exe”和“hei.exe”,对比两个文件的入口点和ImageBase,并记录如下。
OEP | ImageBase | |
---|---|---|
hei0.exe | 00401000 | 00400000h |
hei.exe | 00403200 | 00400000h |
(2)点击“View”菜单中的“Section Headers”,对比“hei0.exe”和“hei.exe”的section Header的数据,并记录如下:
.data的段头数据结构 | Visual size | Visual address | Size of raw data | point of raw data |
---|---|---|---|---|
hei0.exe的.data | 00000027h | 00403000h | 00000200h | 00000800h |
hei.exe的.data | 00001A00h | 00403000h | 00001A00h | 00000800h |
问题3:感染文件在磁盘存放时,病毒代码的相对地址,导入内存中,病毒代码的虚拟地址?
(1)UE文件的比较功能打开UltraEditor,选择“文件”菜单中的“比较文件”功能对“hei0.exe”和“hei.exe”进行二进制比对,可以发现“hei.exe”的0Xa00处开始的数据块为存储于与.data节的病毒代码。
注:该段数据在.data节是因为“hei0.exe”和“hei.exe”的.data节都开始于各自文件便宜的Point to Raw Data 处。这段数据是病毒代码是因为0xa00-0x800+0x403000=0x403200(感染病毒文件hei.exe OEP的虚地址(VA))。
(2)使用UltraEditor打开“hei.exe”定位光标到“hei.exe”的.data块的Point to Raw Data 处,并以16进制形式查找“hei0.exe”的入口点(注意字节顺序),将查找到的数据的文件偏移记录是 00002010h ,该偏移的保护模式内存虚拟地址是 00404810h 。
(3)定位“hei.exe”的jmp断点,在jmp指令上面会发现如下的汇编代码:
0x40481c在病毒代码之后,为被加载到内存的病毒数据的存储区,0x1000为“hei0.exe”OEP的RVA,0x1000在反汇编代码中的表示是0010.
(4)新建“text2”文件夹,将“LaborDayVirus.exe”病毒和“notepad.exe”“mspaint.exe”文件放在“text2”文件夹中。运行“LaborDayVirus.exe”感染“notepad.exe”“mspaint.exe”,将各个病毒文件最后一个跳转指令的目的地址记录到下表:
文件 | 源文件入口地址 | 感染病毒文件的入口地址 | 感染病毒文件的最后一个跳转目的地址 |
---|---|---|---|
Mspaint.exe | 01034CF5 | 01053800 | 01034CF5 |
Notepad.exe | 010073A5 | 01013000 | 010073A5 |
(5)通过以上的分析,就可以初步断定,该病毒的感染方式为:ii。
提示:病毒的感染方式有三种,分别为
i.添加一个新的段。
ii.将病毒代码附加在最后一个段上。
iii.将病毒代码写入到PE文件的各个段的未用空间。
(2)回答如下问题
a)感染病毒的文件hei0.exe是否加壳?
因为程序入口点不在第一节(.text section),所以文件加壳。
b)LaborDayVirus.exe运行后,内存地址0X00404818的代码为什么要跳转到EAX的值,EAX的含义?
EAX的含义是.text段的入口地址,即源程序的OEP。程序先执行完病毒代码后, 跳转至源程序的OEP,执行原来的正常代码。
c)感染文件在磁盘存放时,病毒代码的相对地址,导入内存中,病毒代码的虚拟地址?
在磁盘中,病毒代码的相对地址为0xa00,导入内存后,病毒代码的虚拟地址为0x403200。
d)LaborDayVirus.exe病毒的感染方式为
将病毒代码附加在最后一个段上。
(3)手工恢复染毒文件hei.exe:
a)以二进制形式打开hei.exe,需要修改PE文件“hei.exe”的哪些字段?
PE文件的头部中的入口地址,代码大小 .data 段
b)如何对这些字段进行修改?
1、修改代码入口地址
位于PE文件可选头部IMAGE_OPTIONAL_HEADER结构的AddressOfEntryPoint字段:将00003200改为00001000
2、 修改程序载入内存占用内存大小,位于PE文件可选头部 IMAGE_OPTIONAL_HEADER结构的SizeOfImage
字段:将00004A00改为00004000
3、 修改.data段的物理长度,位于各段头部IMAGE_ SECTION _HEADER结构,
.data的ASCII码是:2E64617461
将PhysicalAddress,即.text段的物理长度从00001A00改为00000027h
将VirtualAddress,即.data段映射到内存中的RVA 00001A00改为0x00000200
4、删除病毒代码: