11-注册表注入
一、前言
官方文档:关于注册表 - Win32 apps | Microsoft Learn
参考文章:
1、 、写入Shellcode到注册表上线_注册表shellcode执行-CSDN博客
2、 奇安信攻防社区-CS免杀-RegQueryValueExA加载器
1.1 注册表
注册表是一个分层数据库,其中包含对 Windows 的操作以及 Windows 上运行的应用程序和服务至关重要的数据。 数据以树格式进行结构化。
应用程序必须先打开密钥,然后才能将数据添加到注册表。 若要打开密钥,应用程序必须向注册表中已打开的另一个项提供句柄。
已针对特定平台定义了其他预定义句柄。 下面是预定义键的句柄。 1. HKEY_CLASSES_ROOT:Shell 和 COM 应用程序使用此密钥下存储的信息 2. HKEY_CURRENT_USER:包括环境变量的设置、有关程序组、颜色、打印机、网络连接和应用程序首选项的数据 3. HKEY_LOCAL_MACHINE:计算机的硬件和软件配置 4. HKEY_USERS:本地计算机上新用户的默认用户配置和当前用户的用户配置 5. HKEY_CURRENT_CONFIG:描述了当前硬件配置与标准配置之间的差异
1.2 键,子项,值
树中的每个节点称为 键。 每个键可以同时包含 子项 和数据条目(称为 值)。子项下也可以包含子项。
一个值包含名称,类型,数据

二、流程
使用
RegOpenKeyExA打开指定的注册表项。官方文档 [RegOpenKeyExA 函数 (winreg.h) - Win32 apps | Microsoft Learn](https://learn.microsoft.com/zh-cn/windows/win32/api/winreg/nf-winreg-regopenkeyexa第一个参数是打开的注册表项的句柄,在本例中就是
HKEY_CURRENT_USER第二个参数是要打开的注册表子项的名称,在本例中就是
Control Panel第三个参数是指定打开键时要应用的选项,在本例中是
0第四个参数是一个掩码,指定要打开的密钥的所需访问权限,在本例中是
KEY_ALL_ACCESS第五个参数是输出参数,指向接收已打开键句柄的变量的指针,在本例中是
hOpenKey
使用
RegSetValueExA将shellcode作为键值写入注册表。官方文档:RegSetValueExA 函数 (winreg.h) - Win32 apps | Microsoft Learn第一个参数是打开的注册表项的句柄,在本例中是
hOpenKey第二个参数是要设置的值的名称,在本例中是
test第三个参数,此参数是保留的,必须为零。
第四个参数是写入的数据类型,在本例中是
REG_BINARY第五个参数是要存储的数据,在本例中就是
shellcode
使用
VirtualAlloc或者HeapAlloc为shellcode分配内存,返回内存的起始地址pAllocMem。使用
RegQueryValueExA或RegGetValueA获取值。在本例中我使用的RegQueryValueExA,官方文档:RegQueryValueExA 函数 (winreg.h) - Win32 apps | Microsoft Learn第一个参数是打开的注册表项的句柄,在本例中是
hOpenKey第二个参数是注册表值的名称,在本例中是
test第三个参数,此参数是保留的,必须为 NULL。
第四个参数是,指向变量的指针,本例中为 NULL
第五个参数是指向接收值数据的缓冲区的指针,在本例中是
pAllocMem
使用
VirtualProtect修改相应内存区域的保护属性。官方文档:VirtualProtect 函数 (memoryapi.h) - Win32 apps | Microsoft Learn使用
CreateThread创建线程指向shellcode。官方文档:CreateThread 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learn
三、代码实现


是不是感觉这种注入方式有点鸡肋呢,其实不然,你可以创建两个exe文件,一个文件用来将shellcode写入注册表,另一个文件用来读者shellcode并执行,这样一来不就符合我在 第一章-分离 那一小节介绍的理念吗,大幅度提高免杀性。
Last updated