DLL注入之注册表注入

2 篇文章 0 订阅

 

注册表注入DLL

顾名思义,就是通过注册表的方式,把需要的执行的代码片段,注入到目标程序中,使目标程序执行指定的代码片段,从而达到预期效果。
该方式依赖user32.dll,也就是说,需要可执行程序调用到这个系统动态库,我们注入的dll才会被执行到。
你应该也发现了,这个意思就是这是一种全局的注入,也就是说,所有调用到user32.dll的程序,都会调用到我们注入成功的dll,所以用这种方式还是要精心设计一下程序思路和限制条件。

注册表位置:

注册表注入DLL

顾名思义,就是通过注册表的方式,把需要的执行的代码片段,注入到目标程序中,使目标程序执行指定的代码片段,从而达到预期效果。
该方式依赖user32.dll,也就是说,需要可执行程序调用到这个系统动态库,我们注入的dll才会被执行到。
你应该也发现了,这个意思就是这是一种全局的注入,也就是说,所有调用到user32.dll的程序,都会调用到我们注入成功的dll,所以用这种方式还是要精心设计一下程序思路和限制条件。

注册表位置:

1
2
3
4
5
6
7
8
// AppInit_Dlls(64位程序读取)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows [AppInit_DLLs]

AppInit_Dlls(32位程序读取)
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows [AppInit_DLLs]

32位系统:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows [AppInit_DLLs]

注册表的认识:

1
2
3
4
5
6
// 注册表根:
// HKEY_CLASSES_ROOT
// HKEY_LOCAL_MACHINE
// HKEY_CURRENT_USER
// HKEY_USERS
// HKEY_CURRENT_CONFIG

这几个的意义不多做阐述,需要自行了解每个节点的意义,但是其实从命名上也能猜出一二
需要了解的是这几个玩意儿:

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
2
3
// API: RegOpenKeyEx RegSetValueEx RegQueryValueEx RegCloseKey
// 权限:KEY_READ KEY_WRITE KEY_EXECUTE KEY_ALL_ACCESS
// 涉及的数据类型:REG_SZ REG_DWORD

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <Windows.h>
#include <stdio.h>
#include <string.h>

int main()
{
	HKEY hKey;
	char *csAppInitValue = "C:\\test.dll";
	DWORD dwLoadAppInitValue = 1;
    char csSubKey[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\";
    LSTATUS lsRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,csSubKey,0,KEY_ALL_ACCESS,&hKey);

	if (lsRet != ERROR_SUCCESS)
	{
		printf("Open Key Failed....\n");
		return -1;
	}
	
	char csBuf[100] = "";
	DWORD dwSize = 100;
	DWORD dwType = 0;
	RegQueryValueEx(hKey,"AppInit_DLLs",0,&dwType,(LPBYTE)csBuf,&dwSize);

	int nSize = strlen(csAppInitValue);
	lsRet = RegSetValueEx(hKey,"AppInit_DLLs",0,REG_SZ,(const BYTE *)csAppInitValue,nSize+1);

	if (lsRet != ERROR_SUCCESS)
	{
		printf("Set Key Failed....\n");
		return -1;
	}

	

	lsRet = RegSetValueEx(hKey,"LoadAppInit_DLLs",0,REG_DWORD,(const BYTE *)&dwLoadAppInitValue,sizeof(DWORD));

	if (lsRet != ERROR_SUCCESS)
	{
		printf("Set Key Failed....\n");
		return -1;
	}

	RegCloseKey(hKey);

    getchar();
    return 0;
}

最后

对了,如何查看程序调用了哪些dll,这是一个新手问题,在这里我推荐一个很好用的工具:Process Explorer
这个工具,可以定位程序包括pid与调用的动态库等几乎所有的程序相关信息,具体怎么用,可以自行网络搜索,或者后续等我出一篇使用经验,哈哈哈,这个可能要等很久。
有兴趣可以联系我,一起分享学习经验,哈哈哈~

 

 

我的原博客位置:http://halfofpoetry.github.io/2020/05/07/DLL%E6%B3%A8%E5%85%A5%E4%B9%8B%E6%B3%A8%E5%86%8C%E8%A1%A8%E6%B3%A8%E5%85%A5/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值