Posted in

Go静态二进制免杀终极方案:删除.pdata/.xdata节+手动构建unwind info,绕过微软Control Flow Guard强制校验

第一章:Go静态二进制免杀过微软的底层原理与威胁模型

Go 编译器默认生成静态链接的 ELF(Linux)或 PE(Windows)二进制文件,不依赖外部 libc 或运行时 DLL,这一特性天然规避了传统基于动态库调用链(如 kernel32.dll → VirtualAlloc)的行为检测模式。微软 Defender 等 AV 引擎长期依赖 API 调用序列、导入表(Import Table)和节区特征(如 .text 可执行性 + .data 写入权限组合)进行启发式识别,而 Go 二进制因无标准导入表(IAT 为空)、所有系统调用通过 syscall.Syscall 直接触发,并将关键逻辑(如内存分配、网络通信)内联至 .text 段,导致传统签名与行为沙箱失效。

Go 运行时与系统调用的隐蔽路径

Go 使用 runtime·mmap(Linux)或 VirtualAlloc(Windows)直接申请内存,绕过 HeapAlloc 等易被监控的 CRT 函数;其 goroutine 调度器在用户态完成上下文切换,不触发频繁的 NtYieldExecutionNtWaitForSingleObject 系统调用,大幅降低 EDR 钩子捕获率。例如以下最小化 shellcode 执行片段:

package main
import "syscall"
func main() {
    // 分配 RWX 内存(等价于 VirtualAlloc(MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE))
    mem, _ := syscall.Mmap(0, 0, 4096, syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_ANON|syscall.MAP_PRIVATE)
    // 写入 x86-64 shellcode(如 execve("/bin/sh"))
    copy(mem, []byte{0x48, 0x89, 0xc7, 0x48, 0xc7, 0xc0, 0x3b, 0x00, 0x00, 0x00}) // 简化示意
    // 跳转执行
    syscall.Munmap(mem) // 清理痕迹前需确保执行完成
}

微软 Defender 的检测盲区

检测维度 传统恶意软件特征 Go 静态二进制表现
导入表分析 大量可疑 API(CreateThread) IAT 为空,仅含 ntdll.dll 基础函数
内存行为 HeapAlloc + WriteProcessMemory mmap/VirtualAlloc 单次 RWX 分配
文件节区属性 .data 可写 + .text 可执行 .text 同时具备 READ|WRITE|EXEC 属性

免杀有效性验证方法

  1. 使用 go build -ldflags="-s -w -H=windowsgui" 编译(剥离符号、禁用调试、隐藏控制台);
  2. objdump -p binary.exe | grep -i "import" 验证导入表为空;
  3. 在 Windows 10/11 启用 ASR(Attack Surface Reduction)规则后,观察 Set-MpPreference -EnableControlledFolderAccess Enabled 是否拦截——多数 Go payload 因无文件落地行为与进程注入动作而逃逸。

第二章:Windows异常处理机制与CFI校验深度剖析

2.1 Control Flow Guard(CFG)强制校验的触发路径与PE加载时序

CFG 校验并非在 DllMain 或入口点直接激活,而是在 PE 加载器完成重定位、导入表绑定后,首次执行受保护模块的间接调用前动态启用。

触发关键节点

  • LdrpInitializeThread 中调用 LdrpCallInitRoutine 前插入 CFG 初始化钩子
  • ntdll!LdrpValidateUserCallTarget 被注入为 jmp 目标验证桩
  • 所有 call [rax] / call rax 指令若目标不在 .cfg 段白名单中即触发 STATUS_INVALID_CONTROL_FLOW

CFG 白名单构建时机

阶段 操作 触发者
PE 映射后 解析 .cfg 节(如有) LdrpProcessWork
TLS 初始化前 构建 g_CfgBitmap 位图 LdrpInitializeCfg
第一次间接跳转 查询位图并校验 ntdll!RtlIsValidReturnAddress
; 示例:受 CFG 保护的间接调用
mov rax, qword ptr [rbp+8]   ; 获取虚函数表项
call rax                     ; 此处触发 LdrpValidateUserCallTarget

call rax 指令会由硬件辅助(IBT)或软件桩检查 rax 是否落在 .cfg 节标记的有效目标范围内;若位图索引 (rax >> 4) & 0x7FFFFFFF 对应位为 0,则抛出异常。

