如何追踪/监听macOS路由变更,获取route命令的调用参数
捕获路由修改操作的3种可用方案
方案1:用dtruss直接捕获route命令全参数
你之前只看到stat64调用是因为没有指定跟踪execve类系统调用,执行以下命令即可捕获所有进程调用route时的完整参数:
sudo dtruss -f -t execve 2>&1 | grep -A3 "route"
输出会直接展示route后的所有传入参数,同时会显示调用route的父进程PID,方便定位源程序。
方案2:自定义DTrace脚本全场景捕获路由变更
该方案除了捕获route命令调用外,还能捕获程序直接调用内核API修改路由的行为,覆盖所有修改场景:
- 新建
route_snoop.d文件,写入以下内容:
#!/usr/sbin/dtrace -s #pragma D option quiet /* 捕获/sbin/route命令调用场景 */ syscall::execve:entry /execname == "route"/ { printf("[%Y] PID: %d | Parent PID: %d | Route命令: ", walltimestamp, pid, ppid); this->i = 0; while (copyinstr(arg1[this->i]) != NULL) { printf("%s ", copyinstr(arg1[this->i])); this->i++; } printf("\n"); } /* 捕获内核层面路由新增/修改/删除操作 */ fbt::route_add:entry, fbt::route_change:entry, fbt::route_delete:entry { printf("[%Y] PID: %d | 进程名: %s | 内核路由操作: %s\n", walltimestamp, pid, execname, probefunc); }
- 赋予执行权限并运行:
chmod +x route_snoop.d sudo ./route_snoop.d
方案3:无需DTrace的轻量方案
直接使用macOS自带的execsnoop工具即可快速捕获route调用:
sudo execsnoop -v | grep route
输出的ARGS列即为route命令的完整参数,PPID列即为调用route的源进程ID。
内容的提问来源于stack exchange,提问作者tladuke
相关产品推荐
相关产品推荐

