DLL注入
Last Update:
Word Count:
Read Time:
DLL注入
远程线程注入
参考:
https://bbs.kanxue.com/thread-282885.htm
https://blog.csdn.net/Cody_Ren/article/details/100053434
https://blog.csdn.net/y281252548/article/details/120265888
注入代码
1 |
|
DLL代码
1 |
|
APC注入
APC注入的原理?
APC是一个简称,即“异步过程调用”。APC注入的原理是利用当线程被唤醒时,APC中的注册函数会被执行,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的。在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC。
其实现流程为:
1)当EXE里某个线程执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断。
2)当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数。
3)利用QueueUserAPC()这个API可以在软中断时向线程的APC队列插入一个函数指针,如果我们插入的是Loadlibrary()执行函数的话,就能达到注入DLL的目的。
使用方法:
1.利用快照枚举所有的线程
2.写入远程内存,写入的是Dll的路径
3.插入我们的DLL即可
注入代码
1 |
|
注册表注入
利用在Windows系统中,当REG中的以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个DLL文件路径中的DLL文件。当如果遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径。
注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLL
REG注入就是Windows 系统在给EXE文件加载DLL文件的过程中,多加载了一个比如说AppInit_DLL中的DLL文件,这个DLL文件可以是合法的,也可以是病毒文件的DLL,这就要看使用者是怎么利用这个特性了。
换个说法理解一下:
在系统中每一个进程加载User32.dll时,会收到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft\windowsNT\CurrentVresion\Windows\AppInit_Dlls,并调用LoadLibrary来载入这个字符串中指定的每个DLL。被调用的DLL会在系统调用它们的DllMain函数,并将参数fdwReason的值设为DLL_PROCESS_ATTACH时,对自己进行初始化。所以我们在这个键值中添加我们的Dll路径,即可实现注入。
再换个说法理解一下:
注册表中默认提供了AppInit_Dlls与LoadAppInit_Dlls两个注册表项
在注册表编辑器中,将要注入的DLL路径字符串写入AppInit_Dlls项目,然后把LoadAppInit_Dlls项目值设置为1,重启后,指定DLL会注入所有运行进程。
工作原理:User32.dll被加载到进程是,会读取AppInit_DLLs注册表项,若有值,则调用LoadLibrary()API加载用户DLL,所以,严格的说,想应DLL并不会被加载到所有进程,而只是加载user32.dll的进程,Windows Xp忽略LoadAppInit.DLLs项。
注入流程:
打开注册表键值如下:
HKEY_LOCAL_MACHINE\SoftWare\MicroSoft\Windows NT\CurrentVersion\Windows\
在上面的注册表项中操作 AppInit_DLLs 键值,在该键值中添加自己的DLL的全路径加dll名,多个DLL以逗号或者空格分开(因此在文件名中应该尽量不要存在空格),该键值只有第一个dll文件名可以包含路径,后面的都不能包含,因此我们最好将dll放在系统路径 下,这样就可以不用包含路径也能被加载了。
在该注册表项中添加键值 LoadAppInit_DLLs ,类型为 DWORD,并将其值置为 1 。
总结
REG注入操作简单易懂,甚至不用写程序都可以完成注入操作,但是正是由于他的简单性,每个EXE都被注入,效率低,程序的扩展性差。
ComRes注入
ComRes注入的原理是利用Windows系统中C:\WINDOWS\system32目录下的ComRes.dll这个文件,当待注入EXE如果使用CoCreateInstance()这个API时,COM服务器会加载ComRes.dll到EXE中,利用这个加载过程,我们可以将ComRes.dll替换掉,并在伪造的ComRes.dll,然后利用LoadLibrary()将事先准备好的DLL加载到目标EXE中。
注意事项:
由于直接拷贝comres.dll文件到C:\WINDOWS\system32目录下会引起winows的文件系统保护机制,所以首先需要将C:\WINDOWS\system32\dllcache下的文件替换掉,然后再将其C:\WINDOWS\system32文件替换为我们伪造的文件。
ComRes注入只需伪造与替换就可以完成,编程要求不高,方便使用,但是由于加载了ComRes.dll后,再想替换ComRes.dll文件就不可能了,因此想反复测试ComRes.dll文件就比较麻烦。
劫持进程创建注入
劫持进程创建注入原理是利用Windows系统中的CreateProcess()这个API创建一个进程,并且将第六个参数设置为CREATE_SUSPENDED,进而创建一个挂起状态的进程,利用这个进程状态进行远程线程注入DLL,然后用ResumeThread()函数回复进程。
劫持进程创建注入其实就是远程线程注入的前期加强版,他可以在进程启动前进行注入,由于进程的线程没有启动,这样就可以躲过待注入进程的检测,提高注入的成功率。
消息钩子注入
消息钩子注入原理是利用Windows系统中的SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中的导出函数,利用这个特性,我们可以将DLL注入到指定的进程中。
注意:
消息钩子注入只需要对SetWindowsHookEx()和DLL导出函数有深刻的认识就可以很容编写,所以代码简单,比较容易实现。