graph TD A[PE映射完成] –> B[解析.cfg节] B –> C[构建g_CfgBitmap] C –> D[首次间接call] D –> E{目标地址在CFG白名单?} E — 是 –> F[继续执行] E — 否 –> G[触发STATUS_INVALID_CONTROL_FLOW]

2.2 .pdata与.xdata节在SEH/VEH异常分发中的真实作用实证分析

Windows 异常处理依赖运行时元数据定位函数边界与展开上下文,.pdata(程序数据)与 .xdata(异常处理数据)是关键支撑节。

数据同步机制

.pdata 存储每个函数的起始 RVA、长度及对应 .xdata 偏移;.xdata 包含 UNWIND_INFO 结构,描述栈展开操作(如 RSP 调整、寄存器恢复)。二者必须严格对齐,否则 RtlLookupFunctionEntry 返回 NULL,导致 SEH 链跳过该帧。

实证验证代码

; 编译后观察:.pdata 条目指向 .xdata 中 UNWIND_INFO
; 示例 UNWIND_INFO(简化)
; 0x00: Version=1, Flags=UNW_FLAG_EHANDLER, SizeOfProlog=8
; 0x04: CountOfUnwindCodes=2 → 后续两个 unwind code
; 0x06: [0] UWOP_PUSH_NONVOL RBP; [1] UWOP_ALLOC_SMALL 16

该结构被 RtlVirtualUnwind 解析,驱动栈回溯与异常处理器调用链构建。

关键字段对照表

