系统识别指纹表
用途:从证据判断目标属于哪个系统。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 特征串中的任何一个,都不能回答"当前正在逆向的主体是什么系统"——证据为真、归属错误,是这类目标上最常见的翻车方式。
做法:
指纹表越丰富,这条越重要:判据多了以后,跨 scope 的假命中会同步变多。
一、四层流程
顺序不能颠倒:先定 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)是常态,不能反推"不是某个系统"
七、指认流程(一页版)
八、使用注意
- 先定 scope 再定系统:跨 scope 的命中只记"存在性",不作主体身份依据(§⓪)
- 两维要分开看:
独有·视构建 的判据看不见不等于不存在——strip 过的产物上,缺判据不构成反证
弱 级判据必须组合:如 ET_REL 只能收到"可重定位 ELF",不能直接定 Linux
- 易混淆对的裁断优先于单条特征:命中 §四 时按该行专项判据走
- 判不出不要硬判:家族定下、系统未定,也好过猜一个系统然后整条分析链跑偏;此时按家族级分支(如 re-rtos 主文档)先推进
- 新增系统分支时,同步往本表加一行(判据须带两维标注与 scope 说明)