Skip to content

Codex - #11

Merged
Anfyya merged 32 commits into
mainfrom
codex
Jul 23, 2026
Merged

Anfyya merged 32 commits into
mainfrom
codex

Conversation

@Anfyya

@Anfyya Anfyya commented Jul 23, 2026

Copy link
Copy Markdown
Owner

No description provided.

yjln233 and others added 30 commits July 19, 2026 20:19
…Zydis

按语义/架构从实际活跃性导出安全寄存器池(而非共享全局池),把这五个
push/pop 家族语义的 core 编码从手写字节改为 ZydisEncoderRequest:

- PUSH_FLAGS/PUSH_IMAGE_BASE 复用同一个 keyed 上下文地址加载辅助层,
  address 角色在 x64 R8/R9/R10/R11、x86 ECX/EDX 间轮转。
- PUSH_IP 的 vip/bytecodeBegin 差值计算在 x64 7 个、x86 3 个寄存器间
  轮转 value/source 角色,采用 DUP 已验证的“搬入/搬出”模式。
- PUSH_VREG/PUSH_IMM 的按位提取/掩码组合各自导出独立 scratch 池
  (x64 4/3 套,x86 1/2 套,PUSH_VREG x86 按活跃性证据只有一个真实
  计划,如实标注不编造多样性)。

迁移中发现并修复一个真实 bug:PUSH_IP 的搬入/搬出在 value/source 角色
与 RAX/RDX 固定边界发生二元置换环时,两条顺序 MOV 会互相破坏对方尚未
读取的原始值;改用 XCHG 处理这一具体情形,仅在 Win32 真实执行门禁
(TestHostContextEntryExecution)中才会触发,x64 六元素池此前碰巧未
覆盖该组合。

POP_VREG 评估后未迁移:两种架构上两种 K 都同时占满了全部易失寄存器
(value/CL 计数/地址 scratch/writeAll 标志/宽度 mask/vreg 索引/取反
mask 临时值),没有安全寄存器池。实现并本地验证了一版寄存器无多样性
的 Zydis 重编码,但它把正式 per-build 相似度门禁的 core_variant 单点
Dice 相似度推到 0.69~0.72,超过不可放宽的 0.65 硬上限,因此保留原
手写实现,问题记录进 docs/zydis_encoder_pilot.md 留给未来批次。

本地验证:x64/Win32 Release 均以 /W4 /WX 编译通过;静态门禁 54/54;
新增 TestZydisPushPopFamilyRegisterDiversity 测试逐语义/架构核验最小
寄存器多样性;x64 ctest 14/14、Win32 ctest 13/14 全部通过(唯一例外
是 vm_native_differential 命中本机瞬时负载下的 120 秒 ctest 属性余量,
直接运行同一可执行文件在约 150 秒内以退出码 0 通过、日志无 FAIL,
与本批语义无关,留给 CI 做最终确认);两种架构的正式
vm_per_build_similarity_gate 全部通过,四个组合的 business_core/
core_variant/codec 均低于硬上限。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
commit 027ee53 对应 GitHub Actions run 29706361374 最终为 success:
static-gate、build-and-test (x64)、build-and-test (Win32) 三个 job
全部通过,耗时 361 秒。Win32 job 里 vm_native_differential 在 CI 环境
稳定通过,印证本机此前遇到的 120 秒 ctest 属性余量问题确实是本机
瞬时负载导致,不是代码回归。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
按语义/架构从实际活跃性导出安全寄存器池,把这五个语义的 core 编码从
手写字节改为 ZydisEncoderRequest:

- SWAP 的两值交换复用 PUSH_IP 的搬入/搬出模式,新增通用二元并行搬运
  原语 MoveRegisterPair,一次性覆盖全部寄存器重叠情形(含完全置换环),
  取代批次 7 中只处理了搬入方向的三分支特判。
- SMUL_WIDE/UDIV_WIDE/IDIV_WIDE 复用独立批次 2(x86 UMUL_WIDE K=1)的
  方法:显式乘数/除数在寄存器直接形式与 seed-split 地址的内存形式之间
  选择,RDX:RAX/EDX:EAX 硬件隐式 pair 保持不变。为避免两个 K 同时选中
  寄存器直接形式导致字节相同,改为让 seed 只让其中一个 K 使用寄存器
  直接形式;为避免寄存器直接形式本身跨 build 字节不变,给它套上一对
  自抵消的 keyed XOR 注入 per-build 立即数。
