news 2026/9/15 12:16:41

pwndbg `procinfo` 命令实战:一键透视运行进程的完整状态(文件描述符、网络连接、SELinux、能力集与管道对端)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pwndbg `procinfo` 命令实战:一键透视运行进程的完整状态(文件描述符、网络连接、SELinux、能力集与管道对端)

pwndbgprocinfo命令实战:一键透视运行进程的完整状态(文件描述符、网络连接、SELinux、能力集与管道对端)

【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB & LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg

procinfo是 pwndbg 提供的进程信息检视命令,用于在调试会话中一键输出目标进程的完整运行状态,包括可执行文件、命令行、工作目录、PID/TID、父进程、UID/GID/组、SELinux 上下文、能力集,以及所有打开的文件描述符,并将 TCP/Unix/Netlink 套接字与匿名管道自动增强为可读的连接与对端信息。本文以 docs/commands/process/procinfo.md 为核心,结合 pwndbg/commands/procinfo.py 及其底层 pwndbg/aglib/proc.py、pwndbg/lib/proc_fd.py、pwndbg/lib/net.py、pwndbg/lib/sock_diag.py 源码,从用法、输出字段、实现原理到测试验证进行完整剖析,帮助你快速定位进程身份、检测异常句柄与通信关系。

命令定位与基本用法

在 pwndbg 中,procinfo归属于CommandCategory.PROCESS(进程类别),与pid命令(别名getpid,见 pwndbg/commands/procinfo.py)同处一个模块。它的功能定位正如源码装饰器与文档所写:"Display information about the running process"(显示运行中进程的信息)。

命令签名非常简单,文档中给出的完整用法为:

usage: procinfo [-h]

唯一可选的命令行参数是帮助选项:

ShortLongHelp
-h--helpshow this help message and exit

也就是说,procinfo不接受任何位置参数,直接在调试会话中执行procinfo即可。注意两点使用前提:

  • 命令通过@pwndbg.commands.OnlyWhenRunning装饰(pwndbg/commands/procinfo.py),只有目标程序处于运行状态时才会输出信息;程序尚未启动时,pwndbg 会输出 GDB 层面的提示The program is not being run。这一点由测试test_command_procinfo_before_binary_start(tests/library/gdb/tests/test_command_procinfo.py)直接验证。
  • 若调试目标是 QEMU 模拟器,命令会先打印一条警告:检测到 QEMU 目标时,展示的是 qemu 进程自身的信息,对于直接由 qemu 进程使用的部分会略有偏差(pwndbg/commands/procinfo.py)。

输出字段逐项解读

procinfo的输出按照"进程身份 → 权限 → 文件描述符"三个层次组织。命令主函数(pwndbg/commands/procinfo.py)依次打印以下字段,所有字段名左对齐固定宽度 10 个字符:

字段含义数据来源
exe可执行文件路径,取自 auxv 的AT_EXECFNpwndbg/auxv.py
cmdline完整命令行,各参数用shlex.quote安全拼接/proc/PID/cmdline
cwd当前工作目录(带引号包裹)/proc/PID/cwd符号链接
pid/tid进程 ID 与线程 IDpwndbg/aglib/proc.py
selinuxSELinux 上下文,仅当非空且非unconfined时打印/proc/PID/task/TID/attr/current
ppid父进程 ID/proc/PID/task/PID/status
uid/gid真实/有效/保存/文件系统 4 元组/proc/PID/task/PID/status
groups进程所属组列表/proc/PID/task/PID/status
fd[N]打开的文件描述符,含套接字与管道的增强描述/proc/PID/fd+ 网络/管道解析

代码中的打印顺序固定为:execmdlinecwdpidtid→(可选selinux)→ppiduidgidgroups→ 全部fd[N](pwndbg/commands/procinfo.py)。

其中 uid/gid 的 4 元组依次对应 real / effective / saved / filesystem 四类 ID,这一结构与源码注释中引用的 PEDA 输出格式一致(pwndbg/commands/procinfo.py):

