所谓病毒,一般都是指可以执行的数据体,说白了就是那些exe,dll等程序文件,当然情况也许更复杂,程序这个概念是脱离与具体的文件形式的,他们只是一段数据而以,应该所谓的病毒可能包括与诸如txt文件中,但很少见(.txt就算包含病毒也是无法自我加载的)。
目前在win32环境下,常见的病毒是以exe;com;dll;scr等扩展名存在的。同时也能见到cmd;bat;vbs这类脚本性病毒(你可以了解些脚本script的知识)。
一般情况下,我们把.exe的文件叫做应用程序,这样说的原因一方面是因为他是可执行的,也就是无需借助其他程序而自我启动(严格的说都无法做到自我启动,这里就不涉及了)。对于病毒体,为了能在复制后马上感染侵占系统,它需要这方面的特征。
所以在下面的文章中,你会发现给出的病毒例子都是.exe文件
dll文件叫做“动态链接库”(dynamic link library),它的名字含义这里不再深究,不过你需要明白他是无法自我启动,也就是不可直接执行的。dll文件中同样也包含程序的代码,但他们是需要被其他可执行程序,如exe加载以后才能执行其中的代码部分的。

图:作为系统核心之一的user32.dll,正因为是dll文件,它能结合到每个程序进程,提供必要的系统支持
所以我们就知道,以dll格式存在的病毒无法直接运行,他们需要另一个如exe的程序事先加载后才能工作(有3种可供参考的方式,一是另一个exe程序也是病毒体,它直接加载dll文件作为自身一部分,第二种方式采用系统自带的rundll32.exe加载,第三种是比较讨厌的情况,dll文件开始又另一个exe文件主动加载后,利用被称为钩子hook技术将dll注入到其他的程序进程中。这用的病毒是最难清除的)。

图:在任务管理器中看到的rundll32.exe的进程实际起作用是加载了的dll文件
如果病毒主体以dll文件存在以后,他必须指明加载它的程序,这可能给其传播造成一定障碍,但有带来了很多优势。比如:
1.由于windows自带的进程管理器(WindowNT)只能以主进程文件为单位察看进程,可以认为是只能看到正在运行的exe文件,而一般看不到正在执行的dll文件(因为dll是exe加载的,它映射到了exe为进程的地址空间了)。所以一般在没有第3放工具的情况下,是无法通过任务管理器找到正在运行的dll文件病毒的。
2.无法直接将正在运行的dll文件病毒关闭,这样说是因为dll文件都映射到了加载它的exe文件中了,利用进程管理器只能将它属于的进程程序一起关闭。比如word因中毒而加载了virus.dll病毒的文件体,那么想从内存中清除病毒只能把word也关闭了
3.利用上面的特点,可以做到病毒体永远驻留内存而无法清除。其实方法很简单,利用钩子技术,将dll注入到系统所有的进程中,同时这些dll监控着每个进程是否被自己注入,如果没有则重新注入。这样除非关闭所有程序,否则永远无法关闭运行中的病毒。