- INT3 是零操作数指令,无寄存器可随机化,只迁移编码本身。

隔离原生 CPU 差分覆盖同步扩展:SMUL_WIDE 接入 test_vm_native_differential
已有的动态 provider-seed 覆盖机制(此前 migratedSemanticCount 为 0,
未被实际覆盖);UDIV_WIDE/IDIV_WIDE 的 #DE 差分测试从单一固定 seed
改为按语义、按 K 动态选择覆盖寄存器直接与内存两种形式的 provider seed,
避免只巧合测到其中一种形式。SWAP 沿用批次 6 对 ROT 的证据边界结论:
没有生产 translator 入口,只用 host-arch 双策略真实执行验证,不构造
隔离原生差分。

本地验证:x64/Win32 Release 均以 /W4 /WX 编译通过;静态门禁 54/54;
x64 ctest 14/14、Win32 ctest 13/14 全部通过(唯一例外是 Win32
vm_native_differential 命中本机瞬时负载下的 120 秒 ctest 属性余量,
直接运行同一可执行文件在约 112 秒内以退出码 0、15/15 PASS 通过,与
批次 7 记录的同一类本地余量问题性质相同);两种架构的正式
vm_per_build_similarity_gate 全部通过。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
PUSH_CONDITION 涉及标志位读取(core 前有真实的 flag materializer 调
用),按第二类的审查强度处理:X64EvaluateCondition/X86EvaluateCondition
(既有、未触碰的条件分发基础设施)已把分支条件求值为固定 RAX/EAX 边
界里干净的 0/1,本批 core 只对这个已求好的布尔值做 keyed 加/减 +
CMP + SETcc 恒等变换,不重新读取或计算任何 flags。活跃性契约与既有
的通用回退池完全吻合(x64 RAX/RCX/RDX/R8/R9/R10/R11,x86
EAX/ECX/EDX),因此没有新增专属的 DeriveVariantRegisters 分支。

x86 一侧是本批唯一的行为性变化:原实现的两个 K 分支(AND eax,1 /
TEST+SETNE)不含任何随 build 变化的字节,迁移后与 x64 共用同一个
keyed 恒等式,x86 也获得了此前完全没有的 per-build 立即数多样性。

迁移中复现了批次 3C 已知的一类坑:strategy=1 分支的 CMP 立即数
(1u-key) 是有意的 uint32_t 回绕,直接交给不做位宽处理的
EmitZydisBinaryImmediate 在 x64 上会被隐式零扩展成正数,导致 Zydis
认为需要更宽的立即数编码而拒绝请求;改用先显式做 32 位符号扩展、再
交给 EmitZydisSizedBinaryImmediate 的方式修复。

本地验证:x64/Win32 Release 均以 /W4 /WX 编译通过;静态门禁 54/54;
新增 TestZydisPushConditionRegisterDiversity 测试(x86 3 套、x64 7 套
真实 assignment);x64 ctest 14/14、Win32 ctest 14/14(vm_native_
differential 因本机持续高负载分两次单独运行验证,均通过)全部通过;
两种架构的正式 vm_per_build_similarity_gate 全部通过。第一类 12 个
语义中 11 个已完成迁移,POP_VREG 按批次 7 的结论继续留给独立批次。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
将 FLAGS_MATERIALIZE、FLAGS_PACK_AH、FLAGS_UNPACK_AH 的 x86/x64 business core 迁移到 fail-closed ZydisEncoderRequest 唯一路径,并按语义、架构分别建立真实寄存器活跃性契约。

新增固定寄存器字节与 decode signature 回归,使用生产 translator 的 LAHF/SAHF/RET 链注册独立多 seed native differential hard-gate;更新批次 10 文档,累计进度 42/54。

验证:x64 Release CTest 15/15;Win32 新 flags hard-gate 与其余 14/14 通过,旧 native wrapper 直接运行 124.4 秒全部通过但 CTest 固定 120 秒超时;双架构 static gate 54/54、真实 per-build similarity gate 均通过。未 push。
补回 POP_VREG,并迁移 BRANCH、BRANCH_IF、CALL_VM、RET 的 x64/Win32 business core。新增逐语义活跃性契约、四形式/寄存器 decode signature、固定计划字节回归和生产 translator 多 seed native differential;保持 54/54 静态覆盖与原 similarity 阈值。
将 SELECT 的 x64/Win32 business core 迁移到 fail-closed Zydis Encoder 单轨路径,并从真实 wrapper 入口导出专属寄存器活跃性合同。新增完整 K/assignment decode signature、固定旧计划字节回归和生产 CMOV taken/not-taken 多 seed native differential;保持 54/54 静态覆盖及原 similarity 阈值。
审计上一轮中断的 CALL_HOST 半成品(resolver 已迁移 Zydis,但异常清理、PE
元数据接入、真实执行证据均缺失),未采信提交注释,逐条核对共享 frame
plan、真实 prolog/epilog、栈对齐与 8 个异常窗口的 phase/armed 状态转换。