exe = /bin/bash fd[0] -> /dev/pts/96 pid = 31102 ppid = 31096 uid = [287138, 287138, 287138, 287138] gid = [5000, 5000, 5000, 5000]

能力集(capabilities)的解码

/proc/PID/task/PID/status中的CapEffCapInhCapPrmCapBnd字段在输出时会被 pwndbg 从位掩码解码为人类可读的能力名称列表(pwndbg/commands/procinfo.py)。能力编号到名称的映射表内置于源码中(pwndbg/commands/procinfo.py),覆盖CAP_CHOWN(0) 到CAP_BLOCK_SUSPEND(36) 共 37 项,常见项包括:

  • CAP_NET_BIND_SERVICE(10):允许绑定 1024 以下特权端口
  • CAP_NET_RAW(13):允许使用原始套接字
  • CAP_SYS_PTRACE(19):允许对任意进程执行 ptrace
  • CAP_SYS_ADMIN(21):广泛的系统管理能力
  • CAP_SYSLOG(34):允许读取内核日志

这意味着在调试特权程序或逆向分析"降权后重新提权"逻辑时,procinfo输出的能力列表可以帮你快速判断进程保留了哪些特权位。

文件描述符的智能增强:连接、管道与对端信息

procinfo最核心的价值在于把朴素的 fd 列表(如socket:[102422]pipe:[4111551])翻译成可读信息。其实现流程为(pwndbg/commands/procinfo.py):

  1. 遍历/proc/PID/fd收集全部 fd 的 readlink 目标;
  2. 对每个socket:[inode]类型的 fd,与解析后的 TCP/TCP6/Unix/Netlink 套接字表按 inode 匹配,替换为连接描述;
  3. 对每个pipe:[inode]类型的 fd,解析为管道对象并标注读写端与对端;
  4. 最终统一打印。

TCP / TCP6 连接

TCP 套接字来自/proc/PID/net/tcp/proc/PID/net/tcp6,由 pwndbg/lib/net.py 解析。输出格式为:

tcp 192.168.0.14:52672 => 172.67.180.218:443 (established)

解析器把内核十六进制小端格式的 IP:端口还原为点分/冒号分隔地址(IPv6 按 4 个 32 位小端块重排,参考 pwndbg/lib/net.py),并把状态码映射为可读名称(pwndbg/lib/net.py):01=established、02=syn_sent、0A=listen、08=close_wait、06=time_wait 等共 11 种 TCP 状态。

Unix 域套接字与对端进程

Unix 套接字解析自/proc/PID/net/unix,输出形如:

unix '/tmp/demo.sock' (inode=12345) unix '(anonymous)' (inode=54321, peer pid=7157 'firefox' fd=8)

对于匿名 Unix 套接字,pwndbg 会进一步通过内核NETLINK_SOCK_DIAG子系统的unix_diag接口查询对端 inode(pwndbg/lib/sock_diag.py),再遍历/proc/*/fd找到持有对端 inode 的进程,输出pidcommfd(pwndbg/commands/procinfo.py)。这一能力在调试 Android 应用与服务进程之间的 Binder / socketpair 通信时尤为有用。注意:SOCK_DIAG 只能查询本地内核,因此远程调试目标会自动跳过该增强(pwndbg/commands/procinfo.py)。

Netlink 套接字

Netlink 解析自/proc/PID/net/netlink(pwndbg/lib/net.py),输出协议族名称与多播组位标志,例如:

socket:NETLINK_ROUTE (inode=54321, portid=123, groups=RTMGRP_LINK|RTMGRP_IPV4_IFADDR)

协议族映射表(NETLINK_ROUTENETLINK_SOCK_DIAGNETLINK_AUDIT等 22 项)与RTMGRP_*组位名称均内置于 pwndbg/lib/net.py,仅对NETLINK_ROUTE解码组位,其余协议族按十六进制显示。

匿名管道的读写端与对端

匿名管道(pipe:[inode])的解析是独立的 pwndbg/lib/proc_fd.py 模块,输出形如:

fd[6] pipe:[4111551] (w, peers: pid=12233 'curl' fd=7 r)

其中:

  • mode/proc/PID/fdinfo/FDflags字段(八进制 open 标志)解析,取最低两位得到r(O_RDONLY)/w(O_WRONLY)/rw(O_RDWR)(pwndbg/lib/proc_fd.py);
  • peers列出所有持有同一管道 inode 的其他 fd。本地调试时通过遍历系统/proc/*/fd实现(尽力而为,权限不足的进程会被跳过,与lsof非 root 行为一致,pwndbg/lib/proc_fd.py);远程调试时则借助 GDB stub 的qXfer:osdata"files" 表在远端完成同样的遍历(pwndbg/commands/procinfo.py)。

