Skip to content

待实机验证:DynData 运行时偏移解析,以及本轮仅过编译的合并提交 #191

Description

@Felix3322

背景

codex/wangwei-cm-all-commits-20260830 分支的 17 个提交经审查后,13 个合并进 main、3 个舍弃、1 个部分摘取,之后又追加了若干修复。这批改动全部只做了编译验证(主程序与驱动均 exit 0、零错误零告警、i18n audit 通过),下面两项需要在真机上确认。

被舍弃的 3 个提交内容仍完整保留在 codex/wangwei-cm-all-commits-20260830 及其远端副本上,可随时回看。


一、DynData 运行时偏移解析(重点)

提交: d8b680ee feat(dyndata): EpObjectTable / EpSectionObject 增加运行时解析来源

问题背景

Kernel.EpObjectTable / Kernel.EpSectionObject 此前只有 System Informer 偏移表一个填充点(dyndata_loader.c),而该表按 ntoskrnl 的 TimeDateStamp + SizeOfImage 精确匹配。实测本机内核(Win11 26H2 / 10.0.26300.9022,TimeDateStamp=0x3ABC2041SizeOfImage=0x01450000):

偏移源 条目数 覆盖本机内核
third_party/systeminformer_dyn SI blob 3809(x64 ntoskrnl 1738)
profiles/ark_dyndata_pack_v4.json 2070(ntoskrnl 1538,最新止于 10.0.26100.8764)

后果:进程列表「HandleTable」「SectionObject」两列恒为 Unavailable,句柄页也走退化路径。

ArkRuntimeDynData.cpp 顶部的产品策略明确禁止目标机运行时联符号服务器,因此补的是 feature-local 解析器,不依赖 PDB、不依赖打包 profile。

实现方式

沿用既有 EpProtection / EpSignatureLevel 的手法——反汇编导出访问器取偏移再回读校验,不做无锚点内存扫描

  • EpSectionObject:扫 PsReferenceProcessFilePointer 前 64 字节的第一条 REX.W disp32 内存加载,再要求读出的指针经 ObGetObjectType 判定为 MmSectionObjectType 对象。
  • EpObjectTable:无任何导出例程返回该字段,改为以 PsGetProcessId 解出的 UniqueProcessId 偏移为锚点向后 0x600 字节受限搜索;判据是槽位指针指向的 _HANDLE_TABLE 内含等于本进程 PID 的 ULONG,且同一表内偏移在多个采样进程上同时成立。窗口内出现第二个自洽解即放弃。

需要验证

加载 R0 驱动后:

  • 内核页 → DynData,确认 EpSectionObject 的来源标为 Runtime pattern
  • 同上,确认 EpObjectTable 的来源标为 Runtime pattern
  • 进程列表的「SectionObject」列不再是 Unavailable,显示实际地址
  • 进程列表的「HandleTable」列不再是 Unavailable,显示实际地址
  • 句柄页功能正常(该页依赖 EpObjectTable

置信度说明

两者置信度不同,请分别看待:

  • EpSectionObject 置信度高。偏移已从本机内核字节实证解出(mov rcx,[rbx+0x2A8]),且与 PsGetProcessSectionBaseAddress 给出的 SectionBaseAddress=0x2B0 相邻 8 字节、与已知 EPROCESS 布局吻合;ObGetObjectType 判据够硬。
  • EpObjectTable 置信度低。是启发式搜索,无法静态确认该字段落在搜索窗口内——本机 EPROCESS 布局明显被重排过(UniqueProcessId 在 0x1D0,经典 Win10 为 0x440)。

失败也是安全的:解析不出时返回 -1,字段保持不可用,与现状一致;且 StoreRuntimeOffset 只在偏移仍缺失时写入,不会覆盖打包 profile 的结果。所有跨指针读取均先经规范内核地址 + 对齐 + MmIsAddressValid 预检,再置于 __try 保护下。

相关:#175


二、合并进来的功能提交仅过编译

以下提交从分支 cherry-pick 而来,有实际副作用(写防火墙规则、删注册表键值),但交互路径未经手动验证

  • d74e84d6 d0ae4361 1b878173 7ee4560c 0018a7af — 防火墙阻断规则预填五连(NIDS 告警 / 已核验进程身份 / 流量报文 / WFP 事件 / NSI UDP 端点)
  • f5fe528c 6882b080 — 注册表搜索结果删除值 / 删除键(含子项)
  • 8a17899a + c398066d — 驱动概览拆分为「驱动服务」+「内核模块」两页(必须成对,后者撤回了前者把四个一级诊断页塞进子标签的改动)
  • 3af74c89 — 虚拟位置:默认位置键不存在时不再回退 R0、不再打 Warn
  • ffbc51c4 — KernelDock 表格透明样式 + openSilently
  • 2122ead5 — 最大化时窗口边框裁剪
  • 56438aeb — 日志窗口刷新丢选中
  • b657a7eb — 顶部搜索弹层只在表格搜索入口请求时展开

三、已确认,无需重复验证

  • 1a93cd9b + 4a997e78 — CID 扫描不再把已退出进程的残骸报成隐藏进程(幽灵行)。已实机确认修复。
  • ad5ab287 — 内核对比默认开启(开关保留)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions