--- name: re-tracing description: > 系统调用/函数调用跟踪:strace/ltrace/dtruss。 触发词:strace、跟踪系统调用、ltrace、API监控 capabilities: [tracing] --- # 系统调用/函数调用跟踪 ## 何时使用 / 何时不用 - 用:观察程序运行行为(文件/网络/进程操作);记录系统调用与库调用序列作为证据;定位动态解析的 API(GetProcAddress/dlopen 之后) - 不用:只需内存内容(走 [[re-memdump]]);只需静态逻辑(反编译技能) - 不用:Windows 目标用 APIMonitor/ProcMon(本技能 Linux/macOS 为主) ## 工具准备 参考 [[re-analyze/platform-tips]] 最高原则——跟踪即动态执行,默认在沙箱内进行,网络隔离。 ### strace(Linux) - Debian/Ubuntu: `apt install strace` - Fedora/RHEL: `dnf install strace` - Arch: `pacman -S strace` - WSL: Linux 包直接可用 - 验证: `strace -V` - 常用选项:`-f` 跟子进程、`-o` 写文件、`-e trace=` 过滤、`-s 200` 放大字符串显示(默认 32 字节)、`-x` 非 ASCII 转十六进制、`-y`/`-yy` 把 fd 解析为路径、`-c` 汇总统计、`-p` attach——速查与组合见 [[commands]] ### ltrace(Linux 库调用) - Debian/Ubuntu: `apt install ltrace` - Fedora/RHEL: `dnf install ltrace` - Arch: `pacman -S ltrace` - 验证: `ltrace -V` ### dtruss(macOS,DTrace 版 strace) - macOS 自带(随 Xcode CLT);需要 root 且部分 SIP 场景受限 - 验证: `sudo dtruss -c ls / 2>&1 | head` 输出去重调用统计 ### APIMonitor / ProcMon(Windows) - APIMonitor: rohitab.com 下载 zip 解压即用 - ProcMon: Microsoft Sysinternals —— `choco install sysinternals`(或官网下载) - 验证: 打开 APIMonitor/ProcMon 能列出并附加进程 ## 操作步骤 1. **strace -f 全进程树跟踪**: ```sh strace -f -o trace.log ./target args ``` `-f` 必须加:跟随 fork/vfork/clone 子进程——不加会漏掉全部子进程行为。 `-tt` 加微秒时间戳,`-T` 加每调用耗时(网络等待/慢调用线索);`-s 200` 放大字符串显示(默认 32 字节,路径/参数看不全时必加)。 已运行的目标用 attach(看不到 attach 之前的调用): ```sh sudo strace -f -p -o attach.log # attach 需要与目标同权限 strace -f -c ./target # 退出时打印系统调用计数/耗时汇总(热点定位) ``` 2. **过滤(-e trace=...)**: ```sh strace -f -e trace=network,file ./target # 只看网络与文件 strace -f -e trace=write,read ./target # 只看读写 strace -f -e trace=execve,fork,clone ./target # 只看进程行为 strace -f -e trace=!futex ./target # 排除噪声(futex 高频) ``` 过滤规则先白名单后黑名单,控制输出体积(见坑 2)。 3. **ltrace 库调用**: ```sh ltrace -f -o lib.log ./target ltrace -e malloc+free ./target # 只跟踪指定库函数 ltrace -l /path/libfoo.so ./target # 跟踪 dlopen 动态加载的库 ltrace -f -S ./target # 库调用 + 系统调用一起跟踪 ltrace -f -c ./target # 退出时库调用汇总 ``` 动态解析的 API(`dlsym` 拿到的函数)不会出现在静态 IAT 里,但会出现在 ltrace 输出中——与 [[re-imports]] 互补。 4. **输出保存为证据**: ```sh strace -f -tt -o evidence/trace-$(date +%s).log ./target # 或 ltrace -f -o evidence/libcall.log ./target ``` 每条记录带 pid 与时间戳;分析完成后在笔记中引用文件路径与哈希(样本与日志各存 sha256,见 [[re-triage]])。 5. **Windows 用 APIMonitor/ProcMon**: - APIMonitor: 运行(管理员)→ 选中目标进程 → 勾选要监控的 API 类(File/Network/Registry/Process)→ 附加,观察调用参数与返回值 - ProcMon: 全系统级(文件/注册表/网络/进程事件),先按进程过滤(Process Name 过滤目标名),再按 Operation 过滤 - 可疑点: 对注入类 API 连续调用序列(OpenProcess→VirtualAllocEx→WriteProcessMemory→CreateRemoteThread)即恶意行为证据 ## 指令级追踪 比系统调用级更深一层——指令粒度执行流: - **QEMU 插件**:`-plugin` 加载指令级 trace 插件(insn 粒度、call/ret 路径、guest 代码块事件);用途——脱壳后真实路径还原、反混淆(静态混淆无法隐藏实际执行) - **Intel PT**:硬件 trace(`perf record -e intel_pt`)→ 解码(`perf script` 或第三方解析)→ 分支流还原;用途——无插桩开销的完整执行路径 - **trace 分析**:热点(执行频次排序)、路径还原(调用链重建)、与 [[re-deobfuscate]] 衔接(按真实路径过滤死代码) - **输出**:指令级执行流摘要(供 [[re-analyze/analysis-contract]] 证据存档) ## 跨域联合 - [[re-binary-core]]:工作流第 6 步(行为跟踪) - [[re-malware]]:恶意行为观察(回连/持久化/自启动) - [[re-cracking]]:监控校验/注册相关的 API 调用参数 - 与 [[re-imports]] 互补(动态解析 API);发现反调试时转 [[re-anti-analysis]] - [[re-ebpf]]:BPF 观测/跟踪取证还原——strace 覆盖不到的 skb/内核路径由 BPF 观测互补 ## 常见坑与陷阱 - **不加 -f 漏子进程**:目标 fork 后父进程退出/exec,未跟踪的子进程行为全部丢失——`-f` 是标配 - **输出巨大**:不过滤时大程序日志可达 GB 级拖垮磁盘——先 `-e trace=` 白名单,必要时 `-o` 写文件而非终端 - **反调试样本检测 trace 环境**:`ptrace` 状态检测/`LD_PRELOAD` 痕迹暴露 strace/ltrace——与 [[re-anti-analysis]] 的反调试绕过组合使用 - ltrace 默认只跟踪 PLT 层调用——`dlopen` 后加载的库函数要加 `-l` 显式指定 - 命令族速查与操作序列见 [[commands]];工具特有坑与版本差异见 [[gotchas]]