从最初的第三方EXE加载DLL启动方式开始,到随后的使用rundll32.exe加载运行,再到利用NT服务的宿主程序svchost.exe实现启动,直到使用“ShellExecuteHook”(执行挂钩)技术,如今许多木马和恶意程序都在用户层使用ShellExecuteHook作为启动方式,实现随系统启动。其实ShellExecuteHook是一种正常的系统功能,中文含义是执行挂钩,其本身是操作系统的一个正常的功能,它采用挂钩系统的Explorer的ShellExecute函数,操作系统厂商开发它的初衷十分简单:为程序提供一个额外的通知功能,以实现系统中任何程序启动时都提前让使用了“执行挂钩”的程序收到新程序的启动通知,简单的说,这是操作系统在出于某种程序交互需求的考虑下所衍生的技术,它的作用就是让一部分程序能够在其他程序开始运行之前就得知有新程序即将运行的通知,以及这个程序的映像文件名称等信息,用于接收通知的程序必须遵循COM对象编程标准编写。
这个技术是通过外壳程序Explorer.exe实现的,它的加载项被指定在系统注册表“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks”内,用户浏览这里会发现里面并不是熟悉的路径和文件名,而是一堆奇怪组合的数字和字符串,这些字符串被称为“Class ID”(类唯一标识符,CLSID),每一个DLL模块都拥有属于它自己的唯一CLSID,操作系统自身是通过CLSID获得这个DLL的详细文件位置并加载它的。在执行挂钩技术里,这个注册表键里的数据就代表了申请接受通知的DLL模块的CLSID,当一个新程序执行时,系统会将这个消息通过注册表的执行挂钩入口派发出去,而后系统会载入这些符合COM对象标准的DLL文件以执行它预先定义的线程代码对消息进行处理,换句话说,也就是系统自己启动了声明为“执行挂钩”对象的DLL模块,它们的初次加载程序是外壳Explorer.exe。DLL启动宿主是系统外壳自身,而且还拥有一个任何第三方EXE宿主都无法具备的功能:确保DLL在每一个进程启动时自动加载运行。这个技术最早被杀毒软件用于实现提前检测功能,然而现在它却被恶意软件、木马后门等程序编写者大量的用在了不法行为之上。
由于这个技术的执行逻辑使得木马主体DLL可以在每一个程序运行时也随着它执行并随之进入它的内存空间,成为其模块之一,也就是说,这个技术使得做了保护措施的DLL木马变得难以彻底查杀,而且它不会产生任何敏感位置的启动项,也不需要指明一个加载器——它的加载器就是Explorer.exe自身。
使用这个技术的木马如何查杀?它也是有弱点的:由于这是Explorer实现的功能,它就必须依靠Explorer的存在而产生通知行为,一旦Explorer被终止执行,这类木马也就没有了加载器。大部分手工查杀木马的用户都发现使用这个技术的木马无法彻底删除,其实这与他们的使用习惯有关,大部分用户都是在需要用到什么工具的时候才会去运行它,那么回到开头对这个技术的解释来重新理解一下,你就会明白,这是因为你在其后运行其他工具的时候,执行挂钩又将木马DLL启动了一次,并可能产生了另一个随机字符串组合的DLL文件名来添加新的加载项,如此恶意循环,最终便无法彻底查杀。正确的做法是,在运行了一堆自己预料到会用上的功能以后,将Explorer.exe终止,避免执行挂钩再次被调用,随后使用工具争取一次就能把位于注册表入口ShellExecuteHooks 内的DLL注册信息和文件本体共同删除,这样一来即可将木马逐出机器。
以上有关ShellExecuteHooks的说明部分,来源于《它们的屠城史--木马技术发展趋势与回顾》一文。参考上面的解释,看看以前几篇曾经遇到过ShellExecuteHooks的文章(如上一篇清理病毒解决CPU100%),可以更清晰地知道病毒与木马是怎么进入系统和启动的,而且是怎么隐藏自己并占用CPU资源。
>> 除非说明均为原创,如转载请注明来源于http://www.stormcn.cn/post/520.html