发现并修复两处真实正确性缺陷:
- x64 UHANDLER 恢复 host FXSAVE/XSAVE 后只清 CONTEXT_XSTATE,未强制置位
  CONTEXT_FLOATING_POINT,可能导致 RtlRestoreContext 不采用已恢复的
  host FltSave。
- 新 UHANDLER thunk 对 XRSTOR 误用了 FXRSTOR 的 512 字节 Zydis 操作数宽度,
  Encoder 运行期拒绝编码;探针验证 XRSTOR 真实宽度是 576 字节(含 64
  字节 XSAVE header),FXRSTOR 保持 512。

补齐此前完全缺失的闭环点:
- x64 CALL_HOST UNW_FLAG_UHANDLER cleanup thunk 的 offset→最终 PE RVA
  一次性 patch,接入 vm_runtime_builder。
- 新增 PEEmitter::RebuildSafeSEHHandlerTable:原 PE 无 SafeSEH 时严格
  no-op 不伪造契约,声明 NO_SEH 时 fail-closed,有合法表时排序去重合并,
  x64 image 直接拒绝;capability_checker 新增构建前 NO_SEH 预检;
  VMHandlerSynthesizer::Validate 补齐 x86 safeSehHandlerOffsets 一致性
  校验。

新增四类真实执行证据(tests/test_vm_handler_synthesis.cpp、
tests/test_pe_hardening.cpp):CALL_HOST resolver 全 seed×variant 穷举、
host/guest x87/MXCSR/XMM 状态差分证据、x64 真实硬件异常
(EXCEPTION_ACCESS_VIOLATION)展开证据、SafeSEH 表合并的独立重新解析
验证,x64/Win32 均真实通过,非仅编译通过。

已知缺口如实记录在文档中:Win32 真实异常展开证据未实现(进程内
LoadedSynthImage 技术对 x86 SEH 架构性不成立,需要真实打包 PE 作为独立
进程运行);x64 PE 元数据证据未做独立于 PEParser 自身之外的第二条
.pdata 解码路径;未覆盖 XSAVE/AVX 路径;BRIDGE_EXTENDED 完全未动。不
采信任务交接时未经核实的"53/54"说法,实测静态门禁 54/54 是与迁移计数
无关的既有指标,本批不给出单一迁移进度数字。

x64/Win32 Release 全量 /W4 /WX 重新构建零警告零错误;静态门禁 PASS;
两架构完整 18 个 CTest 用例真实全部通过(vm_native_differential 直接
运行验证,未修改既有 120 秒 wrapper 属性);正式 vm_per_build_similarity_gate
四组均 PASS,全部既有阈值/ceiling/corpus/timeout 未修改。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
BRIDGE_EXTENDED 由三条独立代码路径组成:(1) EmitX64/86BridgeExtended 在
handler 内部把全部 16/8 个 GPR family 经 CtxRegisterMap 搬进栈上
VM_INSTRUCTION_BRIDGE_STATE、间接调用、再搬回;(2) EmitBusinessCoreVariant
里计算 target=imageBase+decodedOperand 的一小段,此前仍调用最初试点阶段
遗留、专给 BRANCH 家族共用的手写 EmitKeyedAddSubCore;(3)
VMInstructionBridgeBuilder::Build 在打包期把真实抽取的原生指令拼进合成
PE、生成 thunk 并重建 .pdata/Guard CF 表,与前两点独立,且此前没有任何
测试触达。

第(1)点的 GPR 搬运循环:读取 CtxRegisterMap 的 MOVZX 与 x86 一处索引寻址
立即数写入原本手写 REX/ModRM,现改由 Zydis 生成;寄存器角色
(value/index/base)由 DeriveVariantRegisters 新增的显式 plan 表按 seed
选择(x64 7 组、x86 3 组)。两套遗留固定字节场景(GPR 搬运用
value=RAX,index=RCX,base=R11;target 解析用 value=RAX,source=RDX)共享
registerAssignment[1] 却期望不同,无法用单一自然轮转同时复现,因此用显式
plan 表让两套遗留形态各自独立可达。prolog/epilog(SUB/ADD RSP)与
rflags=0x202 常量写入保持手写:前者字节被 vm_kernel_static_gate.py 的
UNWIND_INFO 断言和验证器的规范字节比对锁死,后者是
arithmetic_flags_bridge_closure_gate 门禁的正向证据锚点,迁移都不会带来
收益反而会让既有门禁字面量匹配失效。

