DLL注入方法——使用注册表注入DLL

从今天开始简单的在博客整理一下以前的私人文章,算是多年之前学习编程时记下的笔记吧。方法讲解完毕后会给大家简单分析一下该方法的优劣。

HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWindows

AppInit_DLLs是一个REG_SZ类型,在这里写入一个DLL的文件名或是一组DLL的文件名。如果写入的是一组DLL文件名,那么中间要用逗号或者是空格分隔。由于在这里使用空格分隔文件名,因此一定要避免在DLL文件名中包含空格。第一个DLL的文件名可以包含路径,但其他DLL包含的路径则将被忽略。因此应该将多个DLL放到Windows系统目录为妙,这样就不必指定路径了。为了能够让系统使用这个注册表项,还需要一个名为LoadAppInit_Dlls的REG_DWORD类型的注册表项,并将其值设置为1,如图所示。

当User32.dll被映射到一个新的进程时,会收到DLL_PROCESS_ATTACH通知。当User32.dll对它进行处理的时候,会取得上述注册表键值,并调用LoadLibrary来载入这个字符串中指定的每个DLL。当系统载入每个DLL的时候,会调用它们的DllMain函数并将参数fdwReason的值设为DLL_PROCESS_ATTACH,这样每个DLL就能够对自己进行初始化。由于被注入的DLL是在进程的生命期的早期被载入的,因此我们在调用函数的时候应该慎重。调用Kernel32.dll中的函数应该没有问题,但是调用其他DLL中的函数可能会导致问题,甚至可能会导致蓝屏。User32.dll不会检查每个DLL载入或是初始化是否成功。

下面说说这个方法在免杀方面的情况。因为该方法使用范围很广(出现的比较早)。修改这个键值,360安全卫士会给予警报,360安全卫士的扫描也会发现危险。在微点主动防御上更是没有任何效果。