文章目录
DLL是Windows平台提供的一种模块共享和重用机制,它本身不能直接独立执行,但可以被加载到其他进程中间执行,对灵活实现各种补丁功能非常有帮助。
DLL注入放发
程序加载DLL时间:
- 在进程创建阶段加载(静态输入)
- 调用LoadLibrary主动加载(动态加载)
- 由于系统机制的要求,必须加载系统预设的一些基础服务模块(Shell扩展模块。网络服务接口模块、输入法模块)
以下是这三种注入方式的实践。
通过干预输入表处理过程加载目标DLL
进程创建后首先执行ntdll.dll中的LdrInitializeThunk函数,他调用LdrlrutializeProcess,他调用LdrpWalkImoportDescriptor对输入表进行处理。只需要在输入表处理前进行干预,为输入表增加一个项目,或替换原输入表中的DLL并对调用转发,就能加载目标DLL。
静态修改PE输入标法
通过在PE输入表中添加一行新的IID内容,添加目的DLL。
用原来IID数组所在的内存区域,在这个内存区域中寻找一块空间放置新的IID数组。
采用PE编辑器可以轻松添加IID。
进程创建期修改PE输入表法
进程创建期修改PE输入表法的原理与静态修改PE输入表法完全相同,可以在R3/R0的各个阶段进行干预。
输入表项DLL替换法
将DLL与EXE文件放到同一目录下利用读取dll顺序来运行目标dll。
改变程序运行流程使其主动加载目标DLL
程序运行的容器是进程,真正活动的是其中的线程。因此,改变程序流程的通常做法是改变线程EIP、创建新线程或修改目标进程内的某些代码,使其执行LoadLibrary来加载目标DLL。
CreateRemote Threadz法
在目标进程中申请一块内存并向其写入DLL路径,然后调用CreateRemoteThread,在目标进程中创建一个线程。
利用系统机制加载DLL
操作系统提供的某些系统机制是依赖一些基础服务模块实现的,当进程主动或被动触发了这些系统机制时,就会在适当的时候主动加载这些模块。定制一些符合规范的DLL,将其注册为系统服务模块,这样就可以合法地进入目标进程了。