我有一个恶意软件样本,它向注册表项添加了一个 DLL HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
。注册表项引用的 DLL 中存在恶意功能,但此恶意软件样本不会加载或调用 DLL,也不会表现出任何其他恶意行为。
为什么恶意软件会向该注册表项添加 DLL?
我有一个恶意软件样本,它向注册表项添加了一个 DLL HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
。注册表项引用的 DLL 中存在恶意功能,但此恶意软件样本不会加载或调用 DLL,也不会表现出任何其他恶意行为。
为什么恶意软件会向该注册表项添加 DLL?
基本上,在启动任何进程时都会加载该注册表项中列出的所有 DLL。有关详细信息,请参阅使用 AppInit_DLLs 注册表值。
此值中指定的所有 DLL 都由当前登录会话中运行的每个基于 Microsoft Windows 的应用程序加载。
它们通常被恶意代码使用(虽然它不一定是恶意的)作为 DLL 注入的一种方式,例如挂钩函数。更准确地说,AppInit DLL 实际上仅由链接 user32.dll 的进程加载。,正如 peter ferrie 所指出的,AppInit DLL 在加载后由 user32.dll 加载。64 位和 32 位版本的操作系统的实际注册表路径不同。
因此,对于 32 位系统上的 32 位 DLL,路径是:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]
对于 64 位系统上的 64 位 DLL:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]
对于 64 位系统上的 32 位 DLL:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]
多个条目用空格或逗号分隔,出于显而易见的原因,DLL 的路径不得包含任何空格。在 Vista 及更高版本上,需要对 AppInit DLL 进行签名,但RequireSignedAppInit_DLLs
可以将注册表值设置为 0,从而禁用此要求。
AppInit DLL在windows 7下的实现如下:
在user32.dll!ClientThreadSetup
该LoadAppInitDlls
从KERNEL32.DLL出口被要求除LogonProcess任何进程。
kernel32.dll!LoadAppInitDlls
检查LoadAppInit_DLLs
注册表项和 if set 调用BasepLoadAppInitDlls
(除非PEB 的偏移量 3具有值 2)。
BasepLoadAppInitDlls
为注册表项中设置的每个 DLL调用LoadLibraryExAppInit_DLLs
。如果需要签名(当RequireSignedAppInit_DLLs
设置了注册表值时),该LOAD_LIBRARY_REQUIRE_SIGNED_TARGET
标志将传递给 LoadLibraryEx。
因此,通过设置此注册表项,恶意软件 dll 将被注入到设置此注册表项后启动的每个进程中。在以前的操作系统版本中,AppInit DLL 不会为非 gui/控制台进程调用,但至少在 Windows 7 上,它也为非 gui 进程调用。