机制
DLL注入是向运行中的其他进程强制插入特定DLL文件. 以达到钩取API, 改进程序, 修复BUG等目的.
实现方式
- 创建远程线程(CreateRemoteThread() API)
- 使用注册表(AppInit_DLLs值)
- 消息钩取(SetWindowsHookEx() API)
Win10下复现创建远程进程DLL注入notepad.exe
ReverseCore这本书中说XP/Win7系统测试通过, 其实在Win10下也可行.
需要注意的坑点
- 路径填写按Windows的写法, 书中W不能替代\
- cmd用管理员打开
- debugview一次只能打开一个, 另一个会连接不上
- debugview和debugview64都可行
- 可用process explorer查看加载的dll文件.
- InjectDll.exe命令行提示成功不一定是成功只是表示运行没问题(比如修改文件名也会表示成功)
主要截图如下
另外, DLL调试可以见我的另一篇博客
小结
Windows的一个特性, kernel32.dll在加载后(首次进入内存称为加载), 在每个进程中映射到的地址是相同的. 所以便携dll注入程序时, 使用的不是目标进程的kernel.dll地址, 而是注入进程自身的kernel.dll地址. 只不过两者在Windows系统中相等所以可行. 这个特性经常被DLL注入所利用. 也可能成为Windows安全漏洞.
注意一个概念, 在应用了ASLR机制的系统下, 虽然DLL加载地址每次都不一样(系统启动时进行加载), 但是加载之后就不变了, 所以之后启动的进程引用了系统DLL文件, 映射的地址也是相同的.
AppInit_DLLs注册表DLL注入
原理
Windows提供AppInit_DLLs与LoadAppInit_DLLs两个注册表项. 在编辑器中给AppInit_DLLs添加所要注入的DLL路径字符串, 并设置LoadAppInit_DLLs的项目值设为1. 重启后, 指定的DLL会注入所有运行进程. 过程是User32.dll加载到进程时会读取AppInit_DLLs注册表项, 调用LoadLibrary()API加载用户DLL, 严格地说并不是DLL会加载到所有进程, 而是有user32.dll的进程.
另外, XP系统忽略LoadAppInit_DLLs注册表项.
SetWindowsHookEx() DLL注入
同见另一篇博客