远程线程注入DLL
远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLibrary()函数,进而将我们自己准备的DLL加载到远程进程空间中执行。
选LoadLibrary 函数原因: 首先,它可以把一个Dll载入内存空间,并执行DLL初始化函数。 第二,LoadLibrary在Kernel32.dll中,Kernel32.dll的加载基址在每个进程中都是一样的所以,LoadLibrary在每个进程的地址就是一样的。
注意事项:在DLL中,载入窗口命令中,必须用“对话框方式”!比如,载入(窗口1,,真)
参考资料:https://bbs.125.la/forum.php?mod=viewthread&tid=13724049&highlight=%D7%A2%C8%EB%D7%A8%CC%E2
消息钩子注入
消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中
使用SetWindowsHookEx()之前首先需要将HOOK的DLL 加载到本身的进程中,以此得到DLL的模块句柄,再使用GetProcAddress()得到DLL中公开的函数XXX()的函数地址,最后遍历出待注入进程的线程ID,这样SetWindowsHookEx()就可以利用这些参数进行HOOK了。
注意事项:消息钩子注入需要有窗口
参考资料:https://bbs.125.la/forum.php?mod=viewthread&tid=13722272&highlight=%D7%A2%C8%EB%D7%A8%CC%E2
输入法注入
输入法注入原理是利用Windows系统中在切换输入法需要输入字符时,系统就会把这个输入法需要的ime文件装载到当前进程中,而由于这个Ime文件本质上只是个存放在C:\WINDOWS\system32目录下的特殊的DLL文件,因此我们可以利用这个特性,在Ime文件中使用IMESetPubString()注入DLL文件
也可以直接编写IME文件在其中使用oadLibrary()函数载入注入的DLL文件
参考资料:https://www.52pojie.cn/forum.php?mod=viewthread&tid=428396
注册表注入
注册表注入原理是利用在Windows 系统中,当注册表以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个DLL文件路径中的DLL文件。当如果遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径。
本注入器是采用的是Appinit_Dlls注册表项, 此注册表项下的每个dll文件都会随着User32.dll的加载而同样加载到进程中
本注入器写入注册表的全路径为:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
注意事项:注册表注入会对每一个进程都有效,针对某个进程的话需要在DLL中进行编写
参考资料:http://blog.csdn.net/programmingring/article/details/18954193
EIP注入
挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝到里面去,然后修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置,执行相关,然后跳转回来。
修改EID实现代码注入的汇编思路如下
SuspendThread();
get eip
push ad
push fd
push AddressDllFilePath
call LoadLibrary
pop fd
pop ad
jmp eip //这个是为了让程序执行完我们的代码之后自己跳转回去继续执行
ResumeThread();
参考资料:http://blog.csdn.net/u013761036/article/details/52885552
APC注入(应用层)
APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,其具体流程如下:
1)当EXE里某个线程执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断(或者是Messagebox弹窗的时候不点OK的时候也能注入)。
2)当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数。
3)利用QueueUserAPC()这个API可以在软中断时向线程的APC队列插入一个函数指针,如果我们插入的是Loadlibrary()执行函数的话,就能达到注入DLL的目的。
注意事项:目标程序必须有执行SleepEx()或者WaitForSingleObjectEx(),否则DLL不会加载
参考资料:http://blog.csdn.net/u013761036/article/details/53338322
内存注入
内存注入和远程线程注入差不多,不同地方在于这里将DLL整个文件都写进了目标进程内存中,采用了汇编指令加载DLL,调用DLL函数,但是核心还是使用VirtualAllocEx、WriteProcessMemory、CreateRemoteThread
注意事项:自己调试了几次DLL需要黑月编译
参考资料:超级模块源码
IAT永久注入
通过添加一个新节注入,改变PE文件的大小,将原有的导入表复制到新节中,并添加自己的导入表描述符,最后将数据目录项中指向的导入表的入口指向新节,生成新的文件
注意事项:无法注入一些加壳的文件和自校验文件,会生成一个新的文件,DLL需要黑月编译
参考资料:http://www.pudn.com/Download/item/id/1996578.html
内存永久注入
高配版IAT永久注入,不仅添加了区段,把DLL也写进了内存,采用汇编装载DLL
注意事项:无法注入一些加壳的文件和自校验文件,会生成一个新的文件
参考资料:http://bbs.eyuyan.com/read.php?tid=382106&fpage=2
有想讨论的可以添加作者QQ,作者QQ:495214225 请备注:精易