⚡ libwebuiopsercore 命令集
7条固定分发命令 · 二进制跳转表 @0x58d82c · wire format 全部验证 · Boost.Asio 异步网络
heartbeat channel=springboard
→
服务端返回 task_id + filePathArray
→
命令读取 @0x58d2bc
→
ServerIsCmdSupported: @0x417c
→
跳转表 @0x58d82c → handler
→
参数读取 @0x58e338 (cmd 6/7需路径)
📋
cmd 1
AgentInfo
handler @0x58d854
70 bytes | 4eb5409b5d21d41de36a…
功能读取设备状态和 Agent 版本
参数无路径参数,提权前亦可执行
Observer无 Observer
💡 唯一不依赖 root 的命令,用于存活探测
Wire Frame
01 00000000
cmd=1, args=0
响应 Payload 示例
📁
cmd 2
FSArchive_Root_A
handler @0x58d978
385 bytes | 2cfec14139……
功能文件系统归档,根路径 /,profile 0x6ca138
参数无路径参数(根路径硬编码)
ObserverFilesystemServerOnNewFile:ofSize: / FilesystemServerOnNewData:
💡 profile 0x6ca138 决定遍历策略和深度限制
Wire Frame
02 00000000
cmd=2, args=0
响应 Payload 示例
📂
cmd 3
FSArchive_SysVar
handler @0x58d8e0
385 bytes | 2cfec14139… (same as…
功能归档 SystemVersion.plist + /private/var,profile 0x6ca158
参数无路径参数(路径硬编码)
ObserverFilesystemServerOnNewFile:ofSize: / FilesystemServerOnNewData:
💡 包含完整用户数据分区,是最完整的文件系统获取
Wire Frame
03 00000000
cmd=3, args=0
响应 Payload 示例
📦
cmd 4
FSArchive_Root_B
handler @0x58d91c
385 bytes | 2cfec14139… (same as…
功能文件系统归档,根路径 /,profile 0x6ca178
参数无路径参数(根路径硬编码)
ObserverFilesystemServerOnNewFile:ofSize: / FilesystemServerOnNewData:
💡 profile 0x6ca178 与 cmd2 的 0x6ca138 策略不同
Wire Frame
04 00000000
cmd=4, args=0
响应 Payload 示例
🗝️
cmd 5
KeychainDecrypt
handler @0x58da08
307 bytes | c93f0d36acb45fe94162…
功能调用 AppleKeyStore 硬件解包,全机 Keychain 明文提取
参数无路径参数,需 root + kernel r/w 原语
ObserverKeychainServerOnNewData: / KeychainServerOnNewSession
💡 输出文件: /tmp/keychain_%@_%@.xml (class=genp/inet/keys/cert 全部条目)
Wire Frame
05 00000000
cmd=5, args=0
响应 Payload 示例
📄
cmd 6
ExtractDataAtPath
handler @0x58dac4
93 bytes | 66970616c7650ac4f……
功能读取指定路径文件内容(二进制安全)
参数至少1个绝对路径(filePathArray),由 heartbeat springboard 返回
ObserverFilesystemServerOnNewFile:ofSize: / FilesystemServerOnNewData:
💡 最常用于: TronLinkData.sqlite / keystore / walletsV2
Wire Frame
06 01000000 67000000 [path_bytes]
cmd=6, args=1, path_len=BE32, path=bytes
响应 Payload 示例
🔍
cmd 7
ExtractMetadataAtPath
handler @0x58db80
165 bytes | 78c56aa373b84a0d……
功能读取指定路径元数据(stat信息),不读文件内容
参数至少1个绝对路径
ObserverMetadataServerOnNewSession / MetadataServerOnNewData:
💡 用于探测目标文件是否存在/可读,配合 cmd 6 使用
Wire Frame
07 01000000 67000000 [path_bytes]
cmd=7, args=1, path_len=BE32, path=bytes
响应 Payload 示例
🔴 SockPort 内核利用线程(MadVM 线程 @0xa338)
线程入口汇编(精确确认)
0xa338 sub sp, sp, #0x30
0xa344 mov x19, x0 ; 保存 ctx 指针
0xa350 bl _thread_local_dataEv
0xa354 ldr x1, [x19] ; ctx[0] = thread_struct
0xa360 bl _pthread_setspecific
0xa364 ldp x0, x1, [x19, #0x8]
0xa368 bl 0x57d7d4 ; → SockPort核心(直接调用)
0xa374 mov x0, #0x0
0xa384 ret
注: MadVM 不是 opcode 虚拟机
"MadVM" 是分析时误命名的标签
实际 = SockPort 利用线程
SockPort 内部状态机 @0x57d7d4
state=0 → sockport_ctx_init
state=1 → alloc_race_bufs (IOSurface 堆喷)
state=2 → race_loop (多线程竞争)
state=3 → 6-port-scan (ikm_header 扫描)
state=4 → kernel_deref_chain
→ ICMPv6 任意 r/w 原语
→ UcredStealer (root)
→ SandboxExtPatcher
→ CopyKeychainDBToTmpDirect
state=5 → store_port_names (完成)
关键常量:
vtable[+0x10] @0x98b4 = 纯指针链迭代器
koffset(48) = arr[3] = 0xec
koffset(49) = arr[4] = 0x10
SockPort spray: 1MB/134MB
flag base: 0x6c3000 + 0x898