第(2)点直接把 BRIDGE_EXTENDED 分支切换到已被 BRANCH/BRANCH_IF/CALL_VM/
RET/CALL_HOST 使用的 EmitZydisControlTargetCore(不改动该函数本身);
BRIDGE_EXTENDED 是遗留 EmitKeyedAddSubCore 最后一个调用方,切换后该函数与
专属的 X64BinaryImmediate32 helper 变成死代码一并删除。

第(3)点审计后判定本批不迁移(隐藏寄存器由源指令决定、没有可安全引入的
多样性;该文件没有现成 Zydis 基础设施;这段代码从未被验证真的能跑通,应
先跑稳新增覆盖再谈重构),但新增了此前完全没有的真实单元测试
(TestInstructionBridgeBuilderX87Fabs),过程中发现并修复一个真实生产
缺陷:AlignUp 在 blob 为空时把"合法对齐到 0"和"溢出错误"都编码成返回值
0,导致 Build() 处理任何含 BRIDGE_EXTENDED 请求的输入都会在第一条请求上
以"thunk layout overflow"假失败——只要宿主程序出现任何需要抽取的
x87/SSE/AVX 指令,整条生产链路在打包期就会失败。修复为改用 UINT32_MAX
作错误哨兵,不改变任何非溢出输入的计算结果。

另新增 TestZydisBridgeExtendedRegisterDiversity,对两个架构各遍历全部
256 个 seed byte × 4 个 variant,验证 target 解析与 GPR 搬运两个阶段
发布的寄存器角色确实出现在真实反汇编字节里,两个业务 K 策略都被采样到。

已知缺口(不隐瞒):VMInstructionBridgeBuilder::Build 的 usesAvx=true
(XSAVE/XRSTOR)路径与 x86(BuildX86Thunk)路径仍未被专属测试覆盖;
BuildX64Thunk/BuildX86Thunk 的寄存器保存/恢复循环判定"可安全迁移但本批
不做"。均为主动判定记录,不是发现了做不到。

验证:x64/Win32 Release 全量 /W4 /WX 重新构建零警告;
vm_kernel_static_gate.py 真实双策略覆盖 54/54;两架构完整 18 个 CTest
用例真实通过(vm_native_differential 直接运行确认退出码 0,仅命中既有
wrapper TIMEOUT 120 已知限制);正式 vm_per_build_similarity_gate 四组
(x64/Win32 EXE/DLL)均 VM_PER_BUILD_SIMILARITY_GATE_PASS,聚合阈值/
ceiling/corpus/skip 规则/timeout 均未修改。详见
docs/zydis_encoder_pilot.md 独立批次 16 与 codex_change.log。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
审计 VMInstructionBridgeBuilder::Build/BuildX64Thunk/BuildX86Thunk 并在为其编写第一批真实执行级测试的过程中,
发现并修复五类此前完全没有测试覆盖的真实缺陷:Build() 不是事务性的(AppendSection 提交后任何后续失败都会
让 image/translations 停在半成品状态,现改为整体快照+回滚、bytecode 改写延迟到全部步骤成功后一次性提交);
x86 BuildX86Thunk 硬编码 kExtendedTemp=6(ESI) 在 hidden==6 时会静默覆盖 state 指针;两架构恢复 host 非易失
寄存器的最后一个循环在 hidden 是 kNonvolatile 非末位成员时会自我覆盖 state 指针;hiddenNativeRegister==4
(RSP/ESP) 与 instruction.length 越界此前未被拒绝;RVA/offset/size 运算补上 CheckedAddU32/CheckedSizeToU32。

