注册表注入DLL
顾名思义,就是通过注册表的方式,把需要的执行的代码片段,注入到目标程序中,使目标程序执行指定的代码片段,从而达到预期效果。
该方式依赖user32.dll,也就是说,需要可执行程序调用到这个系统动态库,我们注入的dll才会被执行到。
你应该也发现了,这个意思就是这是一种全局的注入,也就是说,所有调用到user32.dll的程序,都会调用到我们注入成功的dll,所以用这种方式还是要精心设计一下程序思路和限制条件。
注册表位置:
1 | // AppInit_Dlls(64位程序读取) |
注册表的认识:
1 | // 注册表根: |
这几个的意义不多做阐述,需要自行了解每个节点的意义,但是其实从命名上也能猜出一二
需要了解的是这几个玩意儿:
1 | // AppInit_DLLs LoadAppInit_DLLs RequireSignedAppInit_DLLs |
AppInit_DLLs:是注册表在中的一个系统设置项,它的值可以为一个dll路径列表,其实这里就是我们要注入的dll(注意:这里是全局注入)
LoadAppInit_DLLs:真正做过该内容开发的人,就会发现,xp下是没有这个项的,而大于win7的系统版本下才有这个项,LoadAppInit_DLLs 为1开启,为0关闭,(Win7默认为0)
RequireSignedAppInit_DLLs:这个的xp下也是没有的,值为1表明模块需要签名才能加载,反之则不行
AppInit_DLLs详细的键值介绍,可以查看官方文档(Win7):
https://docs.microsoft.com/zh-cn/windows/win32/win7appqual/appinit-dlls-in-windows-7-and-windows-server-2008-r2?redirectedfrom=MSDN
需要认识的API
1 | // API: RegOpenKeyEx RegSetValueEx RegQueryValueEx RegCloseKey |
RegOpenKeyEx:打开注册表路径,调用时候,只需要打开到所需要修改设置项的路径,例如:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows (真正调用的时候注意转义)
再打开注册表的时候,可以通过设置:KEY_READ KEY_WRITE KEY_EXECUTE KEY_ALL_ACCESS来获取读写权限,当然也有可能获取失败的时候,所以要关注返回值
RegQueryValueEx:查询对应的键值
RegSetValueEx:设置键值
RegCloseKey:关闭当前打开的注册表
在调用过程中注意返回值类型,可以用ERROR_SUCCESS去判断是否调用成功,其他类型可以查看相关文档。
其他不做赘述了
写一个简单demo:
1 |
|
最后
对了,如何查看程序调用了哪些dll,这是一个新手问题,在这里我推荐一个很好用的工具:Process Explorer
这个工具,可以定位程序包括pid与调用的动态库等几乎所有的程序相关信息,具体怎么用,可以自行网络搜索,或者后续等我出一篇使用经验,哈哈哈,这个可能要等很久。
有兴趣可以联系我,一起分享学习经验,哈哈哈~