计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-lldb【效率与协作】lldb 调试(macOS/iOS):attach、expr、image。 触发词:lldb、macOS调试、iOS调试
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
参考 [[re-analyze/platform-tips]] macOS 分支——SIP 与 TCC 限制 attach,需 Developer Tools 授权。
xcode-select --install)apt install lldb / dnf install lldb / pacman -S lldbbrew install llvm(含新版 lldb)lldb --versionlldb --version 确认);脚本依赖 lldb.SBDebugger API 时跨版本兼容性需验证(见 [[gotchas]])sudo DevToolsSecurity -enableDeveloper Tools 权限确认:
lldb -p <测试进程pid> # 若报 "please check the developer mode" / 权限拒绝 → 去系统设置授权终端
授权后重启终端;仍失败再检查 SIP 状态: csrutil status。
注意: TCC 授权弹窗需在系统设置手动确认,无法命令行绕过。
attach/启动:
(lldb) process attach --pid <pid> # 附加
(lldb) process attach --name Safari # 按名字附加(需唯一)
(lldb) target create ./sample # 或直接启动
(lldb) run --args arg1
(lldb) continue / c
iOS 设备: platform select remote-ios + process connect connect://<device>(需配合调试服务,越狱/证书要求见 [[re-mobile]])
target create + run 启动模式process launch --stop-at-entry(等价 -s)image lookup 符号:
(lldb) image lookup -n main # 按名字查符号
(lldb) image lookup -a $pc # 按地址查当前所在函数/源行
(lldb) image list # 已加载镜像(dylib 基址表)
(lldb) image lookup -rn dispatch # 正则匹配符号
stripped 二进制用 image lookup -a 反查地址归属模块,配合 image dump symtab
image list -o 加偏移列——ASLR 下每次运行基址不同,脚本里先拿基址再算绝对地址(见 [[gotchas]])内存表达式 expr:
(lldb) expr $rax
(lldb) expr $rax = 0 # 写寄存器
(lldb) expr (char*)0x100000000 # 类型化读地址
(lldb) expr -O -- @"hello" # Objective-C 求值(objc 运行时)
(lldb) memory read -c 20 -s 4 -f x $rsp # 读内存(缺 -f x 会报格式冲突错误)
(lldb) memory write -s 1 0x100000000 0x90 # 写字节(绕过校验)
断点与脚本:
(lldb) breakpoint set -n main
(lldb) breakpoint set -a 0x100004000 -c '*(int*)($rsp) == 0x1234' # 条件断点
(lldb) breakpoint command add 1
> frame variable
> expr $rax
> continue
> DONE
Python 自动化: lldb 内置 Python——script import lldb,或用 lldb -s script.lldb 批处理。
breakpoint set -n objc_msgSend(按符号名,模块加载后自动生效);正则: -r '^check_'breakpoint list / breakpoint delete / breakpoint disable 1单步/栈/线程:
(lldb) thread step-over / step-into / step-out # 步过/步入/出函数(别名 next/step/finish)
(lldb) thread backtrace # 当前线程栈(别名 bt)
(lldb) thread list # 全部线程
(lldb) frame select 1 # 切栈帧
(lldb) frame variable # 当前帧局部变量
(lldb) register read # 全部寄存器
step-out 配合返回寄存器看结果,是「验证函数返回」最快路径内存搜索与区域:
(lldb) memory find 0x100000000 0x101000000 -e 0xdeadbeef # 区间内搜值/字节串
(lldb) memory find -s "password" 0x100000000 0x101000000 # 搜字符串
(lldb) memory region 0x100004000 # 该地址所属区域权限/边界
memory find 定位,再断写入点;区域权限(RWX)异常段先看(壳/解密段)证据核对(收尾):断点命中记录、frame variable/expr 输出、memory read 转储(memory read --force -o 文件 导出)对照 [[re-triage]] 初勘值入档,结论写 [[re-analyze/analysis-contract]]
permission denied 或静默失败)——去系统设置开发者工具授权;关闭 SIP 只在极端情况codesign -f -s - 重签再调试csrutil status、检查目标签名与 entitlement),测试目标可先去签名/重签([[re-format-macho]])再调试,参考 [[re-analyze/platform-tips]] macOS 分支image list -o 拿基址换算,断点尽量下符号名(-n/-s)expr 会真实执行代码(调用函数/改内存)——在 hook 点求值可能改变目标行为,验证场景用 frame variable 只读优先