1、感染任何一个病毒都需要有寄主,把病毒代码加入寄主程序中(伴侣病毒除外)
以下说明如何将病毒代码嵌入PE文件中,有关PE文件的结构请看以前的文章。PE文件的典型结构:MZHeaderDOSSTUBCODEPEHEADEROPTIONALHEADERSECTIONTABLESECTION1SECTION2...IMPORTTABLEEXPORTTABLE和DOS的可执行文件类似,PE的代码映象分为几个SECTION,在文件中会对齐页边界(4K)。一般来说,文件会加载在400000h开始的空间,而第一个SECTION在401000h处,同时入口地址也是401000h。
由高级语言编写的程序,每个SECTIO-N的长度不可能刚好是4K的倍数,因此在SECTION的末尾将会存在一段未用的空间,大小可由Section的PHYSICALSIZE-VIRTUALSIZE得到,在文件中起始位置可由PHYSICALOFFSET得到,这段空间可以用来存放病毒代码。此外一般来说,MZHeader+DOSSTUD+PEHEADER+OPTIONALHEADER+SECTIONTABLE不过1K左右,而SECTION1由4K开始,空出来的地方足够存放一个设计精良的病毒。CIH就是将代码存放在这些空闲空间里。
2、分配驻留所需内存
对于驻留形的病毒,分配驻留所需内存是必需的。在DOS下使用由于所有的应用程序都映射在相同的线性地址空间里,使用一般的内存分配调用就足够了。而在WIN32下,每个应用程序都有自己的线性地址空间,必须使用特殊的函数分配2GB以上的系统地址。典型的如:VXD服务_PageAllocate,和kernel32的VxDCALL_PageReserve。_PageAllocate请参看win98ddk中的说明,VxDCall_PageReserve请参看HPS源码中的注释。
3、截留FILEI/O操作驻留型的病毒通过截留FILEI/O来激活,可以通过使用VXD服务
IFSMgr_Install-FileSystemAPIHook(如CIH)或截留VxDCall中的DOSServicescallback(如HPS)。
在Win32下编写病毒不是一件困难的事。值得注意的有几件事:
一、Win32下的系统功能调用不是通过中断实现,而是由DLL中导出
(直接使用VxD服务除外)。直接在病毒中得到API入口不是一件容易的事,可以通过以下这个变通的方法。
在同一个版本的Windows下,同一个核心函数的入口总是固定的(指由Kernel32,gdi32,user32导出的函数)。因此可以用以下的方法得到函数入口:
在IntializeCode得到要用的函数入口并将它填入病毒中,在病毒运行时可以直接使用了。
本人的一台操作系统为Win2000Server的笔记本电脑最近被感染了病毒,我首先用相关杀毒软件来扫描计算机,扫描报告如下:
病毒名称:Hacktool
文件名:c:\winnt\system32\ntservice.exe
操作:删除失败,隔离失败,访问被拒绝
如何才能彻底删除呢?
因为c:\winnt\system32\ntservice.exe已经在运行了,直接删除显然是不可能的。于是我运行Windows任务管理器,在进程选项卡中选择结束ntservice.exe进程,结果系统显示“无法中止进程,拒绝访问”。
我突然想到在Win2000(XP)的控制台状态下是可以用DOS命令的。
什么是控制台
控制台是Windows的一种简易运行模式,它可以不启动图形界面而在命令行状态下有限制地访问FAT和NTFS分区,并对系统进行一些设置和操作。通过控制台,我们可以更换系统文件、关闭或者禁用某个系统服务、禁用或卸载硬件设备、修复引导扇区、新建分区以及格式化硬盘分区等。