Windows用户模式下注入方式总结
注入技术在病毒木马、游戏、打补丁等编程中应用很广泛,学习该技术不仅能帮助理解Windows工作原理,还能对病毒木马技术手段有更加深刻的理解,下面我们了解下各种注入方式吧。
一.DLL注入
在注入技术中,DLL注入是最常见最有效的技术。作者通常把代码编写成一个动态链接库,然后把这个动态链接库加载到正常进程中去,因为任何一个进程在加载动态链接库时都要执行DLL文件里入口函数DllMain中的代码,这样代码才得以执行。
1.修改注册表
修改 HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion/Windows/AppInit_DLLs 的键值,改为待注入DLL的路径,这样一来,程序运行后只要加载了user32.dll,都会加载我们写入的DLL。
2.全局消息钩子注入
Windows应用程序是基于消息驱动的,任何线程只要注册窗口类都会有一个消息队列用于接收用户输入的消息和系统消息。为了拦截消息,Windows提出了钩子的概念。钩子(Hook)是Windows消息处理机制中的一个监视点,钩子提供一个回调函数。当在某个程序中安装钩子后,它将监视该程序的消息,在指定消息还没到达窗口之前钩子程序先捕获这个消息。这样就有机会对此消息进行过滤,或者对Windows消息实现监控。 消息钩子分为局部钩子和全局钩子。局部钩子是指仅拦截某一个进程的消息,全局钩子将拦截系统中所有进程的消息。
该技术需要我们写一个简单的加载该DLL的程序,使其调用DLL的钩子函数,该函数会下一个全局消息钩子,强迫所有发生该消息的进程加载该DLL,这样就实现了DLL注入。
3.手工修改导入表
该方法需要我们熟悉PE结构,找到导入表位置在其后面添加一个新节,写入待注入的DLL,并将该DLL的导出函数的一些信息写到正确的位置,若导出函数过多将花费很多时间在手工修改上,并且可能出现空间不足写入的情况。
4.远程线程注入DLL
通过利用2000/XP等系统所有进程加载Kernel32.dll的模块基址一致的特点,先使用OpenProcess函数打开远程进程的句柄,再用VirtualAllocEx和WriteProcessMemory将待注入DLL路径写入目标进程,找到LoadLibraryW的地址,最后用CreateRemoteThread使目标进程调用LoadLibraryW加载DLL,参数为写入的DLL路径。
5.APC注入
APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的。利用QueueUserAPC()可以向APC队列投入Loadlibrary函数指针完成注入,其实这种方法配合CreateProcess使用注入最为简单,先挂起打开线程,再QueueUserAPC(),再恢复线程,完成注入。
6.DLL劫持
自己实现应用程序的某个DLL,完成其导出函数,并将其放于应用程序目录下,当程序打开并加载DLL时会优先加载该目录下的DLL,原来的DLL若在该目录下降其移走即可。
7.输入法注入
利用输入法在工作时需要向进程中加载Ime文件(其实就是个Dll),我们构造自己的Ime文件,在Ime文件注入对方进程的时候加载我们自己的DLL完成注入
二.代码注入
对于病毒来讲,虽然远程注入DLL相对隐蔽,但是因为在被注入进程中多了个DLL模块,所以也没有做到完全隐蔽,而且也很容易将病毒清除。所以对于那些更高级的病毒则使用了更加隐蔽,更加难以清除的方法:远程代码注入。这是指,在远程进程中开辟足够大的内存空间,然后将要执行的代码直接写过去,最后使用远程线程的方法运行注入代码。这样做可以使其他进程执行病毒代码,而又不会在对方进程中产生新的模块,从而使病毒能够更隐蔽地运行。
1.手工修改执行起始地址
使用二进制编辑工具打开目标程序,找到合适的地方写入二进制代码,将程序执行起始地址(AddressOfEntryPoint)改为注入代码处,在执行完后跳到源地址。
2.挂起线程注入
OpenThread-->SuspendThread-->申请内存-->写入代码-->GetThreadContext-->获取EIP-->修改EIP-->SetThreadContext-->ResumeThread。
3.挂起进程注入
CreateProcess注入方法之一,CREATE_SUSPENDED以挂起的方式打开进程,后面方法与挂起线程注入相似。
4.调试器注入
CreateProcess注入方法之二,DEBUG_ONLY_THIS_PROCESS以调试的方法打开进程,利用CREATE_PROCESS_DEBUG_EVENT,向目标程序中写入我们的ShellCode完成相应功能,并且我们的ShellCode中写入以CC断点,代码执行指令时触发EXCEPTION_DEBUG_EVENT事件,在EXCEPTION_DEBUG_EVENT的处理函数中回到原来的执行流程。
参考书籍:《计算机病毒揭秘与对抗》
参考网址:https://bbs.pediy.com/thread-217722.htm