取消Avast挂钩Hook
字数 1197 2025-08-23 18:31:17
取消Avast挂钩Hook - 进程缓解策略防止第三方DLL注入
1. 背景知识
1.1 DEP (数据执行防护)
DEP (Data Execution Prevention) 是微软的一项安全缓解措施:
- 工作原理:将内存的某些区域标记为仅用于数据,不允许从这些区域执行代码
- 作用:防止攻击者从数据区域执行恶意代码
- 默认状态:Windows默认开启
- 查看方式:
- Windows安全中心 → 应用和浏览器控制 → 攻击防护设置
- 使用Process Hacker工具查看
1.2 ASLR (地址空间布局随机化)
ASLR (Address Space Layout Randomization) 是另一项安全措施:
- 工作原理:随机排列关键数据区域的位置(如可执行文件基址、堆栈、堆和库的位置)
- 作用:使攻击者难以预测内存布局,降低漏洞利用成功率
- 查看方式:
- Windows安全中心
- Process Hacker工具
2. PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY 结构
此结构用于设置进程的映像加载缓解策略,基于映像签名:
struct _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY {
union {
DWORD Flags;
struct {
DWORD MicrosoftSignedOnly : 1;
DWORD StoreSignedOnly : 1;
DWORD MitigationOptIn : 1;
DWORD AuditMicrosoftSignedOnly : 1;
DWORD AuditStoreSignedOnly : 1;
DWORD ReservedFlags : 27;
} DUMMYSTRUCTNAME;
};
};
关键标志位:
MicrosoftSignedOnly(0x1):仅允许加载Microsoft签名的映像StoreSignedOnly(0x1):仅允许加载Windows应用商店签名的映像MitigationOptIn(0x1):仅允许加载Microsoft、Windows应用商店和WHQL签名的映像
3. 防止EDR注入DLL的方法
3.1 基本方法(存在问题)
#include <iostream>
#include <Windows.h>
int main() {
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY ply = {0};
ply.StoreSignedOnly = false;
ply.MicrosoftSignedOnly = true;
if(SetProcessMitigationPolicy(ProcessSignaturePolicy, &ply, sizeof(ply))) {
printf("设置成功");
} else {
printf("设置失败");
}
getchar();
}
问题:此方法在进程启动后设置策略,无法阻止EDR在进程初始化时的DLL注入(如Avast的aswhook.dll)
3.2 有效方法:创建子进程时设置策略
使用CreateProcessA API创建子进程,并在创建时设置缓解策略:
void CreateChildProcessWithMitigationOption() {
PROCESS_INFORMATION pi = {};
STARTUPINFOEXA si = {};
SIZE_T attributeSize = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &attributeSize);
PPROC_THREAD_ATTRIBUTE_LIST attributes = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(
GetProcessHeap(), HEAP_ZERO_MEMORY, attributeSize);
InitializeProcThreadAttributeList(attributes, 1, 0, &attributeSize);
DWORD64 policy = PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON;
UpdateProcThreadAttribute(
attributes,
0,
PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY,
&policy,
sizeof(DWORD64),
NULL,
NULL);
si.lpAttributeList = attributes;
CreateProcessA(
NULL,
(LPSTR)"sss.exe", // 可替换为你的loader或恶意程序
NULL,
NULL,
TRUE,
EXTENDED_STARTUPINFO_PRESENT,
NULL,
NULL,
&si.StartupInfo,
&pi);
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, attributes);
return;
}
3.3 完整实现方案
void LocalProcessMitigationOption() {
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY poy = {0};
GetProcessMitigationPolicy(GetCurrentProcess(), ProcessSignaturePolicy, &poy, sizeof(poy));
poy.MicrosoftSignedOnly = true;
// 先创建子进程再设置当前进程策略
CreateChildProcessWithMitigationOption();
SetProcessMitigationPolicy(ProcessSignaturePolicy, &poy, sizeof(poy));
}
4. 效果验证
- 使用Process Hacker查看:
- 子进程和父进程都显示"Microsoft only"策略已启用
- 父进程中仍存在aswhook.dll(因为策略设置较晚)
- 子进程中不存在aswhook.dll(策略在创建时即生效)
5. 关键点总结
- 时机很重要:必须在进程创建时设置策略才能有效阻止EDR注入
- 子进程策略:通过
CreateProcessA和PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY在创建时设置 - 签名限制:只允许Microsoft签名的DLL注入
- 实际应用:可用于保护loader或恶意二进制程序不被EDR监控
6. 参考资源
- Preventing 3rd-party DLLs from injecting into your processes
- Microsoft文档关于进程缓解策略的相关内容