取消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. 效果验证

  1. 使用Process Hacker查看:
    • 子进程和父进程都显示"Microsoft only"策略已启用
    • 父进程中仍存在aswhook.dll(因为策略设置较晚)
    • 子进程中不存在aswhook.dll(策略在创建时即生效)

5. 关键点总结

  1. 时机很重要:必须在进程创建时设置策略才能有效阻止EDR注入
  2. 子进程策略:通过CreateProcessAPROC_THREAD_ATTRIBUTE_MITIGATION_POLICY在创建时设置
  3. 签名限制:只允许Microsoft签名的DLL注入
  4. 实际应用:可用于保护loader或恶意二进制程序不被EDR监控

6. 参考资源

取消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 结构 此结构用于设置进程的映像加载缓解策略,基于映像签名: 关键标志位: MicrosoftSignedOnly (0x1):仅允许加载Microsoft签名的映像 StoreSignedOnly (0x1):仅允许加载Windows应用商店签名的映像 MitigationOptIn (0x1):仅允许加载Microsoft、Windows应用商店和WHQL签名的映像 3. 防止EDR注入DLL的方法 3.1 基本方法(存在问题) 问题 :此方法在进程启动后设置策略,无法阻止EDR在进程初始化时的DLL注入(如Avast的aswhook.dll) 3.2 有效方法:创建子进程时设置策略 使用 CreateProcessA API创建子进程,并在创建时设置缓解策略: 3.3 完整实现方案 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文档关于进程缓解策略的相关内容