关于 re-tracing
面向动态程序分析的跟踪技能,帮助分析人员观察文件、网络、进程等行为并留存调用证据。内容涵盖 Linux/macOS 的系统调用与库调用,也介绍 Windows 跟踪工具及指令级跟踪方法。
主要功能
- 01跟踪系统调用与库调用
- 02过滤并保存带时间戳的跟踪日志
- 03观察子进程及动态解析的 API
- 04使用 Windows 工具监控 API 与系统事件
- 05介绍 QEMU 插件和 Intel PT 指令级跟踪
适用场景
- 01记录程序运行中的文件、网络和进程操作
- 02定位运行时动态解析的 API
- 03通过调用序列观察可疑行为
- 04还原脱壳或混淆程序的实际执行路径
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dslsdzc/ rev-skills --skill re-tracing安装后在 Claude Code 中输入/re-tracing确认已加载。
附带文件references/commands.mdreferences/gotchas.md
详细介绍
来自项目 README系统调用/函数调用跟踪
何时使用 / 何时不用
- 用:观察程序运行行为(文件/网络/进程操作);记录系统调用与库调用序列作为证据;定位动态解析的 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汇总统计、-pattach——速查与组合见 [[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 能列出并附加进程
操作步骤
-
strace -f 全进程树跟踪:
strace -f -o trace.log ./target args-f必须加:跟随 fork/vfork/clone 子进程——不加会漏掉全部子进程行为。-tt加微秒时间戳,-T加每调用耗时(网络等待/慢调用线索);-s 200放大字符串显示(默认 32 字节,路径/参数看不全时必加)。 已运行的目标用 attach(看不到 attach 之前的调用):sudo strace -f -p <pid> -o attach.log # attach 需要与目标同权限 strace -f -c ./target # 退出时打印系统调用计数/耗时汇总(热点定位) -
过滤(-e trace=...):
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)。
-
ltrace 库调用:
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]] 互补。 -
输出保存为证据:
strace -f -tt -o evidence/trace-$(date +%s).log ./target # 或 ltrace -f -o evidence/libcall.log ./target每条记录带 pid 与时间戳;分析完成后在笔记中引用文件路径与哈希(样本与日志各存 sha256,见 [[re-triage]])。
-
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]]
评论
支持 Markdown