Files
reverse-skills-max/vendor-new/rev-skills/.claude/skills/re-analyze/references/system-fingerprints.md

19 KiB
Raw Blame History

系统识别指纹表

用途:从证据判断目标属于哪个系统。cross-system-models 解决"看到异常先怀疑什么",本文件解决它前面的一步——"我在看的是什么东西"。

判据来源:本文件不引入新断言,判据全部取自本库已核验的技能分支(各分支文末的"工具与验证"节)。

判据的两维标注(重要)

一条判据有"多独特"和"多容易看见"两个互相独立的属性,混为一谈会直接把结论带偏:

维度 取值 含义
特异度 独有 只有该系统有
高 少数系统共有,需配合排除
弱 只能收窄到家族
可观测性 稳定 剥离符号后通常仍可见(结构内魔数、容器魔数、必需导出名)
视构建 取决于是否 strip / 是否保留字符串 / 配置是否随产物
仅运行期 只能从运行中的系统、流量或运行时接口获得

标注形如 独有·稳定。 典型误用:把 独有·视构建 的判据(如模块名后缀)当成"一定能看到",于是对一个 strip 过的产物得出"不是该系统"的错误结论——看不见不等于不存在。

⓪ 先定证据归属(evidence_scope)

同一个字符串,归属不同的对象,指向完全不同的结论。

scope 含义 典型来源
container 容器本身 固件封装、磁盘镜像、升级包
executable 当前正在分析的执行体 主二进制
embedded payload 容器内的嵌入载荷(可能属于另一种系统) 固件里嵌的 rootfs、MCU blob
guest 虚拟化/分区下的客体 VM 镜像、分区镜像
dependency 被链接或依赖的组件 静态库、第三方 .a、sysroot
toolchain artifact 工具链产物(不是运行时主体) 编译器 sysroot、示例配置、调试符号
documentation 文档/注释/示例 README、示例配置

规则:先判"这条证据属于谁",再判"它是哪个系统"。

固件里同时存在 Linux rootfs、一个 MCU blob、一个 guest 镜像与编译期 sysroot 时,找到 procnto、ARXML、seL4_*、FreeRTOS 特征串中的任何一个,都不能回答"当前正在逆向的主体是什么系统"——证据为真、归属错误,是这类目标上最常见的翻车方式。

做法:

1. 列出容器内全部可辨认对象,逐个标 scope
2. 确定分析主体(用户的目标)属于哪个 scope
3. 只在【同 scope 内】做指纹比对
4. 跨 scope 的命中只记为"存在性",不作为主体身份依据

指纹表越丰富,这条越重要:判据多了以后,跨 scope 的假命中会同步变多。

一、四层流程

① 载体与格式:我拿到的是什么(模块 / 镜像 / 配置 / 转储 / 流量)
② 超家族收敛:几条问题把它归到某一族
③ 家族内指认:按该族的表逐行排除
④ 易混淆对与负判据:命中易混对时按专项判据;用"看到 X 就不是 Y"收尾

顺序不能颠倒:先定 scope、再定格式、再定家族、最后定系统。跳过前几层直接猜系统,会得到一连串"似曾相识但都对不上"的结论。

二、超家族:载体与格式

载体 结论或下一步
ELF 且类型为 ET_REL [弱·稳定] 仅说明"这是可重定位 ELF"(内核模块常用此形态,但不止内核模块)→ 需再命中 .modinfo / __this_module / vermagic 一类符号,才升到"Linux 可加载内核模块"
ELF 可执行,EI_OSABI 非 0/3 按 §六 的 OSABI 表定系统
ELF,带 .note.openbsd.ident / .note.netbsd.ident / .note.tag(FreeBSD) [独有·稳定] 对应 BSD → §3.1
PE32/PE32+,subsystem = EFI 相关 UEFI 模块 → §3.6;否则 §3.1 Windows
PE,.sys 扩展、导出 DriverEntry/GsDriverEntry Windows 驱动模型 → §3.1
Mach-O(KEXT bundle / .dext) macOS 家族 → §3.1
无标准容器,含 0x00ff7eeb + "imagefs" [独有·稳定] QNX IFS 镜像 → §3.2
固件结构(FV → FFS → section) UEFI/PI → §3.6
XML 配置 + 分区/major frame 词汇 分区 hypervisor 或分区 RTOS → §3.4/§3.5
C 源文件形式的配置(含 struct config 一类) 静态分区 hypervisor → §3.5
ARXML AUTOSAR → §3.8
大量 EBCDIC 文本、记录式数据集 大型机 → §3.7
单一镜像,内含初始化表段与成套 uk_* 符号 Unikraft → §3.9
OCaml 源码 / Lwt 调用 MirageOS → §3.9