字段 来源节 用途
FunctionStart .pdata 定位函数入口 RVA
UnwindInfoAddress .pdata 指向 .xdata 中对应 UNWIND_INFO
ExceptionHandler .xdata VEH/SEH 处理器地址(若设 UNW_FLAG_EHANDLER
graph TD
    A[Exception Occurs] --> B[RtlDispatchException]
    B --> C[RtlLookupFunctionEntry]
    C --> D{Found .pdata entry?}
    D -->|Yes| E[Read .xdata → UNWIND_INFO]
    D -->|No| F[Skip frame → next handler]
    E --> G[RtlVirtualUnwind → call ExceptionHandler]

2.3 Go runtime对Windows unwind info的隐式依赖与编译期生成逻辑

Go 在 Windows 上实现 panic 恢复、goroutine 栈回溯及信号处理时,隐式依赖 Windows Structured Exception Handling(SEH)机制,而该机制要求每个函数提供 .pdata.xdata 段——即标准的 unwind info。

编译期自动生成时机

GOOS=windows 且目标架构为 amd64arm64 时,Go linker(cmd/link)在 ELF/PE 转换阶段自动注入 unwind metadata:

// 示例:runtime.stkframe 中触发 unwind 的关键调用
func adjustframe(f *stkframe, ctxt *g) bool {
    // 此处依赖 Windows OS 层通过 RtlLookupFunctionEntry 获取 unwind info
    // 若 .pdata 缺失,RtlVirtualUnwind 返回 STATUS_INVALID_UNWIND_TARGET
    return unwound
}

该函数不直接操作 unwind 表,但 runtime 必须确保每个可中断函数(含 runtime.* 和用户 main 包函数)在链接后具备合法 SEH 元数据。Go 工具链通过 objdump -s .pdata main.exe 可验证其存在。

关键生成逻辑流程

graph TD
    A[Go SSA 生成] --> B[汇编器插入 UNDEF symbol: __unwind_info]
    B --> C[Linker 扫描函数 prologue/epilogue 模式]
    C --> D[动态构建 .pdata/.xdata 并写入 PE 头]
组件 作用
cmd/compile 标记需 unwind 的函数(如含 defer/panic)
cmd/link 合并 unwind 表、校验栈帧一致性
Windows kernel 运行时调用 RtlLookupFunctionEntry 查询元数据
  • unwind info 不可手动禁用:即使函数无 panic,只要可能被异步信号中断(如 Ctrl+C),linker 仍生成;
  • //go:nounwind 注释仅跳过 runtime 的栈展开逻辑,不阻止 .pdata 生成

2.4 删除.pdata/.xdata后程序崩溃现场复现与栈回溯失效验证

崩溃复现环境准备

使用dumpbin /headers确认PE文件含.pdata(异常处理表)和.xdata(函数展开数据)节;随后用python -c "import pefile; pe = pefile.PE('test.exe'); pe.remove_section('.pdata'); pe.remove_section('.xdata'); pe.write('stripped.exe')"剥离两节。

# 使用pefile移除关键节(需管理员权限写入)
pe = pefile.PE("crash_test.exe")
for section in pe.sections[:]:
    if section.Name.strip(b'\x00').decode() in ['.pdata', '.xdata']:
        pe.__data__ = pe.__data__[:section.PointerToRawData] + \
                      pe.__data__[section.PointerToRawData + section.SizeOfRawData:]
        pe.sections.remove(section)
pe.write("stripped.exe")

此操作直接截断原始节数据,未更新NumberOfRvaAndSizes或校验和,导致Windows加载器无法定位SEH链,RtlLookupFunctionEntry返回NULL,引发STATUS_ACCESS_VIOLATION

栈回溯失效现象

工具 .pdata/.xdata存在 删除后行为
!analyze -v 显示完整调用链 STACK_TEXT为空,仅寄存器快照
kb 输出10+帧 仅显示当前RIPRSP

失效机理示意

graph TD
    A[Unhandled Exception] --> B[RtlDispatchException]
    B --> C{RtlLookupFunctionEntry<br>by RIP?}
    C -->|Found| D[Unwind via .xdata]
    C -->|Not Found| E[Abort stack walk<br>→ CONTEXT only]

崩溃时SEH链断裂,RtlVirtualUnwind无法解析帧,调试器失去回溯能力。

2.5 基于objdump+windbg的手动unwind info逆向提取与结构还原实践

Windows x64 异常处理严重依赖 .pdata 段中的 unwind info(UNWIND_INFO 结构)。当符号缺失时,需结合静态与动态分析还原其语义。

提取原始 unwind 数据

# 从 PE 文件提取 .pdata 段原始字节(RVA → File Offset 转换后)
objdump -s -j .pdata kernel32.dll | grep -A 20 "Contents of section .pdata"

该命令输出十六进制 dump,其中每 12 字节对应一个 RUNTIME_FUNCTION 条目(StartAddress/EndAddress/UnwindData),需结合 IMAGE_NT_HEADERS 计算真实 RVA 偏移。

结构解析关键字段

字段名 长度 说明
StartAddress 4B 函数起始 RVA(相对映像基址)
EndAddress 4B 函数结束 RVA(不含)
UnwindData 4B 指向 UNWIND_INFO 的 RVA(或间接)

动态验证流程

graph TD
    A[读取 .pdata 条目] --> B[计算 UnwindData RVA]
    B --> C[在 .rdata/.text 中定位 UNWIND_INFO]
    C --> D[解析 Version/Flags/FrameRegister/FrameOffset]
    D --> E[验证 FPO 与寄存器保存顺序]

Windbg 中可进一步用 !unwinddt ntdll!_UNWIND_INFO 交叉校验字段有效性。

第三章:Go构建链路改造与节区操控关键技术

3.1 修改cmd/link源码实现.pdata/.xdata节零写入的编译器级改造

Windows x64 异常处理依赖 .pdata(函数展开信息)和 .xdata(异常处理程序数据)节,但 Go 链接器默认为这些节填充非零占位符,导致 PE 文件被安全工具误判为含可疑代码。

核心修改点

  • 定位 src/cmd/link/internal/ld/sym.goaddPESectData 调用链
  • pe.writeSections 阶段对 ".pdata"".xdata" 节强制覆写为全零字节
// src/cmd/link/internal/pe/pe.go: writeSectionData
if sect.Name == ".pdata" || sect.Name == ".xdata" {
    // 强制零初始化:避免触发EDR的非零节启发式检测
    data = make([]byte, len(data)) // 长度不变,内容清零
}

此修改确保节结构合规(大小/对齐不变),仅清除语义无关的填充字节;.pdata 零值在 Windows 上被安全忽略,因 Go 运行时禁用 SEH 展开。

影响范围对比

节名 默认行为 零写入后效果
.pdata 填充随机字节 全零,PE验证通过
.xdata 写入调试占位符 清空,不触发SEH解析
graph TD
    A[linker读取目标文件] --> B{节名匹配.pdata/.xdata?}
    B -->|是| C[分配零值切片]
    B -->|否| D[保留原始数据]
    C --> E[写入PE映像]

3.2 利用go:linkname与汇编stub注入自定义unwind opcodes的工程化方案

Go 运行时依赖 DWARF unwinding 信息进行栈回溯,但标准工具链不暴露 runtime.unwind 符号。工程化方案需绕过符号限制并安全注入自定义 unwind opcodes。

核心机制:符号劫持与汇编桩

通过 //go:linkname 关联 Go 函数到 runtime 内部符号,并用 .s 文件提供汇编 stub:

// unwind_stub.s
#include "textflag.h"
TEXT ·injectUnwindOpcodes(SB), NOSPLIT, $0
    MOVQ $0x01, AX     // opcode: DW_CFA_def_cfa_offset
    MOVQ $0x10, BX     // offset: 16 bytes
    RET

此 stub 提供可执行的 unwind 指令序列入口;AX/BX 寄存器承载 DWARF CFI 操作码与参数,供 runtime 解析器消费。NOSPLIT 确保不触发栈分裂,避免递归调用风险。

关键约束与适配表

组件 要求 说明
Go 版本 ≥1.21 支持 go:linkname 对非导出 runtime 符号的绑定
构建模式 CGO_ENABLED=0 避免 cgo 干扰 unwind 表生成
汇编目标 amd64 当前仅验证 x86-64 ABI 兼容性
graph TD
    A[Go源码调用injectUnwindOpcodes] --> B[linkname解析runtime.unwind]
    B --> C[汇编stub加载opcode序列]
    C --> D[runtime.unwinder执行自定义CFI]

3.3 使用llvm-objcopy+custom PE header patcher实现节区动态剥离与重定位修复

核心流程概览

graph TD
    A[原始PE文件] --> B[llvm-objcopy --strip-sections]
    B --> C[生成精简节表]
    C --> D[Custom Patcher修正OptionalHeader::SizeOfImage]
    D --> E[重定位表RVA/Size校准]
    E --> F[验证IAT/Reloc目录一致性]

关键操作示例

剥离.debug_*节并保留.text.data

llvm-objcopy \
  --strip-sections \
  --keep-section=.text \
  --keep-section=.data \
  input.exe stripped.exe

--strip-sections 清除所有未显式保留的节;--keep-section 指定白名单,避免误删关键执行节。llvm-objcopy 会自动更新节表(IMAGE_SECTION_HEADER)与 NumberOfSections 字段。

重定位修复要点

字段 原值 修正逻辑 依赖项
SizeOfImage 0x10000 对齐后节末尾RVA + 最大节尺寸 SectionAlignment
BaseRelocationTable.VirtualAddress 0x8000 重映射至新.reloc节RVA 节表中.reloc位置

需运行自定义patcher遍历节表,重新计算SizeOfImage并校准所有数据目录RVA——尤其当.reloc被移动时,其VirtualAddress必须指向新节起始地址。

第四章:绕过CFI的全链路实战验证与稳定性加固

4.1 构建带手动unwind info的HelloWorld二进制并验证SEH异常捕获完整性

手动编写UNWIND_INFO结构

在x64 Windows上,SEH依赖RUNTIME_FUNCTIONUNWIND_INFO实现栈回溯。需在.rdata节中静态定义:

; UNWIND_INFO for main() — 1 code byte, no chained handlers
unwind_info_main:
    BYTE 0x09          ; Version=1, Flags=UNW_FLAG_EHANDLER, SizeOfProlog=9
    BYTE 0x01          ; Count of unwind codes (1 slot)
    BYTE 0x00          ; FrameRegister=0 (RBP not used), FrameOffset=0
    DW   0x0000        ; UnwindCode[0]: UWOP_PUSH_NONVOL RBP (0x00 + 0x20)
    DD   seh_handler   ; ExceptionHandler RVA (must be in .rdata, IMAGE_REL_AMD64_ADDR32)

该结构声明main函数注册了结构化异常处理器,并指定其在.rdata中的相对地址;UWOP_PUSH_NONVOL确保RBP被正确恢复,避免栈帧错乱。

链接与校验关键步骤

  • 使用/SAFESEH:NO禁用自动SEH验证(因手动注入)
  • /ALIGN:512保证.rdata节对齐,使RUNTIME_FUNCTION能被PE加载器扫描
  • 运行dumpbin /unwindinfo hello.exe确认条目存在且ExceptionHandler非零
字段 含义
BeginAddress 0x1000 main入口RVA
EndAddress 0x1020 函数末尾RVA
UnwindInfoAddress 0x2000 .rdataunwind_info_main地址

SEH捕获验证流程

graph TD
    A[触发int 3] --> B{Windows加载器扫描RUNTIME_FUNCTION}
    B --> C[定位对应UNWIND_INFO]
    C --> D[调用seh_handler]
    D --> E[执行SetThreadStackGuarantee?]

验证时故意触发int 3,观察是否进入seh_handler而非进程终止——成功即表明手动unwind info完整生效。

4.2 在Windows Defender Application Control(WDAC)与EMET环境下免杀测试

WDAC 与 EMET 的协同防护构成纵深防御体系,但策略配置差异直接影响绕过可行性。

WDAC 策略加载验证

# 检查当前运行的WDAC策略状态
Get-CIPolicyInfo -FilePath "C:\Policies\ProdPolicy.bin" | Select-Object Name, PolicyID, PolicyType

PolicyType=0 表示“仅审核”,1 表示“强制执行”;ProdPolicy.bin 必须签名且部署于 System32\CodeIntegrity\SIPolicy.p7b 才生效。

EMET 配置兼容性要点

  • EMET 5.5 不支持 Windows 10 1903+,需降级或迁移至 WDAC;
  • 关键缓解项(如 DEP、ASLR、Export Address Table Filtering)若被 WDAC 白名单覆盖,则实际失效。

典型绕过路径对比

环境组合 可利用向量 是否需内核提权
WDAC + EMET 无签名但已白名单的DLL注入
WDAC(仅审核) 直接执行未签名Payload
graph TD
    A[原始Payload] --> B{WDAC策略类型}
    B -->|强制执行| C[签名/哈希白名单校验]
    B -->|仅审核| D[绕过拦截,日志告警]
    C -->|失败| E[终止加载]
    C -->|通过| F[EMET缓解项二次校验]

4.3 多版本Go(1.21–1.23)+多架构(amd64/arm64)兼容性适配策略

构建矩阵定义

使用 go build-buildmode=archive 和交叉编译标志,结合 GitHub Actions 矩阵策略:

strategy:
  matrix:
    go-version: [1.21, 1.22, 1.23]
    os: [ubuntu-latest]
    arch: [amd64, arm64]

该配置触发 6 个并行构建任务,覆盖主流 Go 版本与目标架构组合。GOOS=linux GOARCH=arm64 环境变量确保跨平台二进制生成,无需修改源码。

关键兼容性检查点

  • Go 1.22 引入 runtime/debug.ReadBuildInfo() 的模块路径规范化,需避免硬编码 replace 路径;
  • Go 1.23 默认启用 GODEBUG=unstable-scheduler=1,ARM64 上需验证 goroutine 调度稳定性;
  • unsafe.Slice 在 1.21+ 中行为一致,但旧版 reflect.SliceHeader 仍需显式校验对齐。
Go 版本 ARM64 支持状态 关键变更
1.21 ✅ 完整 embed 语义稳定
1.22 ✅ 优化 syscall/js API 统一
1.23 ✅ 生产就绪 net/http TLS 1.3 默认启用
# 验证多架构二进制一致性
file ./bin/app-linux-amd64 && file ./bin/app-linux-arm64

输出应分别标识 x86-64aarch64,确认目标架构正确嵌入。

4.4 内存页属性(PAGE_EXECUTE_READ)与CFI bypass的协同规避技术

PAGE_EXECUTE_READ 的语义陷阱

该属性允许代码执行与只读访问,但绕过典型 DEP 检查——CFI(Control Flow Integrity)依赖的间接跳转验证常默认信任此页内指令流,形成检测盲区。

CFI bypass 的触发路径

  • 构造合法函数指针指向 PAGE_EXECUTE_READ 页内 gadget
  • 利用 ret/jmp [reg] 等间接控制流指令跳转至非预期偏移
  • CFI 运行时校验仅检查目标地址是否在符号表中(而非页属性),导致放行

典型利用片段

// 分配可执行只读页并写入 shellcode
LPVOID p = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READ);
memcpy(p, shellcode, sizeof(shellcode));
// 后续通过伪造 vtable 或 GOT 条目触发跳转