该模块的设计动机与用途在 pwndbg/lib/proc_fd.py 的模块注释中有明确说明:把pipe:[N]这样的裸 fd 变成一组(pid, fd, comm)端点,让用户一眼看清"谁在管道的另一端"。

底层实现要点

数据获取的本地/远程统一抽象

所有/proc读取都通过pwndbg.aglib.file.get()pwndbg.aglib.file.readlink()完成(见 pwndbg/commands/procinfo.py)。本地调试时直接读宿主机的 procfs;远程调试(如 Android 设备上的 gdbserver)时则经由 GDB 的vFile协议在目标机上读取——这正是 docs/features.md 强调"pwndbg 与远程 GDB 调试(如 Android 手机)配合良好"的底层原因。与之对应,pwndbg/lib/net.py的模块注释也明确指出其价值在于"复刻 psutil 的部分功能,使其在远程调试会话中也可用"(pwndbg/lib/net.py)。

status 字段的自动化类型解析

/proc/PID/task/PID/status的解析逻辑(pwndbg/commands/procinfo.py)按值形态做类型推断:

  • 16 位十六进制纯 hex 串 → 按int(x, 16)转整数(如SigBlkCapEff位图);
  • kB/mB后缀 → 换算为字节数(如VmRSSVmSize);
  • 纯数字 → 转int(如PidPPidThreads);
  • 空格分隔的纯数字 → 转整数列表(如UidGidGroups);
  • CapEff/CapInh/CapPrm/CapBnd→ 转能力名称列表。

解析结果既作为字典status返回,也会被setattr挂到Process对象上(pwndbg/commands/procinfo.py),因此proc.ppidproc.uidproc.groups等属性可直接访问。

缓存策略

Process类的各个属性(selinuxcmdlinecwdstatusopen_filesconnectionspipes)均以@pwndbg.lib.cache.cache_until("stop")装饰(pwndbg/commands/procinfo.py),即仅在调试器停止事件(stop)时失效重算。这样在一次停止点连续多次执行procinfo或多次访问属性时,底层/proc不会反复读取,开销被压到最低。

非可打印字符的兜底

打印 fd 时,若路径中包含不可打印字符,则用repr()包裹展示(pwndbg/commands/procinfo.py);Unix 套接字解析时使用errors="ignore"忽略非法编码,以规避特定内核版本产生的损坏 UDS 数据(pwndbg/commands/procinfo.py)。这些细节保证了输出在异常目标上也不会抛异常。

测试验证:行为是如何被保障的

