K
SSE 直播
0 在线
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 示例
{"agent_version":"3.04-hook","device_id":"DEVICE_001"}
📁
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 示例
[gzip/tar archive: / filesystem]
📂
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 示例
[gzip/tar: SystemVersion.plist + /private/var]
📦
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 示例
[gzip/tar: / filesystem variant B]
🗝️
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 示例
<keychain><item class="genp" agrp="TEAM.wallet" svce="wallet.unlock.candidate" acct="primary"><data bin="0">SECRET</data></item></keychain>
📄
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 示例
{"address":"ADDR","crypto":{"ciphertext":"...","kdf":"scrypt"}}
🔍
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 示例
{"path":"/private/var/.../keystore","mode":"0644","uid":501,"gid":501}
🔴 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