tests/test_vm_handler_synthesis.cpp 新增四组测试,全部通过真实 BRIDGE_EXTENDED handler 间接调用真实
VMInstructionBridgeBuilder::Build 产出并 VirtualAlloc 加载的 thunk(不是 C++ 代替品):x87/SSE 桥接
(验证上述寄存器缺陷修复)、真实 CPUID/XCR0 门控的 AVX/XSAVE 256 位往返、BRIDGE_EXTENDED 与普通 handler/
CALL_HOST 的连续执行链路(确认 hostExtendedState/hostExtendedStorage 确实不需要)、以及 Win32 真实 PE +
Windows loader 独立进程异常展开验证(手写无 CRT 最小 EXE,CreateProcess 运行,GetExitCodeProcess 确认
EXCEPTION_ACCESS_VIOLATION 被正确上报)。tests/test_pe_hardening.cpp 新增四个负向测试,证明 Build() 失败时
image 字节与 translations 字段级完全不变。x64 进程内"故障发生在 RSP 已切换到 guest 栈窗口内"未做到(两次
真实尝试均导致测试进程被不可恢复终止),诚实记录为已知缺口。

x64/Win32 Release /W4 /WX 全量构建零警告;两架构完整 18 个 CTest 用例全部真实通过(vm_native_differential/
vm_kernel_static_gate 的 ctest 内嵌已知限制按既有方式直接确认);vm_kernel_static_gate 54/54;四组
vm_per_build_similarity_gate 全部 PASS,阈值/corpus/timeout 均未修改。详见 docs/zydis_encoder_pilot.md
独立批次 17 与 codex_change.log。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…n 与指令操作数冲突

外部复查指出批次 17 的 AVX 执行测试手填了一个恰好安全的 hidden 寄存器(ECX/R10),
绕开了真实 Translator 会选中 EDX/EAX 时命中的缺陷。核实后确认两处真实生产缺陷并修复:

1. BuildX64Thunk/BuildX86Thunk 的 usesAvx 分支执行 XRSTOR/XSAVE 前用
   MovEax(7)/XorEdx() 设置 ISA 规定的隐式掩码寄存器,若 hidden 恰好是 EAX/EDX
   会摧毁这个仍在用作 state 指针的活寄存器。修复为仅在 hidden 属于这两个寄存器时
   用真实 push/pop 包裹该序列。

2. VMInstructionBridgeBuilder::Build 此前只靠 Translator 自律保证 hidden 不与
   被桥接指令的操作数冲突,自身没有独立校验。新增 fail-closed 检查。

同时把 hidden 寄存器选择逻辑从 LowerExtendedBridge 抽成
Translator::SelectBridgeHiddenRegister 静态方法,AVX 测试改为调用真实生产逻辑
而不是手填值——在 Win32 上用真实选出的 hidden=EDX 复现并验证了缺陷 1 的修复。

x64/Win32 两套 Release 全量重建零警告;两个架构 ctest 17/18 通过(唯一例外是
vm_native_differential 既有 TIMEOUT 120 属性,直接运行确认真实退出码 0);
静态门禁本机确认 54/54。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
第二轮独立复查确认批次 18 的 EDX/EAX hidden + XSAVE 修复没有引入新问题,
但指出两项新问题并已修复:

1. VMInstructionBridgeBuilder::Build 完全信任调用方传入的 usesAvx/usesX87,
   没有和 request.instruction 的真实指令类别做一致性校验。thunk 完全按这两个
   布尔值决定走 FXSAVE/FXRSTOR 还是 XSAVE/XRSTOR,与批次 18 的
   "hidden 与操作数冲突"是同一类"Builder 必须自己 fail-closed"问题。
   把 LowerExtendedBridge 里推导 x87/avx 的逻辑抽成
   Translator::ClassifyBridgeExtendedState 静态方法,Build() 用它独立校验
   调用方传入值是否与指令真实类别一致,不一致即拒绝。

2. 批次 18 新增的"hidden 与原生指令操作数冲突"校验此前没有专门的负向测试
   真正撞过它。新增 TestInstructionBridgeBuilderRejectsHiddenAliasingOperand
   (MOV EAX,[ECX] 分别撞寄存器操作数与内存 base)与
   TestInstructionBridgeBuilderRejectsMismatchedExtendedStateClass。

x64/Win32 两套 Release 全量重建零警告;两个架构 ctest 均 17/18(唯一例外仍是
vm_native_differential 既有 TIMEOUT 120)。Win32 首次与 x64 并发跑时
vm_handler_synthesis 意外失败,单独重跑立即通过,判定为资源争抢导致的偶发问题,
不与其他构建并发单独重跑完整 Win32 套件复核确认非回归。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
批次 19(3831388)push 后 Win32 CI 红:vm_handler_synthesis 里
TestBridgeThunkRealPeLoaderException 的故障用例最终退出码是 0xC0000029
(STATUS_INVALID_DISPOSITION),不是预期的 0xC0000005(EXCEPTION_ACCESS_VIOLATION)。
本机两次单独运行同一提交都干净通过,只在 GitHub Win32 runner 上复现。

