11-注册表注入

一、前言

官方文档关于注册表 - Win32 apps | Microsoft Learnarrow-up-right

参考文章

1、 、写入Shellcode到注册表上线_注册表shellcode执行-CSDN博客arrow-up-right

2、 奇安信攻防社区-CS免杀-RegQueryValueExA加载器arrow-up-right

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 键,子项,值

树中的每个节点称为 。 每个键可以同时包含 子项 和数据条目(称为 )。子项下也可以包含子项。

一个值包含名称类型数据

二、流程

  1. 使用 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

  2. 使用 RegSetValueExA 将shellcode作为键值写入注册表。官方文档:RegSetValueExA 函数 (winreg.h) - Win32 apps | Microsoft Learnarrow-up-right

    • 第一个参数是打开的注册表项的句柄,在本例中是 hOpenKey

    • 第二个参数是要设置的值的名称,在本例中是 test

    • 第三个参数,此参数是保留的,必须为零。

    • 第四个参数是写入的数据类型,在本例中是 REG_BINARY

    • 第五个参数是要存储的数据,在本例中就是 shellcode

  3. 使用 VirtualAlloc或者HeapAlloc 为shellcode分配内存,返回内存的起始地址pAllocMem

  4. 使用 RegQueryValueExA或RegGetValueA 获取值。在本例中我使用的 RegQueryValueExA,官方文档:RegQueryValueExA 函数 (winreg.h) - Win32 apps | Microsoft Learnarrow-up-right

    • 第一个参数是打开的注册表项的句柄,在本例中是 hOpenKey

    • 第二个参数是注册表值的名称,在本例中是 test

    • 第三个参数,此参数是保留的,必须为 NULL

    • 第四个参数是,指向变量的指针,本例中为 NULL

    • 第五个参数是指向接收值数据的缓冲区的指针,在本例中是 pAllocMem

  5. 使用 VirtualProtect 修改相应内存区域的保护属性。官方文档:VirtualProtect 函数 (memoryapi.h) - Win32 apps | Microsoft Learnarrow-up-right

  6. 使用 CreateThread 创建线程指向shellcode。官方文档:CreateThread 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learnarrow-up-right

三、代码实现

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

Last updated