亲密接触恶意代码之文件感染和内存驻留--9
内存驻留感染技术
如果读者曾经使用过MS-DOS的话,对驻留内存、截获中断以执行特定操作的程序(TSR)一定不会陌生。在MS-DOS时代,不仅正常的应用程序大量使用TSR技术,病毒同样也利用TSR 技术驻留内存,监视文件读写操作并伺机进行感染。
在Windows NT下,各个进程的地址空间被隔离了,不同进程之间不能自由地相互访问内存,而且对于用户态代码有了访问限制:ring3程序代码只能读写其进程空间中应用专属的部分(在进程空间为4GB 的情况下,通常是低2GB),对系统内核部分占用的空间是没有读写权限的。这使得内存驻留感染变得困难,不过类似的想法和技术仍然是可能实现的,需要做的不过是一点变通:既然每个进程有其专属的进程空间,尽管不能做到永久驻留,但病毒代码至少在进程的生命期内仍然是可以驻留的;既然Windows下仍然有作用和DOS下中断相同的API,那么病毒自然可以截获API,从而监视文件读写,伺机进行感染。
截获API 的技术通常被称为Hook 技术,实现起来也比较简单:修改API 的入口点代码,将其修改为指向病毒代码的跳转指令,在病毒代码开始处保存传递给API的参数,待病毒代码执行完毕后再恢复API 的入口代码和保存的参数,重新跳转到API 的入口使得程序继续执行。HOOK API还有其它的几种变形,比如修改Import 表的API地址指针;修改调用API点的CALL指令;或者是为了防止API Hook检查修改API 函数的尾部或中间部分的某条指令而获取控制权,思路都是类似的。
既然前面介绍了全盘搜索感染技术,那么为什么病毒还大量使用内存驻留感染技术呢?
让我们回头思考一下,随着存储媒质价格的降低,用户配备的可存储媒质的容量也越来越大,但是磁盘读写速度并没有大幅提高,普通的全磁盘搜索是很耗时的。试想一下用户在双击了某个程序后,10分钟之后才出现界面的情况,即使是初次使用计算机的用户也会暗生疑窦,这对于病毒的隐藏和传播是极端不利的。因此那些流行的病毒并不在获得控制权后直接进行全盘搜索感染,而是采用了如下的变通:
A) 仅搜索当前目录并对其中的PE 文件进行感染,然后迅速将控制权交给宿主程序。
B) 创建单独执行的线程后,马上把控制权交给宿主程序。在用户进行操作的同时进行当前目录或全盘的搜索感染。
C) 采用Hook 技术监视文件或目录相关的API操作,对用户操作的文件或其所在的目录下的可执行文件进行感染。
搜索当前目录的技术已经在前面进行了讨论。下面主要讨论B和C中涉及到线程技术和内存驻留Hook感染技术。
1.创建独立的线程
如果读者熟悉Win32 API 程序设计,对CreateThread这个API一定不会陌生。每个线程都是一个独立的执行单元,也是Windows内核进行调度以及时间片分配的最基本的单位,同一进程内所有线程共享同一地址空间内的资源。病毒可将真正的功能部分放到该线程部分去执行。病毒代码可以在宿主程序运行的同时得以执行,普通用户通常难以察觉。
2.内存驻留Hook感染技术
上面提到的线程模型还是有缺陷的,试想一下,如果宿主程序一执行马上就退出了怎么办呢?病毒的感染线程可能还没有开始运行呢。值得注意的是:Win32线程模型中如果一个线程执行了ExitProcess调用,其它正在运行的线程不会自动得到通知。病毒代码可能还尚未执行完成就退出了,试想一下感染线程在感染某个PE文件时写入自身代码时只写入了一半的情况。尽管类似的情况在现实中极少发生,但要想提高病毒的传染能力和隐蔽性这却又是必须要考虑的问题。
此外,用单独线程进行全盘搜索和感染,仍然会造成计算机CPU 资源被大量占用,用户可能会注意到程序运行缓慢、硬盘指示灯狂闪等现象。当然,可以采用感染少量文件后休眠一会继续感染或者仅在计算机空闲时进行感染来解决。
让我们换个角度重新思考一下:真的有必要搜索全盘然后感染所有的PE 文件吗?或者,全盘搜索感染模型效率高吗?事实上,用户计算机硬盘上的PE 文件有很大一部分是很少有机会执行的,除系统程序外,经常运行的程序只有很少的几个:可能是几个游戏程序,也可能是用户的业务程序。如果占用资源去感染那些很少有机会被执行的PE 文件,除演示病毒的感染性的概念之外意义是不大的。相反,如果优先感染那些用户经常执行的程序,即使每次只感染少量的文件,病毒的传播速度也会得到大幅提升。鉴于此,现代病毒作者经常使用一条简单的启发式规则:优先感染那些经常被用户或用户程序访问的PE 文件或经常访问的文件夹下的PE 文件。这样病毒就从被感染文件开始,逐渐扩散感染与该程序相关或在逻辑位置(目录层次)比较接近的PE文件,最后直至整个磁盘上的文件都被感染。
无论是想要在进程结束时得到通知,还是实现上述的文件感染模型都可借助于Hook 技术来解决。通过Hook 文件或目录操作相关的API,病毒就能获取正在操作的PE文件路径或目录,从而对正在操作的PE文件或正在操作的目录下的PE文件进行感染。有关文件或目录操作的相关API包括:
CopyFile CopyFileEx CreateFile FindFirstFile FindFirstFileEx
FindNextFile GetCurrentDirectory SetCurrentDirectory GetFileAttributes
SetFileAttributes GetFileSize GetFileType GetFullPathName LockFile
LockFileEx MoveFile MoveFileEx SearchPath UnlockFile UnlockFileEx
如果想在进程或线程结束时获得通知或进行感染操作可Hook 如下API:
ExitProcess TerminateProcess ExitThread TerminateThread
如果不考虑9X 系统,Hook API 还可以考虑Hook Native API。Windows 系统内核代码运行在CPU 保护模式下的ring0特权级,普通应用程序运行在ring3特权级,普通应用程序执行IO 操作、访问内存资源等都受到严格的限制,加上Windows NT系统严格的用户权限审查机制,不同用户对资源的访问权限不同,使得病毒在运行时要考虑的因素越来越多。但反观ring0 特权级的程序,执行时没有任何限制,因此ring0 病毒对病毒编写者有着独特的吸引力。Windows 9X 下普通的Ring3应用程序切入ring0 模式非常容易,但在Windows NT系统下则困难得多,但也不是不可能的:最通用的方法就是采用内核模式驱动的加载机制将病毒自身代码写入驱动文件然后加载;另外的一些技巧还包括感染
Windows 内核驱动文件或修改NTLDR 的IDT、GDT表项的访问限制位使得在ring3 可以访问从而使得病毒代码切入ring0;除此之外还可以利用/Device/PhysicalMemory对象的漏洞切入ring0。
最成功的ring0 病毒就是大名鼎鼎的CIH,不过该病毒只能运行在Win9X 系统下。但在Windows NT系统下,尽管仍然可能切入ring0,但很少有大规模流行的ring0 病毒,这是由于NT系统内核处理流程非常复杂,编写一个在各个版本的NT系统上都能稳定运行的ring0病毒难度不小,需要更加高超的编程技巧并经过大量的测试。因此ring0病毒数量较少,鉴于此本文将不再作深入介绍。
病毒抗分析技术
当今反病毒已经成为一个产业,病毒在被发现之后,为数众多的杀毒厂商会迅速分析该病毒并升级其病毒库或推出专杀工具,颇有“老鼠过街,人人喊打”之势。但这一切都是建立在对病毒代码和病毒行为分析的基础上的。
从病毒的角度来讲,对抗病毒分析和动态静态查杀还是有意义的,尽管再狡猾的狐狸也难逃有经验猎手的追捕,但抗分析和查杀技术至少可以在一定程度上延缓反病毒厂商推出杀毒方案的时间,从而延长病毒的生命周期、扩大传播范围。
本文来自CSDN博客http://blog.csdn.net/p123456789p/archive/2009/03/20/4006883.aspx