信息来源:Vancheer
一,何谓多进程技术?
其实很简单,就是同时应用多个进程来达到目的的技术。多线程是大家都很熟悉的,而且也被当前蠕虫视为标准。多线程的好处就是很多操作(比如搜索文件,网络传输)都可以同步进行,一点不耽误事。多进程呢,就是以多个进程代替多线程来达到同步运行。
多线程的线程都是病毒自己创建的,多进程则不需要。为病毒服务的进程,都应该是病毒在内存里感染出来的。
这里说的多进程不是指两个进程,也不是三个,而是可能被感染的所有进程。就是说要感染系统内所有的进程。
二,为何多进程?
如今的病毒,已多向纯蠕虫靠拢,上来就在某个地方drop一个病毒文件,然后让系统自动运行它,作为一个独立进程存在。
这样很容易被用户察觉和消灭(结束那个进程就行了)。关于这种发展,我不想多说,有空我会写个独立文章,没空就不写了。
多进程的目的就是不drop任何病毒文件,只感染内存和已有文件,不存在独立的病毒进程。
这样的好处很多,后面会说。
注意,这里说的病毒进程,是指被病毒感染的进程,而不是独立的病毒进程。病毒最好不要独立存在。
三,如何感染?
感染进程的方法有很多,而且已经很成熟,大抵常用的有以下几种,分两步,插入代码和获得执行。
A,病毒代码插入进程空间的方法
1),VirtualAllocEx。缺点是Win2000以上才支持。
2),利用PE节间缝隙插入一小段代码,由这段代码装入病毒体。比较通用,但通常插入代码较大,可能会因为空间不够失败。而且通常需要在硬盘上有一个独立的病毒文件。
3),User DLL。在Win2000以上可以在注册表某个键(我懒,就不查是哪个键了)下面注册一个DLL,这样当任何进程Load user32.dll时就会Load你的DLL。这种方法也不通用,而且需要在硬盘上有一个独立的病毒DLL。
4),进程间内存映射,然后也利用PE缝隙插入一小段代码来映射这段代码。比较通用,而且插入代码比2少。
B,病毒获得执行的方法。
1), CreateRemoteThread。通常和VirtualAllocEx配合。这是最容易的了,但缺点是只有Win2000以上才能用,Win98不行。
2), Debug API。就是调试要感染的进程,然后利用调试的方法插入代码,并获得执行。这个方法有一个致命的缺点,就是不能解除调试关系,一旦病毒进程结束,病毒调试过的进程都要被结束。WinXP有结束调试的函数,但98和2000没有。
3), 插入一小段代码,Hook目标进程的某个API,一旦它调用该API,你的代码就获得执行了。这个方法可以用于“利用PE节间缝隙插入一小段代码”和“进程间内存映射”。
4), 我以前粗略想过,但不全,也不知是否能实现。就是Suspend目标进程所有线程,然后在某个当前EIP处插入自己的代码,当然要先保存原代码。但怎样从病毒代码转到原代码执行,我还没想好,应该可以实现,但比较复杂,没3好。
我罗列这些方法,肯定不全,也不详细。本文重在思路,不在技术。上面说的方法,相信大部分在病毒方面有些许研究的兄弟都会了解,所以就不多说了,不了解的兄弟,也可以从网上获得足够的资料。如果你有好方法,那么不妨共享一下。
四,如何多进程?
想想多线程都干了什么?搜索文件感染之,搜索email地址发送之,搜索漏洞机器强奸之(“强奸”二字足以表达我对漏洞蠕虫的态度),遍历LAN传播之,查找敌人(杀毒软件)结束之。
这些操作都挺费时间,所以启动多个线程并发运行,以达到最高效率。
多进程其实干的也是这些,把原来由一个线程做的事情由一个被感染的进程来做。
由于是多进程,同步就显得尤为重要,同步不善,就会让一个个进程崩溃,进而用户觉察到你的病毒的存在。
下面就说说多个病毒进程的同步。
同步算法大抵有两种,一种是社会主义式,一种是资本主义式。
1), 社会主义式。就是由一个病毒进程作为中央,任何其它病毒进程都要以它为核心,做什么都要由它分配和调度。由于中央进程也是普通进程(比如一个UltraEdit,只是被病毒感染了),所以很可能被用户正常退出结束了。一旦中央因用户操作而结束,那么其它病毒进程中的一个立刻成为中央进程。也就是说,不仅中央进程要监控普通进程,普通进程也要关注中央进程的安全。
2), 资本主义式。就是说所有病毒进程都是平等的,各进程做什么完全是由一种算法公平分配的。比如在病毒进入一个干净的系统内,首要任务也许应该是感染本地文件(便于扎根),那么它感染的第一个进程的任务应该是感染文件,此进程感染的其它文件才应该是网络方面的东西。一旦做某事情的进程结束,其它进程要接手继续做下去。我个人倾向于这种方法。一个普通用户的系统内能被感染的进程可能有十几个几十个,病毒要做的事情只有那么几种,所以可以多个进程共同做一件事情。
上面说的太简单了,其实病毒进程的同步,是一个很具挑战也很有趣的算法问题。有兴趣的兄弟可以多想想,互斥,事件,内存映射,在多进程里都很重要。
五,多进程的好处。
多进程好处多多,否则我也不会说这么多废话了。
1,感染迅速。众人拾柴火焰高。多个进程来感染文件,网络传播,效率肯定不错。
2,隐蔽性强。由于不存在独立的病毒进程,用户不容易察觉。如果有独立病毒进程存在,用户会因为CPU的占用和硬盘读写而怀疑。现在分散到普通进程里,所有进程都在占用CPU,都在读写硬盘,用户戒心会小些。而且在感染进程时如果Hook一些文件方面的API(就是那些能让硬盘转动的API),那么通过这些API来感染本地文件,更不会引起用户怀疑。个人认为这比Hook系统的File System之类的核心调用好,越核心的东西,越不容易通用。通用才好流行。
3,克制杀毒软件。如果算法得当,可以在某个新进程刚启动的瞬间就感染之。试想想。你把专杀工具感染了,那么专杀工具怎么彻底杀死你的毒?我很高兴看到Symantec针对某些毒说杀过一遍,不一定能杀干净,请重启动,再杀,直到杀干净为止。
4,容易Hook文件API。2已经说了,很有好处。
5,互相监视,不容易被杀死。只要系统内有用户进程,那么系统内就有病毒进程,多Cool。
6,把独立归为统一。假使你的毒感染了所有文件,那么用户系统内运行的十个程序都是你的毒。如果这些毒老死不相往来,各干各的,那么肯定会占用很多CPU资源,而且硬盘也会狂转不已。如果采用多进程思想,那么各进程之间可以进行协调,会尽量少占用用户资源。为用户着想,就是为你的毒着想。
结语,
我这文章写的太粗糙了。我本来已不打算也没时间写什么文章了,但前两天突然想到多进程这东西虽然简单,但实在应该多总结总结。
多进程这东西,别看简单,如果应用得好,效果肯定是非常好的。我不再写毒了,如果写,肯定要以多进程为标准。
说到标准,我突然想到目前蠕虫的"标准":多线程,伪造发信人,反反病毒。那么我们有没有人再加入一个“多进程”的标准呢?建立标准比玩技术更Cool一些。不过这种标准的建立,不是你我说说就算,而是要有剧毒为榜样才行的。
我最后还是要罗嗦一句,多进程虽然非常简单,但里面值得思考的东西很多,尤其是算法,有兴趣的兄弟可以多想想。我自己是没时间没精力没心情做这些。以前写的Semi-Meta技术,同样有趣,但我自己还是没时间没精力没心情实现。
我这文章实在太简陋,一点细节都没提。其实要实现多进程,细节还是很多的,但我不想写太多,还是要靠大家发掘。