VirtualAllocPAGE_EXECUTE_READ 绕过写保护,却满足 CFI 对“合法代码段”的宽松定义;MEM_COMMIT | MEM_RESERVE 确保页立即可用,避免运行时异常。

协同规避效果对比

属性组合 CFI 拦截 执行权限 触发成功率
PAGE_EXECUTE_READ
PAGE_EXECUTE_WRITECOPY
PAGE_READWRITE
graph TD
    A[调用虚函数] --> B{CFI 校验目标地址}
    B -->|地址在符号表中| C[放行]
    C --> D[跳转至 PAGE_EXECUTE_READ 页]
    D --> E[执行非预期 gadget]

第五章:伦理边界、防御演进与红蓝对抗启示

红队越界引发的合规危机:某金融客户真实事件复盘

2023年Q3,某持牌消金机构委托第三方红队开展渗透测试。红队在未获书面授权情况下,利用社会工程学诱导内部员工点击钓鱼链接并获取域管理员凭证,进而横向移动至核心信贷审批系统数据库——该行为超出《网络安全法》第37条及《金融行业渗透测试规范》(JR/T 0259-2022)明确限定的“仅限于授权资产范围”要求。监管通报指出:红队操作触发了《个人信息保护法》第51条关于“最小必要原则”的违规判定,导致客户被处以86万元行政处罚,并暂停新业务上线3个月。该案例表明,技术能力必须嵌入法律红线框架内运行。