pwndbg 用四类测试二进制 + 多个测试用例锁定了procinfo的关键行为(测试二进制源码位于 tests/binaries/host/ 下):

  • TCP 连接test_command_procinfo_net启动一个真实 TCP server,断言procinfo输出首行为exe、第 4 行为pid,且结果中包含127.0.0.1:port(IPv4)与[::1]:port(IPv6)格式的连接行(tests/library/dbg/tests/test_command_procinfo.py);
  • Netlink 解码test_command_procinfo_netlink断言socket:NETLINK_ROUTERTMGRP_LINKRTMGRP_IPV4_IFADDRinode=portid=均出现在输出中(tests/library/dbg/tests/test_command_procinfo.py);
  • Unix socketpair 对端test_command_procinfo_unix_socketpair_peer断言两条匿名 unix 连接行都带有指向本进程的pid=fd=inode=peer 信息(tests/library/dbg/tests/test_command_procinfo.py);
  • 管道读写端test_command_procinfo_pipe断言同一进程内至少存在一对自指 peer 的管道行,且同时存在(r,(w,两种 mode(tests/library/dbg/tests/test_command_procinfo.py)。

GDB 侧还有等价的参数化测试 tests/library/gdb/tests/test_command_procinfo.py,以及验证"程序未运行时不输出"的负向用例。远程场景下管道对端的回退逻辑由 tests/library/gdb/tests/test_remote_pipe_peers.py 覆盖。

典型使用场景小结

  • 逆向/漏洞分析起步start之后先procinfo,确认程序身份、UID/GID/能力集与工作目录,判断降权、沙箱、SELinux 约束等前提条件;
  • 检查文件句柄:定位程序打开的配置文件、日志、设备(如/dev/dri/renderD129)、匿名 inode 与 eventfd,辅助分析持久化行为;
  • 通信关系梳理:通过 TCP/Unix/Netlink/管道四类增强输出,快速判断调试对象正在与哪些地址、哪些进程交换数据,是分析 C2 通信、服务端程序与多进程协作程序的利器;
  • 远程调试(含 Android):所有/proc数据经vFile远程读取,跨机器调试时依然可用;SOCK_DIAG 类对端查询自动退化为"未知",不影响主流程。

更完整的命令索引见 docs/commands/index.md,安装与上手方式见 docs/setup.md 与 README.md。

【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB & LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 12:16:32

Dynamics CRM证书更换实战:通信、加密与IFD三层面避坑指南

去年帮一个客户处理过一次Dynamics CRM证书更换,本来以为两小时就能收工,结果从下午一直折腾到晚上。网页端其实早就恢复正常了,但异步服务一直报证书校验失败,工作流全部卡在等待中,Outlook客户端也间歇性连不上。那时…

作者头像 李华
网站建设 2026/9/15 12:11:42

分布式系统排查实战:从现象到根因的收缩法

1. 分布式系统排查,难的不是命令而是思路分布式系统问题排查这件事,我从最早的单体应用运维一路做到现在管着几十个微服务、上百个实例的集群,最大的感受是:真正让人抓狂的从来不是你记不住某个命令,而是你根本不知道该…

作者头像 李华
网站建设 2026/9/15 12:11:38

EIP-233 解读:以太坊硬分叉的正式流程与 Meta EIP 规范

EIP-233 解读:以太坊硬分叉的正式流程与 Meta EIP 规范 【免费下载链接】EIPs The Ethereum Improvement Proposal repository 项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs EIP-233(Formal process of hard forks)是由 Al…

作者头像 李华
网站建设 2026/9/15 12:10:59

龙门四轴上下料系统开发与台达AS228T应用实践

1. 龙门上下料四轴系统概述在工业自动化领域,龙门式上下料系统结合四轴机械手的应用已经成为现代智能产线的标准配置。这种系统通常由机械结构、运动控制单元和人机交互界面三大部分组成。我们这次实践采用的是台达AS228T运动控制器搭配威纶通触摸屏的方案&#xff…

作者头像 李华
网站建设 2026/9/15 12:09:29

3步实现qq直接登录网站无需下载,附避坑指南

3步实现qq直接登录网站无需下载,附避坑指南 网站被黑挂马不知道怎么办?别慌,先检查登录接口是否裸露。很多站长为了省事,直接调用第三方接口却不加验证,这就是最大的漏洞。这篇避坑指南,专为设计师转前端的你准备,用真实案例拆解如何安全实现qq直接登录网站无需下载,避开90%的新手坑。…

作者头像 李华