控制面板是Windows的基本组件,控制面板中的各个选项实际上是以c p l为后缀名的文件单独存在的,根据操作系统的不同这些文件所在的位置也有所不同,Windows9x/Me下这些c p l文件位于Windows安装目录下的System子目录中,而WindowsNT/2000/XP下则位于Windows安装目录下的System32子目录中。这些c p l文件再加上Windows安装目录中的control.exe和control.ini文件,就是控制面板的全部组成部分。
每一个c p l文件都对应“控制面版”中的一个选项,例如desk.c p l对应“桌面属性”、inetc p l.c p l对应“Internet属性”等等。由于.c p l文件的特殊性,需要使用RunDll32.exe来启动该文件,换句话说,控制面板中的任何一个选项都可以通过RunDll32.exe调用。RunDll32.exe是Windows动态连接库(DLL)管理工具,可以用来在命令行下执行动态链接库中的某个函数或者功能模块(DLL是Windows系统的另外一种可执行文件,是Dynamic Link Library的缩写。DLL是Windows的基础,所有的API函数都是在DLL中实现的。它本身并没有程序逻辑,只是由多个功能函数构成,不能独立运行,必须由其它进程加载并调用)。另外Windows安装文件夹下还有一个RunDll.exe,也是动态连接库理工具。虽然不同版本的Windows都提供RunDll.exe和RunDll32.exe文件,但是在WindowsNT/2000/XP下却只支持32位的RunDll32.exe,只有Windows9x/Me这种16位和32位混合使用的操作系统才同时对二者提供支持。
下面我们看一个利用RunDll32.exe调用shell32.dll中的Control_RunDLL,来打开desk.c p l的第一个属性页的例子。点击“开始”菜单,选择“运行”,输入:RunDll32 shell32.dll,Control_RunDLL desk.c p l,,0(注意是两个逗号),回车后,将打开“显示 属性”对话框的“背景”窗口(图3)!这说明这些.c p l文件是可执行的。换个思路想一想,如果用户把一个可执行的类似动态连接库DLL的.c p l文件放入System子目录中,则在控制面板中可以看到其这个c p l文件的图标,并且是可以执行的!这里说的“类似动态连接库DLL的.c p l文件”是指这类c p l文件可以像DLL文件那样被其它进程加载并调用,就像我们刚刚看到的那里例子一样。
用RunDll32.exe调用控制面板程序的格式如下:在“开始”菜单的“运行”中或命令行下输入:RunDll32 shell32.dll,Control_RunDLL *.c p l,,X,其中shell32.dll为被调用的DLL文件,意思为调用shell32.dll中的Control_RunDLL来打开desk.c p l文件。而“*.c p l”为你想调用的c p l文件的路径和文件名。最后的“X”为对应c p l文件的页数:从0开始,0为第一页(如desk.c p l,,0代表“显示 属性”的“背景”),1为第二页(如desk.c p l,,1代表“显示 属性”的“屏幕保护程序”),依此类推。 要注意的是:shell32.dll和Control_RunDLL两者之间只能以“,”分隔,逗号之后不能有空格,如果这里出错的话,不会得到任何提示。
具体步骤就是在注册表启动项中加入RunDll32 shell32.dll,Control_RunDll myc p l.c p l。这样,这个myc p l.c p l就会随用户机器启动的时候被调用—就象DLL文件被执行一样!注意,myc p l.c p l如果保存在默认目录中,可以不加路径直接调用,否则就要加上路径。控制面板在执行的时候会加载System子目录中的所有*.c p l文件,所以只要把这个c p l木马放在System(Win9x)或System32(Win2K/XP)子目录中就可以达到目的。要提醒大家的是,如果myc p l.c p l真是木马的话,那么别人一定会给它改个名字,或替换掉系统中那些不常用的c p l文件,使你疏于察觉。
是不是只有把c p l文件放到System或System32子目录下才会被加载呢?不是的!如果你的控制面版程序不在Windows目录,假设在D:\ok下,而你想让它在控制面版里显示。你只要编辑control.ini文件,在[MMc p l]小节里面加入:myc p l.c p l=D:\ok\myc p l.c p l就可以了。如果不想让c p l文件显示在控制面板中该怎么办呢?依然从control.ini文件入手!打开该文件,在[don't load]小节中加入:myc p l.c p l=no,那么这个myc p l.c p l文件就不被加载了。
如果有人利用这种方式进行攻击,防范方法是经常检查注册表的启动项,发现用RunDll32.exe调用.c p l文件的就杀无赦,斩立决!将这个注册表键值立刻删除,然后按键值提供的路径找到这个c p l文件把它删除。