Windows Ring3层注入——注入相关知识(零)
Windows Ring3层注入——注入相关知识(零)
ps:这个是本人整理的注入相关知识,根据一下几本书《Windows核心编程》、《加密与解密》、《游戏外挂攻防技术》以及网络上相关博客(具体忘了都参考什么了)纯自己理解消化后手打整理的知识,因为本身是个水平有限的刚入门C++程序员,所以写出来的也是比较适合入门的人阅读,转载注明出处就可以。
定义
注入就是迫使第三方进程非自愿加载某个模块(DLL)。
需要注入的几种情况
1.想要从另一个进程创建窗口派生子类窗口
2.需要一些手段来辅助调试
3.想给另一个进程安装挂钩
注入时机
静态输入
定义:通过干预输入表处理过程加载DLL。在进程创建阶段加载输入表中的DLL。
- 进程创建阶段会处理并加载输入表中的DLL模块。当一个进程被创建后,不会直接到EXE本身的入口处执行,首先被执行的是ntdll.dll中的LdrInitializeThunk函数。
- LdrInitializeThunk会调用LdrpInitializeProcess对进程的一些必要内容进行初始化,LdrpInitializeProcess会继续调用LdrpWalkImportDescriptor对输入表进行处理,即加载输入表中的模块,并填充应用程序的IAT(Import Address Table 导入地址表)
- 所以,只要在输入表被处理之前进行干预,为输入表增加一个项目,使其只想要加载的目标DLL,或者替换原输入表中的DLL并对调用进行转发,那么新进程的主线程在输入表初始化阶段就会主动加载目标DLL。
动态加载
定义:改变程序运行流程使其主动加载目标DLL。调用LoadLibrary(Ex)主动加载。
- 程序运行的容器是进程,真正活动的是其中的线程。因此, 改变程序流程的通常做法是改变线程EIP、创建新线程或修改目标进程内的某些代码,使其执行**LoadLibrary(Ex)**来加载目标DLL。
加载服务模块
定义:利用系统机制加载DLL。由于系统机制的要求,必须加载系统预设的一些基础服务模块。
- 操作系统提供的某些系统机制是依赖一些基础服务模块(可能是操作系统本身提供的,也可能是第三方提供的)实现的,当进程主动或被动触发了这些系统机制时,就会在适当的时候主动加载这些模块。因此,可以定制一个符合该规范的DLL,将其注册为系统服务模块,这样就可以**“合法”**地进入目标进程了。
注入方法
概括说明注入方式原理
通过干预输入表处理过程加载目标DLL
改变程序运行流程主动加载DLL
利用系统机制加载DLL
几种常见的注入方式
静态注入:
动态加载:
2.CreateRemoteThread 远程线程注入
3.QueueUserApc/NtQueueAPCThread APC注入
4.CreateProcess劫持进程创建注入