三、家族内指认

3.1 UNIX / Windows 系内核与驱动

系统 载体与结构 判据
Linux .ko = ET_REL;可能带签名尾、livepatch 节、BTF/split BTF .modinfo / __this_module / vermagic [独有·稳定];module_init [独有·视构建]
Android 同为 ELF 模块,受 KMI 约束 ACK 分支串、KMI symbol list、protected symbol [高·视构建]
FreeBSD .ko(KLD,ELF);linker set 注册 set_sysinit_set / __start_set_* [独有·视构建](strip 后不可见)
NetBSD .kmod module_autoload / MODCTL_* [独有·视构建]
OpenBSD 内核每次 boot 被重新随机链接(KARL) 用户态 .note.openbsd.ident [独有·稳定];link kit / rc 重链接脚本 [高·视构建]
illumos / Solaris .so 内核模块(DDI/DKI) _init/_fini/_info + modlinkage/modldrv/dev_ops/cb_ops [独有·稳定](必需导出);nulldev 与 nodev 并存 [独有·视构建]
macOS KEXT(Mach-O,AuxKC 内)/ DEXT(用户态) IOKitPersonalities [高·视构建]、__TEXT_EXEC 段 [独有·稳定]、Info.plist [独有·稳定](就绪于 bundle)
Windows .sys(PE) 先分驱动模型:WDM(DriverEntry + MajorFunction[] [独有·稳定])、KMDF(指向 Wdf01000.sys [独有·视构建])、minifilter(FltRegisterFilter [独有·视构建])、NDIS(Miniport*/Ndis* [独有·视构建])

3.2 capability / 用户态驱动型内核

系统 判据 结构线索
seL4 seL4_* / seL4_Call [独有·视构建] capDL .cdl 与 CAmkES ADL 价值高于符号表
Fuchsia / Zircon zx_* / fidl_* [独有·视构建] 组件清单、bind rules 字节码、driver host 划分
Genode session / ROM / IO_MEM / IO_PORT / IRQ 服务名 [高·视构建] init XML(<route> / <start>)[独有·稳定](配置就在身边时)
HelenOS driver_ops_t / devman_driver_register / ddf_fun_* [独有·视构建] fibril(用户态协作调度)仅运行期
Redox :SCHEME_NAME / SQE-CQE / relibc / redox-rt [独有·视构建] initfs 与驱动目录 [高·稳定]
Haiku 模块名以 driver_v1 / device_v1 结尾 [独有·视构建](符号被剥离后未必可见) device_node 树、KDL
MINIX 3 服务 label + endpoint、RS/SEF [高·仅运行期] 用户态服务与 REQ_* 消息
Plan 9 / 9front 9P 消息(Tversion/Tattach/Twalk)[独有·仅运行期] /srv、fid、每进程命名空间
HIC 自描述模块元数据(UUID/版本/端点/资源/依赖/签名)[独有·稳定];入口页 IPC 形态 [独有·仅运行期] 同特权级 + MMU 隔离;capability 记账有代际差异
QNX Neutrino procnto / "imagefs" / IFS 魔数 0x00ff7eeb [独有·稳定] io-* / devb-* / devc-* [高·视构建];devnp-*.so [独有·视构建]

3.3 RTOS

系统 判据 结构线索
FreeRTOS "FreeRTOS" 串、pxCurrentTCB、pxReadyTasksLists [独有·视构建] pcTaskName、栈填充 0xa5 [高·视构建]
ThreadX tx_kernel_enter、_tx_thread_created_list [独有·视构建] 对象头魔数(THRD 0x54485244、QUEU、SEMA、MUTE、ATIM…)[独有·稳定]
ThreadX Modules txm_*、_txm_module_kernel_call_dispatcher [独有·视构建] module preamble 必在模块第一个地址 [独有·稳定]
RT-Thread rt_thread_ready_priority_group、rt_thread_priority_table [独有·视构建] rt_system_scheduler_start
Zephyr DEVICE_DT_DEFINE / SYS_INIT [独有·视构建] devicetree + Kconfig [高·视构建];iterable section [独有·视构建];map 里的 __init_PRE_KERNEL* 段
NuttX syscall.csv / drivers_early_initialize [独有·视构建] FLAT/PROTECTED/KERNEL 三种构建 [高·仅运行期];upper/lower half [独有·视构建]
VxWorks tIdle / tRootTask [独有·视构建] WIND_TCB / td_* [独有·视构建];.out(DKM)/ .vxe(RTP)[独有·稳定];VSB/VIP [独有·稳定]
RTEMS CONFIGURE_INIT / Device_drivers [高·视构建] confdefs.h 构建期配置、rtems_driver_address_table [独有·视构建]
eCos CYG_*、cyg_hal_invoke_constructors、hal_vsr_table、CYG_ISR_CALL_DSR [独有·视构建] CDL、mlt_*.ldi、RedBoot、虚拟向量表 [独有·视构建]
µC/OS(Micrium) OSIntEnter / OSIntExit / OSSchedLock [独有·视构建] OS_TCB、OS_TmrTask
TI SYS/BIOS ti.sysbios.knl.*、Swi_* / Hwi_* / Task_* [独有·视构建] Hwi > Swi > Task 分层 仅运行期
SAFERTOS xMPUSetTaskRegions 一类 [高·视构建];与 FreeRTOS 同源但非同一份二进制 ESM 的 ACP / OACP / 间接对象 ID [独有·视构建]
CMSIS-RTX5 osRtxError* / RTX_Config.h / OS_SAFETY_FEATURES [独有·视构建] osThreadZone / 安全等级 / 线程看门狗 [独有·视构建]
T-Kernel tk_def_dev / tk_rea_dev / tk_wai_dev [独有·视构建] 三种执行上下文 仅运行期
TOPPERS act_tsk / sta_cyc [高·视构建] 先判家族(ASP3 / HRP3 / FMP3 / HRMP3)[高·视构建]
OSE / OSEck hunt / attach / send / receive / SIGSELECT [独有·视构建] 信号队列附属于进程 仅运行期
Nucleus NU_Create_* / NU_Allocate_Partition [独有·视构建] NU_PARTITION_POOL(别与空间隔离域混)

3.4 分区 / 安全 RTOS

系统 判据 结构线索
INTEGRITY / INTEGRITY-178 ARINC 653 APEX 服务名 [高·视构建] 空间/时间/资源三域;静态启动表 [独有·视构建]
PikeOS 链接在固定地址的 APEX 服务表 [独有·稳定] 三层:分区调度器 → system thread → guest 调度器 仅运行期
ARINC 653 / VxWorks 653 major frame / partition window / SET_PARTITION_MODE [独有·视构建] 分区模式、采样端口 vs 队列端口 仅运行期
Deos 三类调度模型并存(ARINC 653 + RMS + POSIX)[独有·视构建] 跨核对齐时间窗 + 每核 scheduler、slack、SafeMC [独有·视构建]

3.5 Hypervisor

宿主侧厂商串(CPUID 叶 0x40000000):KVMKVMKVM、Microsoft Hv、VMwareVMware、XenVMMXenVMM —— [独有·仅运行期]。

系统 判据 结构线索
Xen XenStore 路径、backend-id、ring-ref/event-channel 键 [独有·仅运行期];/dev/xen/evtchn [独有·稳定] grant table / shared ring / event channel;shared_info 位掩码
Hyper-V / VMBus VMBus 总线、netvsc / storvsc [独有·仅运行期] VSC/VSP、GPADL、SR-IOV 数据面切换
ACRN IVSHMEM_ENABLED / IVSHMEM_REGION / acrn-dm;dm:/ 与 hv:/ 前缀 [独有·视构建] Service VM / pre-launched / post-launched 三层
Jailhouse .cell 配置 [独有·稳定];控制台串 Parking CPU n (Cell: ...) [独有·仅运行期] cell 描述符(内存区标志、PCI/IRQ 归属)
Bao C 源配置 struct config / shmemlist / vmlist / shmem_id [独有·视构建] CPU/内存/中断独占;vCPU 与 pCPU 1:1
XtratuM XM_CF XML(<Partition> / <CyclicPlanTable> / <PortTable>)[独有·视构建] Plan 0 初始化 / Plan 1 维护;IPVI
QNX Hypervisor shmem 工厂页字段(name/size/shmem/vector/status)[独有·视构建] 三层地址;vdev
LynxSecure 判据薄:内核里没有驱动与 I/O 栈、无管理控制台入口 [独有·仅运行期] 不可变 boot 分区;内核功能仅限三项职责
Quest-V 判据薄:每 sandbox 一个 monitor、VM-exit 极少、无全局时钟 [独有·仅运行期] monitor 只在引导/故障/影子页表/建通道时介入

判据薄的两个系统(LynxSecure / Quest-V)不以字符串定案——定案方式是结构与行为(见各自分支)。

3.6 固件与引导

系统 判据 结构线索
UEFI / PI PE32/PE32+ 且 subsystem 为 EFI 类;GUID 密集 [独有·稳定] FV → FFS file → section → PE32/TE;HOB;MODULE_TYPE;PPI(PEI)vs Protocol(DXE)vs Runtime Services

3.7 主机 / 大型机

系统 判据 结构线索
z/OS EBCDIC 文本 + 记录式数据集 + JCL [高·稳定] load module / program object;TCB/SRB;AMODE/RMODE;XPLINK 与否
IBM i 库/对象 限定名、*PGM / *SRVPGM / *MODULE 对象类型 [高·仅运行期] 单一存储层;MI/TIMI/SLIC 层次;activation group
OpenVMS ELFOSABI_OPENVMS = 13 [独有·稳定];DCL 命令文件 [高·稳定] .EXE 镜像、SYS$SHARE:、逻辑名、AST / $QIO、RMS、描述符调用标准

3.8 车载软件

系统 判据 结构线索
AUTOSAR Classic ARXML + Rte_* 接口 [独有·稳定] Runnable / RTEEvent / OS Task 映射;E_OS_ACCESS;BSW
AUTOSAR Adaptive 三类 Manifest(Execution / Service Instance / Machine)[独有·稳定] ara::com、Function Group State / Machine State、Checkpoint(PHM)、UCM 与 Persistency

3.9 unikernel

系统 判据 结构线索
Unikraft uk_* 符号 + uk_syscall_e_* / uk_syscall_r_* 成对出现 [独有·视构建] 初始化表段(构造/早期/平台/库/rootfs/系统/晚期);Kconfig
MirageOS OCaml 源码 + Lwt 调用 [独有·稳定] 单一静态 ELF;设备接线来自构建期配置

四、易混淆对

容易混 分开的判据
FreeRTOS / ThreadX / µC/OS / RT-Thread 看对象头魔数(ThreadX 独有,且 strip 不掉)→ 再看唯一符号
Zephyr / NuttX 都有 Kconfig 风格构建;Zephyr 有 devicetree + iterable section;NuttX 有 syscall.csv + upper/lower half
VxWorks / QNX .out/.vxe + tIdle vs IFS 魔数 + procnto + devnp-*.so
FreeBSD / NetBSD / OpenBSD linker set set_* vs .kmod + autoload vs KARL 重链接 + .note.openbsd.ident
illumos / Linux illumos 有 _init/modlinkage/dev_ops;没有 module_init/file_operations;nulldev 与 nodev 是两个占位
seL4 / Fuchsia / Genode seL4_* + capDL vs zx_* + bind rules vs session + init XML
Jailhouse / Bao / XtratuM .cell vs C 源 struct config vs XM_CF XML
ACRN / Xen ACRN 有 Service VM 三层与 dm:/ hv:/ 前缀;Xen 走 XenStore 路径 + grant/event
QNX Neutrino / QNX Hypervisor 前者是 resource manager 生态;后者有 qvm 配置与 shmem 工厂页
MINIX 3 / Plan 9 / Redox RS + endpoint vs 9P + /srv vs scheme + SQE/CQE
Haiku / BeOS Haiku 模块名以 driver_v1/device_v1 结尾;调试接口与文件系统 API 与 BeOS 不兼容
HIC / Fuchsia HIC 有自描述模块元数据与入口页 IPC 形态;Fuchsia 有 driver host 与 bind rules
z/OS / IBM i / OpenVMS EBCDIC + 数据集 + JCL vs 库/对象 vs ELFOSABI=13 + DCL
INTEGRITY / PikeOS / Deos / ARINC 653 都讲分区;PikeOS 的 APEX 服务表链接在固定地址、Deos 三类调度模型并存可作区分
LynxSecure / Quest-V 都"没有中央调度器";前者是不可变静态分区,后者是每 sandbox 一个 monitor

五、负判据(看到 X 就不是 Y)

看到 可以直接排除
set_sysinit_set / __start_set_* Linux(那是 FreeBSD 的 linker set)
_init + modlinkage + dev_ops Linux、FreeBSD(那是 illumos/Solaris 的 DDI/DKI 骨架)
0x00ff7eeb + "imagefs" 任何 Linux/BSD
procnto / devnp-*.so 任何非 QNX 系统
ARXML / Rte_* 通用 RTOS 与桌面 OS
大规模 EBCDIC 记录 任何 Unix 系
.cell Xen / ACRN / Bao / XtratuM
struct config + shmem_id 除 Bao 外的 hypervisor
ThreadX 对象头魔数 FreeRTOS / µC/OS / RT-Thread
ELFOSABI = 9 / 2 / 12 / 13 分别是 FreeBSD / NetBSD / OpenBSD / OpenVMS,不要按"BSD 都差不多"处理

六、EI_OSABI 取值参照

NONE=0、HPUX=1、NETBSD=2、LINUX=3、HURD=4、86OPEN=5、SOLARIS=6、AIX=7、IRIX=8、FREEBSD=9、TRU64=10、MODESTO=11、OPENBSD=12、OPENVMS=13、NSK=14、ARM=97、STANDALONE=255。

  • note 段与 OSABI 是两套独立标识:BSD 系的 note 更常见(见 §3.1),OpenVMS 走 OSABI=13
  • 注:2000 年曾有 FREEBSD=4 / NETBSD=5 / OPENBSD=6 的提案,与现行值不同——本表按现行值
  • OSABI 为 0(NONE)是常态,不能反推"不是某个系统"

七、指认流程(一页版)

0. 证据归属:容器内有哪些对象?各自 scope 是什么?主体是哪一个?
1. 载体与格式:PE / ELF(ET_REL?) / Mach-O / 无容器镜像 / 配置 / 转储 / 流量
2. ELF:先读 EI_OSABI 与 note 段 → 常常一步定系统
3. 无容器镜像:找魔数与签名串(IFS、固件卷、RTOS 特征串)
4. 有配置:配置格式本身就是强判据(.cell / XM_CF / ARXML / manifests / Kconfig+devicetree)
5. 符号与命名:逐行排除;命中易混对走 §四
6. 仍不定:
   ├─ 看"缺什么":没有驱动与 I/O 栈?没有中央调度器?
   └─ 看运行期可见面:系统信息接口、调试器命令、调试接口类型
7. 定案后 → [[cross-system-models]] 查该系统的"正常异常",再按 [[rerouting]] A 表进对应分支

八、使用注意

  • 先定 scope 再定系统:跨 scope 的命中只记"存在性",不作主体身份依据(§⓪)
  • 两维要分开看:独有·视构建 的判据看不见不等于不存在——strip 过的产物上,缺判据不构成反证
  • 弱 级判据必须组合:如 ET_REL 只能收到"可重定位 ELF",不能直接定 Linux
  • 易混淆对的裁断优先于单条特征:命中 §四 时按该行专项判据走
  • 判不出不要硬判:家族定下、系统未定,也好过猜一个系统然后整条分析链跑偏;此时按家族级分支(如 re-rtos 主文档)先推进
  • 新增系统分支时,同步往本表加一行(判据须带两维标注与 scope 说明)