银狐黑产组织内存查杀技术

admin 2026-06-20 05:02:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文深度剖析银狐黑产组织采用的16大内存加载技术,涵盖DLL内存加载、远程线程注入、进程镂空、反射DLL注入等高阶手段,并详细阐述其实现原理、内存特征及对应的检测方法,为安全人员提供全面的内存查杀技术参考与实战指导。 综合评分: 88 文章分类: 恶意软件,内存查杀,红队,内网渗透,应急响应


cover_image

银狐黑产组织内存查杀技术

原创

pandazhengzheng pandazhengzheng

安全分析与研究

2026年6月18日 20:00 广东

在小说阅读器读本章

去阅读

深度剖析银狐黑产组织16大内存加载技术原理、实现细节与内存特征扫描检测方法


目录

  • 一、银狐内存加载技术全景
  • 二、DLL内存加载
  • 三、远程线程注入
  • 四、进程创建加载(Process Hollowing)
  • 五、线程创建加载
  • 六、白+黑加载(DLL侧载)
  • 七、内存映射加载
  • 八、反射DLL注入
  • 九、APC内存注入
  • 十、线程上下文设置(Thread Hijacking)
  • 十一、Callback内存执行
  • 十二、Module Stomping与DLL Phantom
  • 十三、ETW/AMSI内存Patch后执行
  • 十四、异常处理链注入(VEH/SEH)
  • 十五、纤程(Fiber)内存执行
  • 十六、DLL通知回调注入
  • 十七、NtCreateSection双进程注入
  • 十八、内存特征扫描检测技术
  • 十九、内存查杀实战工具与流程

一、银狐内存加载技术全景

银狐黑产组织在内存加载方面具备APT级全栈能力,从文件落地到纯内存驻留,覆盖16大技术路径

| 技术 | 文件落地 | PEB可见 | 调用栈外观 | 银狐使用频率 | 检测难度 | | — | — | — | — | — | — | | DLL内存加载 | 有 | 是 | 正常 | ★★★★★ | 中 | | 远程线程注入 | 无 | 否 | 异常(新线程) | ★★★★★ | 中 | | 进程创建加载 | 无 | 伪装合法 | 合法进程外观 | ★★★★ | 高 | | 线程创建加载 | 无 | 否 | 异常(新线程) | ★★★★ | 中 | | 白+黑加载 | 有(白+黑) | 是 | 正常(白程序) | ★★★★★ | 中高 | | 内存映射 | 无 | 否 | 取决于执行方式 | ★★★★ | 高 | | 反射DLL注入 | 无 | | 无模块记录 | ★★★★★ | 极高 | | APC注入 | 无 | 否 | 回调栈外观 | ★★★★ | 高 | | 线程上下文设置 | 无 | 否 | 劫持合法线程 | ★★★ | 极高 | | Callback内存执行 | 无 | 否 | 合法回调栈 | ★★★★ | 极高 | | Module Stomping | 无 | 伪装合法 | 合法模块外观 | ★★★ | 极高 | | ETW/AMSI Patch | 无 | 否 | 正常(检测已禁用) | ★★★★★ | 极高 | | 异常处理链注入 | 无 | 否 | 异常处理栈 | ★★★ | 极高 | | 纤程执行 | 无 | 否 | 纤程切换栈 | ★★★ | 极高 | | DLL通知回调注入 | 无 | 否 | Ldr通知栈 | ★★★ | 高 | | NtCreateSection双进程注入 | 无 | 否 | Section映射栈 | ★★★ | 极高 |


二、DLL内存加载

2.1 技术原理

DLL内存加载是银狐木马最基础也最常用的内存加载方式,通过LoadLibrary/LoadLibraryEx将DLL加载到进程地址空间,DLL的DllMain函数在加载时自动执行。

DLL内存加载流程:
  ① 调用LoadLibraryA("malicious.dll")
     → 操作系统执行:
       a) 映射DLL到进程地址空间(NtMapViewOfSection)
       b) 处理导入表(解析依赖DLL+API地址)
       c) 处理重定位表(修正地址引用)
       d) 调用DllMain(hModule, DLL_PROCESS_ATTACH, NULL)
  ② DllMain中执行恶意逻辑:
     → 创建线程执行核心功能(避免阻塞加载者)
     → 反沙箱检测 → 地域限制 → 解密Shellcode → C2回连
  ③ DLL加载后:
     → PEB.Ldr模块列表中新增条目
     → LDR_DATA_TABLE_ENTRY记录DLL路径/基址/大小
     → 可通过Module32First/Next枚举到

2.2 银狐实现细节

// 银狐木马DLL加载 - 通过白程序侧载触发
// 白程序(wps.exe)同目录放置恶意version.dll
// Windows DLL搜索顺序: 当前目录 → System32 → Path

// 恶意DLL DllMain入口
BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) {
    if (reason == DLL_PROCESS_ATTACH) {
        // 1. 加载原始DLL(保证白程序正常功能)
        hOrigDll = LoadLibraryA("original_version.dll");
        // 2. 新线程执行恶意逻辑(不阻塞白程序启动)
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MaliciousEntry, NULL, 0, NULL);
    }
    return TRUE;
}

2.3 内存特征与检测