根因:guest ESP(BuildX86Thunk 执行被抽取指令前切换到的值)此前指向 fixture
自己 .data 段里一块普通 4KB 缓冲区,不是被 TEB StackBase/StackLimit 覆盖、
带 guard page 的真实 OS 线程栈。故障发生时 KiUserExceptionDispatcher 本身
要用当前 ESP 在栈上搭建临时帧,ESP 指向非真实栈会让这套机制自身行为在不同
Windows 版本/安全配置下不可预期——这是本机与 CI runner 结果不一致的真正原因,
不是栈缓冲区不够大。另外原本只看最终退出码,这本身是"没有处理器时 Windows
如何收尾一个异常栈环境"的产物,不是故障本身的直接证据。

修复(只改 tests/test_vm_handler_synthesis.cpp,vm_instruction_bridge_builder.cpp
未改动一行):

1. guest ESP 改为 harness 运行时读取真实当前 ESP 减去安全余量,不再用
   .data 里的假栈。
2. CreateProcess 改用 DEBUG_ONLY_THIS_PROCESS,测试自己当调试器,
   WaitForDebugEvent 捕获 first-chance EXCEPTION_DEBUG_EVENT,核对
   ExceptionCode/ExceptionAddress(用 Builder 自己报告的 nativeInstructionRVA
   推出,不猜测)/寄存器现场/ExceptionInformation,不再依赖最终退出码。

过程中发现并跳过了 Windows 调试协议自身的 loader breakpoint(DEBUG_ONLY_
THIS_PROCESS 附加后 ntdll 在入口点执行前先抛的 EXCEPTION_BREAKPOINT),
避免误判成 harness 自己的故障。

本机验证:Win32 Release 零警告重建,单独运行 exit 0,真实捕获现场
ESP=0x19ef78(真实线程栈地址,远高于镜像 0x400000 区间);单独完整跑 Win32
ctest 17/18(唯一例外是 vm_native_differential 既有 TIMEOUT 120)。GitHub
runner 上能否复现 STATUS_INVALID_DISPOSITION 本机无法验证,最终要看 CI。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
yjln233 and others added 2 commits July 23, 2026 18:21
…cryptor.cpp/string_encryptor.cpp/vm_section_emitter.cpp 这 4 处早就是正确写法(#ifdef _WIN32 用 BCryptGenRandom,#else 用 std::random_device 兜底),只有我在 4.2 节改的 signature_eliminator.cpp 漏掉了这套隔离,只加了 Windows 分支就完事了。

已按另外 4 处已经验证过的写法原样复制修好:

#include <bcrypt.h> 改成 #ifdef _WIN32 / #include <bcrypt.h> + pragma / #else / #include <random> / #endif
GenerateRandomName 内部生成熵那一步,#else 分支改用 std::random_device 填充同一个 entropy 缓冲区(构造失败 try/catch 后 return false),后面字符集映射和签名自检逻辑不变
Windows 侧编译验证过(ciphershell_packer/ciphershell.exe 零警告零错误,test_fail_closed.exe 退出码 0)。如实说明一点:这次会话环境是原生 Windows,没有 WSL 或交叉编译工具链,没法在本次会话里实际跑一遍 build_linux 端到端复现"之前编译失败、现在编译成功"——这个修复是逐字符比对另外 4 个已经在用的同类实现得出的,不是猜测,但建议你自己在 Linux/WSL 环境里跑一次确认。
…未同步默认值改动

- 删除零调用点的 stub/stage1/runtime_stub.cpp(自身有真实缺陷:滚动 XOR
  只用了密钥的 1/8,StubData 偏移硬编码,无 IAT 前提下却调用需要导入表的
  WinAPI),stub/CMakeLists.txt 同步移除该源文件。
- 修复上一轮改动引入的真实 CI 回归:tests/samples/vm_similarity_gate_sample.toml
  和 config/full_example.toml 里 [anti_debug]/[anti_dump] 仍是旧的全 true,
  导致 vm_per_build_similarity_gate 测试被新加的 fail-closed 拒绝逻辑挡住。
  改为 false 与 config/default.toml 对齐,本地重跑该测试确认通过(435.54s)。
- 审计报告同步记录本轮修复与 CI 排查结论。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Anfyya
Anfyya merged commit b4ff6bc into main Jul 23, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants