如果我们的计算机不幸感染了恶意病毒,通常我们会使用反病毒软件拦截和查杀恶意病毒软件。反病毒软件防护病毒的方法我们在前文已经阐述过,此处不再赘述。接下来我们还是以Win32.Capric.exe的“X病毒”为例,首先使用手工的方法清理病毒,然后再写一个针对该病毒的专杀工具。
实验一百一十二:手工破解PE病毒
手工清除helloWorld_virus.exe感染的“X病毒”。由上一小节对病毒源代码的分析我们得知,如果需要彻底修复被感染的目标文件,我们需要将被病毒修改的部分逐一进行修复。
为了直观的获取helloWorld.exe被感染前后的变化,我们使用第十章中开发的工具PECompare.exe对比感染病毒后的两个目标文件,如下所示:
图16-27 比较感染病毒前后的目标文件
如果我们对照感染病毒前的目标文件,清理病毒将是一件非常容易的事情。现在让我们假设在没有目标原文件参照的情况下,如何修复。
●第一步:修复程序的入口地址。
思路:当我们运行被感染的目标文件时,会先弹出一个提示信息,然后再跳转到原程序的入口地址处执行。因此,我们可以在虚拟机安全环境下,使用OllyDbg调试器跟踪调试被感染的目标文件。
1.开始调试之前,需要先在helloWorld_virus.exe文件PE头的3BH地址处去掉病毒标记’X’,将58H改为00。
000000B0 50 45 00 00 4C 01 03 00 8C 10 A7 60 00 00 00 00 PE..L...?....
000000C0 00 00 00 00 E0 00 0F 01 0B 01 05 0C 00 02 00 00 ....?..........
000000D0 00 04 00 00 00 00 00 00 00 32 00 00 00 10 00 00 .........2......
000000E0 00 20 00 00 00 00 40 00 00 10 00 58 00 02 00 00 . ....@....X....
- 将helloWorld_virus.exe拖入调试器,按F8单步跟踪,直到弹出感染病毒提示信息,点击“确定”后,执行下一条语句后,EAX寄存器中的值00001000H就是原程序的入口地址。再下一条语句则是加程序加载基址,如图16-28所示。
图16-28 获取原程序的入口地址
●第二步:修复最后一个节区对齐后的大。
- 取PE头的3CH地址处FileAlignment字段(文件中的节的对齐粒度)的值为200H。
- 观察最后一个节区节表项:
000001F0 2E 64 61 74 61 00 00 00 .data...
00000200 00 0E 00 00 00 30 00 00 00 0E 00 00 00 08 00 00 .....0..........
00000210 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 E0 ............`..?
由上可知,最后一个节区在文件内的起始地址为00000800H,观察PE文件800H地址处存储的数据:
00000800 48 65 6C 6C 6F 57 6F 72 6C 64 50 45 00 00 00 00 HelloWorldPE....
00000810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000820 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
………
000009F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000A00 E8 00 00 00 00 5D 81 ED 05 10 40 00 0B ED 74 21 ?...].?.@..韙!
………
我们会发现A00H地址处之前存在大片的空白区域,有理由相信从A00H开始存储的是感染的恶意病毒代码。因此,我们可以将A00H地址后的所有数据全部删除。原节区文件中对齐后大小(SizeOfRawData)修改为200H。