图:采用PEid自带的任务察看器,可以发现实际上所有进程都加载了其他的dll文件。而且无法把其中莫一个dll关闭
当然还有更极端的情况,那就是利用驱动程序来编写病毒(几乎没有这种情况,所以你可以跳过)。
首先这里说一下x86保护模式的事情。你应该知道目前你正在运行windows的CPU工作在成为32位保护模式的环境下。你不用被这个神秘的名词吓倒,他其实就是一种等级管理机制:程序在运行时有ring0和ring3的2种权限,ring0程序拥有很高的权利,它能操作计算机所有的硬件设备,而ring3程序则十分可怜,他只能乖乖受ring0程序管理,同时基本上无法直接对硬件进行操作,而必须通过ring0的程序中转。
这就是windows中各类程序的现状:操作系统的内核、一些服务程序、驱动程序都是ring0级别的,他们能对你的电脑做任何能做的事情,而一般意义上的程序,如exe文件的程序都是ring3的。
这样做一方面是为了实现多任务环境,同时更重要的是能使系统运行的非常稳定:ring3程序无法直接控制硬件,必须通过ring0程序,这样如果有个设计有缺陷或者不怀好意的程序企图进行破坏性操作时,他就能被ring0程序截获并强行中止。
所以可以知道,如果病毒写成了一个驱动程序(ring0级别),那是很危险的,最好的例子就是CIH!
这类病毒的名字往往以wdm和drv为主(后者是win9x的标准,在最新的windows内核中以被淘汰)。不果他们和dll文件一样,无法自我加载。
上面以程序文件的角度分析了几类病毒格式的工作方式,当然大家不用被提到的极端例子吓怕了。下回将告诉你这些病毒是如何感染并永久的在系统中存活下去的
CSK版权所有,演讲ppt在ftp.csksoft.net中下载。
上面就是你进入网站的样子,因为主体界面还没完成,所以网站会利用ReformUI的承载功能加载原先的网站。
但我的中心不是这个,而是那个叫做RefromScript的窗口,因为它可以让你在其中编写代码并立刻执行。
所以下面对RefromScript作一些简要的说明:
首先它是JavaScript语言,说得更白一些,就是Flash中的ActionScript。而且可以说完全就是,因为大部分的AS代码他都是支持的。比如你可以试着输入this._visible=false;或者fscommand();这种函数,都可以的。而且直接效果就是网站发生了变化。
但除了这个以外,主要RefromScript提供了一套我自己编写的函数集,下面就叫API了。
比如你可以试着打入
上面的含义我想会C编程或者他的衍生语言的人都能看懂,所以不对机制解释了,RefromScript提供的API分为3种。其一是网站中常用的ReformUI的API。他们就像windows中那些CreateWindowEx,MessageBox一样控制着一切可编程图形对象的创建、修改和删除。像上例中的CreateWindow就是一个例子。
第二类是网站核心服务函数。比如你可以键入msgout(GetMajorFlaVer());
其中msgout();函数和Flash中的trace()最接近,他会把参数的文本显示在
RefromScript窗口的OutPut中。GetMajorFlaVer()函数的作用是返回当前播放器的版本信息。当然这类函数更多时不公开的,因为涉及网站的安全。
其中有一部分是涉及和ReformCore通讯的。比如生成一个RPC XML文报的函数是XML_CreateRPCRequest(),参数这里就不提供了。
第三类是外界加载的组件扩充的API。就像ActiveX对象一样,在下面的例子中我会具体说到。
下面就给一些好玩的例子吧。当然今后你可以用它来联系一些编程方面的事情,特别在一时搞不到编译器的情况下还是不错的。不过RefromScript有个局限:不支持函数体。
下面的代码演示了加载一个外部组件,并且调用加载后的扩充的API
在上述代码执行完毕后,将看到2个窗体,其中一个根据分析是外部组件调用了网站API生成的。接下来你可以清空脚本窗口,打入RemoteAPI();看看效果。
然后再清空脚本窗口,输入rwin.Destroy();表示销毁刚才的组件,并且销毁承载的窗口,然后再调用RemoteAPI();就会发现已经失效了。
而这个代码有一定实用价值,你可以作一些修改。让他变得更好:
我就不解释了,这是一个简易的函数图像绘制程序,以后我会专门写一个组件来完成这个工作
然后给个有趣的文本输出代码:
看看效果吧,不过要刷新页面才能恢复到以前状态。
好了,就说这么多了。如果想要更多函数可以问我要,而且等网站完工后会提供更多有趣的例子
好消息是,ReformUI部分我是打算今后开源的,呵呵,但就看最近有没有人抄袭的问题了
下载[url]ftp://FTP_visitor:visitor@ftp.csksoft.net/download/3ddemo/cns!bnry.rar[/url]
下载[url]ftp://FTP_visitor:visitor@ftp.csksoft.net/download/3ddemo/sts-04__instant_zen_by_synesthetics.rar[/url]