| 内存特征 | 检测方法 | 检测工具 | 银狐绕过方式 | | — | — | — | — | | PEB模块列表新增DLL | Module32First/Next枚举 | Process Explorer | 正常加载无法绕过 | | LDR_DATA_TABLE_ENTRY | 遍历InLoadOrderModuleList | 自定义扫描器 | 正常加载无法绕过 | | DLL路径异常 | 检查非标准路径DLL | Sysmon Event 7 | 选择冷门但合法路径 | | 导出表转发特征 | 检测export指向original_xxx.dll | PE分析工具 | 转发命名随机化 | | 数字签名缺失 | 白程序有签名但DLL无签名 | sigcheck | 窃取合法签名 |


三、远程线程注入

3.1 技术原理

远程线程注入是银狐木马最经典的跨进程内存加载方式,在目标进程中分配内存、写入Shellcode、创建远程线程执行。

远程线程注入流程:
  ① OpenProcess → 获取目标进程句柄
     → 常见目标: explorer.exe / svchost.exe / 浏览器进程

  ② NtAllocateVirtualMemory(Indirect Syscall)
     → 在目标进程分配PAGE_EXECUTE_READWRITE内存
     → 基址由系统决定(baseAddr=NULL)

  ③ NtWriteVirtualMemory(Indirect Syscall)
     → 将Shellcode写入分配的内存区域
     → 写入大小=Shellcode长度

  ④ NtProtectVirtualMemory(Indirect Syscall)
     → 将内存属性从RWX改为PAGE_EXECUTE(不可读)
     → 防止内存扫描读取Shellcode明文

  ⑤ NtCreateThreadEx(Indirect Syscall)
     → 在目标进程创建远程线程
     → 线程起始地址=Shellcode基址
     → 线程立即开始执行

3.2 银狐实现细节(Indirect Syscall全链路)

// 银狐木马远程线程注入 - 全部使用Indirect Syscall绕过EDR Hook
NTSTATUS InjectShellcode(HANDLE hProcess, BYTE* shellcode, SIZE_T size) {
    PVOID baseAddr = NULL;
    SIZE_T regionSize = size;

    // Step 1: NtAllocateVirtualMemory (Indirect Syscall)
    // mov r10, rcx; mov eax, 0x18; jmp [ntdll!syscall;ret]
    IndirectSyscall(ssn_alloc, g_syscallRetAddr,
        hProcess, &baseAddr, 0, &regionSize,
        MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

    // Step 2: NtWriteVirtualMemory (Indirect Syscall)
    IndirectSyscall(ssn_write, g_syscallRetAddr,
        hProcess, baseAddr, shellcode, size, NULL);

    // Step 3: NtProtectVirtualMemory → PAGE_EXECUTE
    IndirectSyscall(ssn_protect, g_syscallRetAddr,
        hProcess, &protectBase, &protectSize,
        PAGE_EXECUTE, &oldProtect);

    // Step 4: NtCreateThreadEx (Indirect Syscall)
    IndirectSyscall(ssn_thread, g_syscallRetAddr,
        &hThread, THREAD_ALL_ACCESS, NULL,
        hProcess, baseAddr, NULL, FALSE, 0, 0, 0, NULL);

    return STATUS_SUCCESS;
}

3.3 内存特征与检测

| 内存特征 | 检测方法 | 检测工具 | 银狐绕过方式 | | — | — | — | — | | 跨进程内存分配 | 监控NtAllocateVirtualMemory跨进程调用 | EDR内核回调 | Indirect Syscall绕过用户态Hook | | 远程线程创建 | Sysmon Event 8检测 | Sysmon | NtCreateThreadEx Syscall | | 线程起始地址异常 | 检查线程StartAddress不在任何模块范围内 | Process Explorer | Shellcode基址不在模块范围 | | PAGE_EXECUTE内存 | 扫描仅有EXECUTE权限的内存区域 | PE-sieve/Volatility | 执行后擦除或改为RWX再执行 | | Unbacked可执行内存 | 可执行内存无对应磁盘文件 | HollowsHunter | 内存映射方式可部分绕过 |


四、进程创建加载(Process Hollowing)

4.1 技术原理

进程镂空(Process Hollowing)以挂起方式创建合法进程,替换其主模块内存为恶意PE,实现合法进程外观+恶意代码执行

Process Hollowing流程:
  ① CreateProcess(CREATE_SUSPENDED)
     → 以挂起状态创建合法进程(如svchost.exe)
     → 进程主模块已映射但未执行

  ② GetThreadContext → 获取挂起线程上下文
     → 从上下文中提取PEB地址
     → 从PEB中读取ImageBaseAddress(主模块基址)

  ③ NtUnmapViewOfSection(Indirect Syscall)
     → 取消映射原进程主模块内存
     → 释放原合法PE占用的地址空间

  ④ NtAllocateVirtualMemory + NtWriteVirtualMemory
     → 在原ImageBase处分配内存
     → 写入恶意PE头+各节区数据
     → 处理重定位表(修正地址引用)
     → 修复导入表(解析依赖DLL+API)

  ⑤ SetThreadContext → 修改线程上下文
     → 将RIP/EIP指向恶意PE的入口点

  ⑥ ResumeThread → 恢复线程执行
     → 线程从恶意PE入口点开始执行
     → 进程外观仍为合法svchost.exe

4.2 银狐实现细节

// 银狐木马Process Hollowing

`


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全分析与研究 pandazhengzheng pandazhengzheng《银狐黑产组织内存查杀技术》

评论:0   参与:  0