关于AutoRuns 的总结里面,有个错误,Image hijacks 这个准确的描述应该是镜像劫持
和系统运行相关的image,我们通常指的是二进制镜像文件

Image hijacks镜像劫持

简单来说就是,在注册表中,有部分设置,是规定了对于某些后缀的文件关联的处理程序,如果这些设置被修改以后,就导致默认的处理流程被替换,也就是被劫持了,这个就是镜像劫持技术

服务枚举

服务的二进制路径枚举,有一类是进程代理启动类型的服务,它的二进制路径并不在image path 这键里面
进程代理启动的imagepath 路径有个特点,一般是包含"svchost.exe -k" 字段
svchost.exe 这个进程就是系统代理进程,通过命令行 的方式把已经注册在注册表中的其他服务的二进制文件(exe或者修改一下第二次课服务枚举等问题-LMLPHP
dll,或者其他后缀的二进制程序)加载起来

这种类型的服务二进制真正的位置在主键下的Parameters里面的ServiceDLL
修改一下第二次课服务枚举等问题-LMLPHP

改一下代码

检测一下枚举出来的imagepath 字段中是否有svchost.exe -k 字段如果有,就去找子键 Parameters 里面的 serviceDLL 作为该服务的二进制路径
imagepath 字段中是否有svchost.exe -k 字段 实现这个功能,需要用到字符串搜索函数
字符串处理的函数,实际编程中,用到非常频繁的,头文件 是string.h

#include <iostream>
#include <string>
#include <Windows.h>

void EnumerateServices()
{
    HKEY hKey;

    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
    {
        DWORD numSubKeys;
        if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
        {
            for (DWORD i = 0; i < numSubKeys; i++)
            {
                WCHAR subKeyName[MAX_PATH];
                DWORD subKeyNameSize = MAX_PATH;

                if (RegEnumKeyExW(hKey, i, subKeyName, &subKeyNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
                {
                    HKEY subKey;
                    if (RegOpenKeyExW(hKey, subKeyName, 0, KEY_READ, &subKey) == ERROR_SUCCESS)
                    {
                        WCHAR imagePath[MAX_PATH];
                        DWORD imagePathSize = MAX_PATH;

                        // 获取 ImagePath 字段的值
                        if (RegGetValueW(subKey, NULL, L"ImagePath", RRF_RT_REG_SZ, NULL, imagePath, &imagePathSize) == ERROR_SUCCESS)
                        {
                            std::wstring imagePathStr(imagePath);
                            if (imagePathStr.find(L"svchost.exe -k") != std::wstring::npos)
                            {
                                HKEY parametersKey;
                                if (RegOpenKeyExW(subKey, L"Parameters", 0, KEY_READ, &parametersKey) == ERROR_SUCCESS)
                                {
                                    WCHAR serviceDLL[MAX_PATH];
                                    DWORD serviceDLLSize = MAX_PATH;

                                    // 获取 ServiceDLL 字段的值
                                    if (RegGetValueW(parametersKey, NULL, L"ServiceDLL", RRF_RT_REG_SZ, NULL, serviceDLL, &serviceDLLSize) == ERROR_SUCCESS)
                                    {
                                        std::wcout << "Service Name: " << subKeyName << std::endl;
                                        std::wcout << "Binary Path: " << serviceDLL << std::endl;
                                        std::wcout << std::endl;
                                    }

                                    RegCloseKey(parametersKey);
                                }
                            }
                        }
                    }

                    RegCloseKey(subKey);
                }
            }
        }

        RegCloseKey(hKey);
    }
}

int main()
{
    EnumerateServices();

    return 0;
}


以下是一些常见功能对应的注册表路径,以及与之相关的功能说明:

启动项(Startup Items):
    注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
    功能说明:这些项定义了系统启动时自动运行的程序。通过添加、修改或删除这些注册表项,可以控制开机启动的应用程序。

服务(Services):
    注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
    功能说明:这些项包含了系统中已安装的服务的配置信息。通过修改这些项,可以管理和配置系统级别的服务。

Shell 扩展(Shell Extensions):
    注册表路径:HKEY_CLASSES_ROOT*\shellex\ContextMenuHandlers、HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers 等等
    功能说明:这些项定义了在 Windows 资源管理器中显示的上下文菜单扩展程序。通过修改这些注册表项,可以添加或删除特定文件类型或文件夹的上下文菜单选项。

定时任务(Scheduled Tasks):
    注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks
    功能说明:这些项定义了系统中预定的定时任务。通过修改这些注册表项,可以添加、修改或删除计划任务。

驱动程序(Drivers):
    注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
    功能说明:这些项包含了系统中已加载的驱动程序的配置信息。通过修改这些项,可以管理和配置系统级别的驱动程序。
11-05 18:57