关于AutoRuns 的总结里面,有个错误,Image hijacks 这个准确的描述应该是镜像劫持
和系统运行相关的image,我们通常指的是二进制镜像文件
Image hijacks镜像劫持
简单来说就是,在注册表中,有部分设置,是规定了对于某些后缀的文件关联的处理程序,如果这些设置被修改以后,就导致默认的处理流程被替换,也就是被劫持了,这个就是镜像劫持技术
服务枚举
服务的二进制路径枚举,有一类是进程代理启动类型的服务,它的二进制路径并不在image path 这键里面
进程代理启动的imagepath 路径有个特点,一般是包含"svchost.exe -k" 字段
svchost.exe 这个进程就是系统代理进程,通过命令行 的方式把已经注册在注册表中的其他服务的二进制文件(exe或者
dll,或者其他后缀的二进制程序)加载起来
这种类型的服务二进制真正的位置在主键下的Parameters里面的ServiceDLL
改一下代码
检测一下枚举出来的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, ¶metersKey) == 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
功能说明:这些项包含了系统中已加载的驱动程序的配置信息。通过修改这些项,可以管理和配置系统级别的驱动程序。