# 实验性函数提升 `ig5_ir level=lift` 在独立的 Windows x64 分析进程中使用开源 [Mergen](https://github.com/NaC-L/Mergen),读取原始 AMD64 PE32+ 文件并生成函数 LLVM IR。目标文件不会作为程序执行,不读取或修改静态引擎数据库。先通过 `ig5_profile toolset=full` 展开既有40工具,无新增审批或执行旁路。 ```json {"target":"C:\\samples\\owned.exe","level":"lift","ea":"0x140001000","initial_flags":"0x200","lift_inline":["0x140001060"],"max_blocks":512} ``` `ea` 和可选 `lift_inline` 为原始文件的首选 VA,不能混入 RVA、ASLR 运行时地址或未映射/BSS地址。内联地址最多16个、必须非零且唯一,后端进一步拒绝导入目标;不猜测全部函数均可内联。`initial_flags` 必填,十六进制 `0x0..0xfff`,零不会被默认值覆盖;仅为显式低12位初始模型,不自动绑定录制,不声称完整架构 flags 语义。其他 GPR 参数保持符号输入。`max_blocks` 为1..4096,默认512;不用 `action`、`max_instructions` 或其他数据库/kernel/trace参数。 输入经稳定文件读取与 SHA-256 快照,两个解析器在禁止写入/删除的文件句柄持有期间读取同一 blob。原始文件没有应用重定位、运行时补丁或录制内存。与已有录制不一致时应保留该差异,不能将原生映像悄悄重建为新的原文件输入。 Windows Job 在 CreateProcess 时原子分配,主线程确认 Job 归属后才恢复;子进程环境不继承 API 密钥,固定分析 argv 无 shell 或任意工具路径。最多两个独立请求,每个只容纳一个分析子进程、2GiB OS 私有内存上限、最多50秒计算并预留5秒退出清理,整个请求不超过60秒。输出文件大小每20ms观察,单文件最多4MiB有界导入;这不是文件系统硬配额,超出部分保留在所属作业目录并明确不导入。取消通过私有当前 nonce 控制消息传递,等待实际退出确认。宿主只在 ACK 与 worker 真实退出均确认后释放容量;worker 异常退出而无 ACK 时保持未知与占用。 返回固定 `status=partial`、`recoveryStatus=unverified`、`businessAccepted=false`、`wholeBinaryVerified=false`、`nativeTargetExecuted=false`、`databaseModified=false`。`process` 只表示分析工具的运行状态。`diagnosticsSummary` 保留完整警告计数、受限预览和提升统计;IR预览有明确截断。`reportPath/reportSha256` 绑定完整不可变报告,`outputRefs` 绑定优化前后IR、诊断和日志。生成IR、零警告或 LLVM模块合法均不能替代业务函数的独立等价、返回与覆盖验收。 固定上游修订 `199805706ac00e156cc7e2a53ccc647c380f1786`,GPL-3.0-only。本地累计补丁覆盖相对/间接CALL、精确内联、空终结节点、load位宽、保守同块内存转发、带深度缓存、初始flags模型、控制目标域与未知写入后的内存失效边界。执行文件SHA `32806e249c5fdfa64d673c8fb403d6c3dd4ad6a51b5f19c9154b8d6f236fa0c6`;manifest pin在 `worker/lift_runtime.py` 和 `source/lift_jobs.js`。运行时保留许可证、21文件累计补丁、1115份程序/依赖源码及 inventory、LLVM许可和原样 Microsoft CRT来源。未分发挑战二进制;完整 LLVM源码与离线工具链尚未随包,此本地实验组件尚未发布,既有Release及供体清单不变。 候选内存地址的启发式枚举可能不完整。未获得独立完整性认证时,每个已知候选(包括首个)都要求地址相等,其他地址保留原始LOAD;不能将首候选值当成未知地址默认值。精确局部地址求值只沿已证明的同块存储转发与无特殊标记的整数运算,最多128次访问/16层,未知、poison/undef、溢出承诺及不支持的运算拒绝。完整245项默认/自定义微测试通过且启用flags检查;自产条件内存读取夹具旧版错误变为常量17,修复版保留读取,在显式字节内存模型中的完整返回值SSA通过全输入等价检查。此证明不覆盖LLVM函数内存属性、别名承诺或整个优化管线;启发式控制目标候选的完整性仍须独立核验。 控制目标启发式枚举与完整数值域分别判断。单/双目标快速路径必须覆盖独立有界数值域,且目标可映射;部分集合保留raw地址比较和未知默认分支。数值域分析最多128访问/16层/256候选与笛卡尔运算/256次同块存储扫描,缺失内存、循环、poison/undef或超限不认定完整。完整数值域仅约束该表达式,不能外推整函数语义。 诊断211表示控制目标集合不完整。IR中的 `__ig5_unresolved_control_*` 调用保留未知转移及未知结果,参数是原始目标表达式,不能作为业务返回值。预算封口使用 `__ig5_unlifted_block_*` 保留尚未提升的续程,其参数是分析块标识,不能解释为原生VA。opaque调用没有实际实现,不能直接将含此调用的模块当成可运行的恢复程序;保留其副作用和结果未知,避免以 `undef/unreachable` 使缺口在优化中消失。 本轮253项默认/自定义微测试通过,保留先前245项和原广义PHI表读取断言。三份自产PE覆盖部分单目标、部分双目标、完整双目标;对绑定的完整优化后SSA做12项UNSAT检查与4项SAT见证,既验证已知分支,也确认未知返回仍未恢复。Ultra在原512块预算内仍报503,尚未恢复业务;LLVM验证与缺口保留不能升级此结论。 维护回归:`npm run test:lift` 检查宿主管理和真实 Windows Job助手;`node scripts/test_lift_runtime.mjs <固定fixtures.json> <新产物目录> [unknown-memory-read.exe] [control-fixtures.json] [loop-fixtures-valid-unwind.json] [memory-alias-fixtures.json] [total-address-vm-fixtures.json]` 通过公开入口验证自产相对/间接CALL、flags及可选条件内存、控制目标域和未知写入夹具。全部选项共19次公开提升和2项负面预检。内存属性重新推导后,旧夹具的完整非内存契约/计算IR模块已核对一致,仅memory effects放宽或显式化默认未知,随后重新绑定完整模块摘要;没有用新摘要接受计算变化。仅分析工具与测试助手执行,夹具PE不执行。DSH配置模型的实际调用须另记;这些检查不等于VMP3.8/Ultra或Enigma业务恢复通过。 异常展开表中的函数入口标记不证明输入状态相同。Unflatten分支须走路径状态或已确认的循环合流,不能仅凭.pdata复用旧状态;普通入口/调用设置保持兼容。上一轮新增两项状态隔离/入口兼容检查后共255项微测试。两份自产三目标循环的旧版在RCX=1时错误返回47(应为32);修正后保留预算续程,不再给出错误常量,也尚未恢复该结果。18项完整SSA查询(6 SAT/12 UNSAT)及合法无序言展开记录的字节绑定验证此边界;不构成整函数副作用或保护器业务恢复证明。 多目标分支现在保存可证明的选择条件;条件只对纯函数输入/常量的整数Boolean依赖复用,PHI、内存读取、调用、freeze、poison/undef和特殊溢出承诺拒绝。派生和匹配各128访问/16层,匹配最多64条已存条件;raw目标别名共用队列,条件取交集,父/默认状态恢复。原512块/求解/进程限制不增加。 先前261项具名微测试逐项匹配235个custom注册、2 KnownBits和24固定oracle;校验过的循环PHI负例、特殊标记/深度/数量边界与未知臂均保留。两份自产16轮循环由425尝试块降至147,零警告/错误,在完整uint64 RCX域返回16/32/48的SSA等价已证明;IR仍含opaque默认分支,其守卫单独UNSAT。19项查询含14 UNSAT/5 SAT见证,证明仅限返回SSA和局部选择/别名关系,不认证LLVM内存属性、别名及全优化管线。该次Ultra为2451条指令且预算503,业务未过。 未知地址写入或未跟踪的批量复制会触发诊断411:本次提升后续不再用原文件或旧buffer替换数据读取,路径恢复不复活旧缓存;优化阶段的映像读取折叠也关闭。同块精确、完整且无中间别名写入的存储仍可转发。该处理偏保守,可能降低其他路径的精度;不能关闭警告或恢复旧表常量来获得更多候选。批量复制保留LLVM memcpy契约,不宣传任意重叠REP、OS、并发或自修改代码已建模。 普通x64数据读写使用align1,避免把有效的未对齐地址变成LLVM未定义行为。伪内存提升改变指针归属后,重新推导函数memory effects,避免沿用旧argmem限定。上一轮266项具名检查匹配240 custom+2 KnownBits+24 oracle;新增4项在修复前失败,后续精确覆盖正例保持。两份自产RW夹具的完整返回SSA与数据写入在显式初始单元字节条件下,对全部64位RCX/RDX通过14项查询(10 UNSAT/4 SAT);间接目标夹具保留真实LOAD和未知续程。这些证据不覆盖完整优化管线或保护业务。 采用该失效处理后,当前自产VMP3.11 Demo Ultra在原512块预算内记录976条提升指令/139尝试块,保留211/411/201警告与opaque未知返回。分析进程exit0、停止得更早或没有503均不表示业务恢复。原文件状态与录制状态仍分开,具体VMP3.8构建、完整Ultra和Enigma业务仍未验收。 完整有限地址读取现在有单独的认证分支:地址及每个当前候选值必须是仅依赖不可变函数参数/常量的已定义整数DAG;地址和候选值共享128访问/16层,独立数值域复用128访问/16层/256候选与乘积/256存储扫描。所有数值地址都被当前可读取候选覆盖、没有归一化别名且未知写入失效尚未触发时,才消除未匹配地址的LOAD回退。PHI、LOAD、CALL、freeze、poison/undef、特殊溢出承诺、缺失单元或超限均保留原行为。既有闭合常量PHI的独立读取机制不受此认证分支替代;不能据此冻结循环状态或绕过411。 277项具名检查逐项匹配251 custom+2 KnownBits+24固定oracle,flags检查开启。4项新增正例在未改后端失败,7项新拒绝边界与原266项保留。新增四份公开VM夹具包含直接/push-ret派发和输入选择的字节码流;两份64轮夹具先前在原512块预算下保留503,现分别在385尝试块完成,零警告/错误,完整优化后返回SSA对所有64位RCX等价于RCX+96。全部11份诊断夹具有66项查询(44 UNSAT/22 SAT);局部读取消除的普通字节内存引理另有9项查询(3 UNSAT/6 SAT),保留部分地址、未知写入、归一化、位宽和覆盖写入的反例。这些证明不认证完整内存副作用、原生OS行为、全优化管线或保护器业务。 同一自产VMP3.11 Demo Ultra仍停在976条提升指令/139尝试块与211/411/201;首次未知写入0x140055959的地址含循环PHI,此认证分支明确不接受它。VMP3.8、完整Ultra与Enigma业务恢复仍未通过,512块及求解/录制限制没有增加。