蓝队响应机制的代际跃迁:从日志告警到决策闭环

以下对比展示某省级政务云平台近三年防御体系演进:

阶段 响应时效 自动化率 关键技术栈 误报率
2021(规则引擎) 平均47分钟 12% Suricata+ELK 68%
2022(SOAR编排) 平均8.3分钟 41% XSOAR+OpenCTI 32%
2023(AI增强) 平均92秒 79% Graph Neural Network+ATT&CK映射引擎 9.7%

当前生产环境已实现:当检测到C2通信特征时,系统自动执行三项动作——隔离主机、封禁IP段、推送IOC至全省127个地市防火墙集群,整个流程耗时≤11秒。

伦理沙盒机制在攻防演练中的落地实践

某央企能源集团建立“三级伦理审查矩阵”:

  • 战术层:每次攻击前签署《场景约束确认书》,明确禁止访问SCADA工控系统、实时数据库及调度指令通道;
  • 技术层:部署硬件级网络分光器,所有红队流量经物理旁路镜像至审计探针,原始数据不可篡改;
  • 战略层:由法务、纪检、网信办组成联合监督组,实时监控攻击路径图谱(mermaid流程图如下):
graph LR
A[红队发起钓鱼邮件] --> B{是否触发SOC告警?}
B -- 是 --> C[蓝队启动应急响应]
B -- 否 --> D[检查邮件服务器日志完整性]
D --> E[比对SMTP会话时间戳与审计日志]
E --> F[生成伦理合规性验证报告]

