经常关注安全的用户或许会见到过"ShellExecuteHook",如今许多木马和恶意程序都在用户层使用它作为启动方式了,但这是一种什么技术,大家可能又会迷惑不解了,究竟这个技术和木马有什么联系?其实这是一种正常的系统功能,名为"执行挂钩",操作系统厂商开发它的初衷十分简单:为程序提供一个额外的通知功能,以实现系统中任何程序启动时都提前让使用了"执行挂钩"的程序收到新程序的启动通知,简单的说,这是操作系统在出于某种程序交互需求的考虑下所衍生的技术,
它的作用就是让一部分程序能够在其他程序开始运行之前就得知有新程序即将运行的通知,以及这个程序的映像文件名称等信息,用于接收通知的程序必须遵循COM对象编程标准编写。
这个技术是通过外壳程序Explorer.exe实现的,它的加载项被指定在系统注册表"HKLM/Software/Microsoft/Windows/CurrentVersion/Explorer/ShellExecuteHooks"内,用户浏览这里会发现里面并不是熟悉的路径和文件名,而是一堆奇怪组合的数字和字符串,这些字符串被称为"Class ID"(类唯一标识符,CLSID),每一个DLL模块都拥有属于它自己的唯一CLSID,操作系统自身是通过CLSID获得这个DLL的详细文件位置并加载它的。在执行挂钩技术里,这个注册表键里的数据就代表了申请接受通知的DLL模块的CLSID,
当一个新程序执行时,系统会将这个消息通过注册表的执行挂钩入口派发出去,而后系统会载入这些符合COM对象标准的DLL文件以执行它预先定义的线程代码对消息进行处理,换句话说,也就是系统自己启动了声明为"执行挂钩"对象的DLL模块,它们的初次加载程序是外壳Explorer.exe。看到这里,各位是不是觉得这个过程很熟悉?没错,这简直就是第一代DLL木马依靠第三方EXE实现自启动的翻版,所不同的是,这次的DLL启动宿主是系统外壳自身,而且它还拥有一个任何第三方EXE宿主都无法具备的功能:确保DLL在每一个进程启动时自动加载运行。
这个技术最早被杀毒软件用于实现提前检测功能,然而现在它却被恶意软件、木马后门等程序编写者大量的用在了不法行为之上,与IFEO的初衷一样,它们的功能都被曲解应用了。
由于这个技术的执行逻辑使得木马主体DLL可以在每一个程序运行时也随着它执行并随之进入它的内存空间 ,成为其模块之一,也就是说,这个技术使得做了保护措施的DLL木马变得难以彻底查杀,而且它不会产生任何敏感位置的启动项,也不需要指明一个加载器——它的加载器就是Explorer.exe自身。而广大用户中,能够理解并找到这个注册表项的人不多。
使用这个技术的木马如何查杀?其实别看它似乎很可怕,它也是有弱点的:由于这是Explorer实现的功能,它就必须依靠Explorer的存在而产生通知行为,一旦Explorer被终止执行,这类木马也就没有了加载器。大部分手工查杀木马的用户都发现使用这个技术的木马无法彻底删除,其实这与他们的使用习惯有关,大部分用户都是在需要用到什么工具的时候才会去运行它,那么回到开头对这个技术的解释来重新理解一下,你就会明白,这是因为你在其后运行其他工具的时候,
执行挂钩又将木马DLL启动了一次,并可能产生了另一个随机字符串组合的DLL文件名来添加新的加载项,如此恶意循环,最终便无法彻底查杀。正确的做法是,在运行了一堆自己预料到会用上的功能以后,将Explorer.exe终止,避免执行挂钩再次被调用,随后使用工具争取一次就能把位于注册表入口ShellExecuteHooks 内的DLL注册信息和文件本体共同删除,这样一来即可将木马逐出机器。在工具的选择上我推荐Sysinternal的Autoruns,它提供的ShellExecuteHooks清理一体化功能非常不错