# 如何防止惡意的第三方DLL注入到進程
## 引言
在Windows系統安全領域,DLL注入(Dynamic-Link Library Injection)是一種常見的技術手段。攻擊者通過將惡意DLL加載到目標進程內存空間,能夠竊取數據、篡改行為或繞過安全檢測。本文將深入探討防護策略,從原理到實踐提供系統化解決方案。
---
## 一、DLL注入的常見技術原理
### 1.1 基本注入流程
- **遠程線程注入**:通過`CreateRemoteThread`在目標進程創建線程執行`LoadLibrary`
- **APC注入**:利用異步過程調用(APC)隊列強制加載DLL
- **注冊表劫持**:修改`AppInit_DLLs`或`KnownDLLs`實現持久化
- **COM劫持**:通過組件對象模型劫持CLSID加載路徑
### 1.2 現代注入技術演進
```c
// 典型遠程線程注入代碼片段
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
LPVOID pDllPath = VirtualAllocEx(hProcess, NULL, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pDllPath, (LPVOID)dllPath, strlen(dllPath)+1, NULL);
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, pDllPath, 0, NULL);
降低令牌權限:
# 移除SeDebugPrivilege
whoami /priv | findstr "SeDebugPrivilege"
啟用MIC(強制完整性控制):
// 設置進程為低完整性級別
BOOL SetProcessIntegrityLevel(DWORD level) {
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
SetTokenInformation(hToken, TokenIntegrityLevel, &level, sizeof(level));
}
技術 | 作用描述 | API示例 |
---|---|---|
DEP/NX | 阻止數據頁執行 | SetProcessDEPPolicy |
ASLR | 隨機化內存布局 | SetProcessMitigationPolicy |
CFG | 控制流完整性保護 | SetProcessGuardPolicy |
Arbitrary Code Guard | 禁止非映像內存執行 | PROCESS_CREATION_MITIGATION_POLICY |
DLL白名單校驗方案:
bool VerifyDllSignature(LPCWSTR lpDllPath) {
WINTRUST_FILE_INFO fileInfo = { sizeof(fileInfo) };
fileInfo.pcwszFilePath = lpDllPath;
WINTRUST_DATA trustData = { sizeof(trustData) };
trustData.dwUIChoice = WTD_UI_NONE;
trustData.fdwRevocationChecks = WTD_REVOKE_NONE;
trustData.dwUnionChoice = WTD_CHOICE_FILE;
trustData.pFile = &fileInfo;
return WinVerifyTrust(NULL, &WINTRUST_ACTION_GENERIC_VERIFY_V2, &trustData) == ERROR_SUCCESS;
}
關鍵攔截點:
- LoadLibraryExW
- LdrLoadDll
- NtMapViewOfSection
MinHook實現示例:
typedef NTSTATUS(NTAPI* pLdrLoadDll)(PWCHAR, ULONG, PUNICODE_STRING, PHANDLE);
pLdrLoadDll originalLdrLoadDll;
NTSTATUS HookedLdrLoadDll(PWCHAR PathToFile, ULONG Flags, PUNICODE_STRING ModuleFileName, PHANDLE ModuleHandle) {
if(IsMaliciousDll(ModuleFileName->Buffer)) {
return STATUS_ACCESS_DENIED;
}
return originalLdrLoadDll(PathToFile, Flags, ModuleFileName, ModuleHandle);
}
MH_Initialize();
MH_CreateHook(&LdrLoadDll, &HookedLdrLoadDll, reinterpret_cast<LPVOID*>(&originalLdrLoadDll));
MH_EnableHook(MH_ALL_HOOKS);
配置DLL加載事件捕獲:
<!-- eventman.manifest -->
<provider name="Microsoft-Windows-Kernel-Process"
guid="{22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716}">
<events>
<event value="10" symbol="DllLoad" level="win:Informational"/>
</events>
</provider>
軟件限制策略
→ 路徑規則禁止%Temp%\*.dll
受控文件夾訪問
(CFA)保護關鍵目錄遠程線程創建
:
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\MitigationOptions]
"MitigationOptions_FontBocking"=hex:10000000000010000000000000001
WFP過濾器示例:
FWPM_FILTER_CONDITION cond[1] = {
{ FIELD_ALE_APP_ID, FWP_MATCH_EQUAL, { .byteBlob = &targetAppBlob }}
};
FwpmFilterAdd0(engine, &filter, NULL, NULL);
檢測階段:
tasklist /m <dllname>
定位加載進程清除階段:
:: 強制卸載DLL
handle64.exe -p <PID> -a <DLL基址> -f
溯源分析:
防御DLL注入需要縱深防御體系: 1. 開發階段集成安全SDLC 2. 部署時啟用所有內存保護機制 3. 運行時實施最小權限原則 4. 持續監控異常模塊加載行為
通過組合技術手段與管理措施,可有效降低惡意注入風險。建議定期進行紅隊對抗測試驗證防護有效性。
擴展閱讀:
- 《Windows Internals》第七版
- MITRE ATT&CK T1055
- OWASP DLL Injection Defense Cheat Sheet “`
該文檔包含以下技術要點: 1. 覆蓋從用戶態到內核態的完整防護鏈條 2. 提供可直接集成的代碼片段 3. 包含注冊表/組策略等系統配置建議 4. 強調檢測與響應并重的理念 5. 引用權威技術參考資料
可根據實際需求調整技術細節深度,建議在實施前進行充分測試驗證兼容性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。