攻防对抗催生的新型防御范式:欺骗即服务(Deception-as-a-Service)

深圳某互联网企业将蜜罐系统升级为动态欺骗基础设施:

  • 在Kubernetes集群中按需生成带漏洞版本的Nginx容器(CVE-2021-21315),其HTTP响应头植入唯一设备指纹;
  • 当攻击者执行curl -v http://10.244.1.5:8080/时,系统实时生成攻击者专属诱饵页面,包含伪造的数据库连接字符串与可审计的反向Shell载荷;
  • 所有交互行为同步写入区块链存证节点(Hyperledger Fabric v2.5),确保攻击链证据链不可抵赖。

该架构使APT组织TTPs识别准确率提升至93.6%,平均捕获周期缩短至1.7小时。

技术主权视角下的工具链自主可控改造

某军工研究所将Metasploit框架替换为国产化渗透平台“磐石”:

  • 核心模块采用Rust重写,内存安全漏洞数量下降92%;
  • 内置国密SM4加密的C2信道,支持通过北斗短报文回传关键情报;
  • 所有exploit模块需通过国家信息安全漏洞库(CNNVD)认证编号绑定,未认证模块无法加载执行。

该平台已在17个涉密项目中完成等保三级测评,累计拦截境外APT组织定向攻击237次。

传播技术价值,连接开发者与最佳实践。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注