Port procinfo (#2550)

* Port commands to agnostic: procinfo, pid. Additionally drop unused android support.

Later we should check android support and implement it proper.

* procinfo: drop class
pull/2559/head
patryk4815 1 year ago committed by GitHub
parent be05019504
commit a2fa68f7ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -719,7 +719,6 @@ def load_commands() -> None:
import pwndbg.commands.pcplist import pwndbg.commands.pcplist
import pwndbg.commands.peda import pwndbg.commands.peda
import pwndbg.commands.plist import pwndbg.commands.plist
import pwndbg.commands.procinfo
import pwndbg.commands.radare2 import pwndbg.commands.radare2
import pwndbg.commands.reload import pwndbg.commands.reload
import pwndbg.commands.rizin import pwndbg.commands.rizin
@ -759,6 +758,7 @@ def load_commands() -> None:
import pwndbg.commands.pie import pwndbg.commands.pie
import pwndbg.commands.plist import pwndbg.commands.plist
import pwndbg.commands.probeleak import pwndbg.commands.probeleak
import pwndbg.commands.procinfo
import pwndbg.commands.retaddr import pwndbg.commands.retaddr
import pwndbg.commands.search import pwndbg.commands.search
import pwndbg.commands.sigreturn import pwndbg.commands.sigreturn

@ -3,12 +3,13 @@ from __future__ import annotations
import shlex import shlex
import string import string
import pwndbg.aglib.file
import pwndbg.aglib.proc
import pwndbg.aglib.qemu
import pwndbg.auxv import pwndbg.auxv
import pwndbg.commands import pwndbg.commands
import pwndbg.gdblib.file
import pwndbg.gdblib.net
import pwndbg.gdblib.proc
import pwndbg.lib.cache import pwndbg.lib.cache
import pwndbg.lib.net
from pwndbg.color import message from pwndbg.color import message
from pwndbg.commands import CommandCategory from pwndbg.commands import CommandCategory
@ -66,12 +67,37 @@ capabilities = {
} }
def tcp():
# For reference, see:
# https://www.kernel.org/doc/Documentation/networking/proc_net_tcp.txt
"""
It will first list all listening TCP sockets, and next list all established
TCP connections. A typical entry of /proc/net/tcp would look like this (split
up into 3 parts because of the length of the line):
"""
data = pwndbg.aglib.file.get("/proc/net/tcp").decode()
return pwndbg.lib.net.tcp(data)
def unix():
# We use errors=ignore because of https://github.com/pwndbg/pwndbg/issues/1544
# TODO/FIXME: this may not be the best solution because we may end up with
# invalid UDS data. Can this be a problem?
data = pwndbg.aglib.file.get("/proc/net/unix").decode(errors="ignore")
return pwndbg.lib.net.unix(data)
def netlink():
data = pwndbg.aglib.file.get("/proc/net/netlink").decode()
return pwndbg.lib.net.netlink(data)
class Process: class Process:
def __init__(self, pid=None, tid=None) -> None: def __init__(self, pid=None, tid=None) -> None:
if pid is None: if pid is None:
pid = pwndbg.gdblib.proc.pid pid = pwndbg.aglib.proc.pid
if tid is None: if tid is None:
tid = pwndbg.gdblib.proc.tid tid = pwndbg.aglib.proc.tid
if not tid: if not tid:
tid = pid tid = pid
self.pid = pid self.pid = pid
@ -81,25 +107,25 @@ class Process:
@pwndbg.lib.cache.cache_until("stop") @pwndbg.lib.cache.cache_until("stop")
def selinux(self): def selinux(self):
path = "/proc/%i/task/%i/attr/current" % (self.pid, self.tid) path = "/proc/%i/task/%i/attr/current" % (self.pid, self.tid)
raw = pwndbg.gdblib.file.get(path) raw = pwndbg.aglib.file.get(path)
return raw.decode().rstrip("\x00").strip() return raw.decode().rstrip("\x00").strip()
@property @property
@pwndbg.lib.cache.cache_until("stop") @pwndbg.lib.cache.cache_until("stop")
def cmdline(self): def cmdline(self):
raw = pwndbg.gdblib.file.get(f"/proc/{self.pid}/cmdline") raw = pwndbg.aglib.file.get(f"/proc/{self.pid}/cmdline")
return " ".join(map(shlex.quote, raw.decode().split("\x00"))) return " ".join(map(shlex.quote, raw.decode().split("\x00")))
@property @property
@pwndbg.lib.cache.cache_until("stop") @pwndbg.lib.cache.cache_until("stop")
def cwd(self) -> str: def cwd(self) -> str:
link = pwndbg.gdblib.file.readlink(f"/proc/{self.pid}/cwd") link = pwndbg.aglib.file.readlink(f"/proc/{self.pid}/cwd")
return f"'{link}'" return f"'{link}'"
@property @property
@pwndbg.lib.cache.cache_until("stop") @pwndbg.lib.cache.cache_until("stop")
def status(self): def status(self):
raw = pwndbg.gdblib.file.get("/proc/%i/task/%i/status" % (self.pid, self.tid)) raw = pwndbg.aglib.file.get("/proc/%i/task/%i/status" % (self.pid, self.tid))
status = {} status = {}
for line in raw.splitlines(): for line in raw.splitlines():
@ -157,7 +183,7 @@ class Process:
fds = {} fds = {}
for i in range(self.fdsize): for i in range(self.fdsize):
link = pwndbg.gdblib.file.readlink("/proc/%i/fd/%i" % (pwndbg.gdblib.proc.pid, i)) link = pwndbg.aglib.file.readlink("/proc/%i/fd/%i" % (pwndbg.aglib.proc.pid, i))
if link: if link:
fds[i] = link fds[i] = link
@ -173,7 +199,7 @@ class Process:
socket = "socket:[" socket = "socket:["
result = [] result = []
functions = [pwndbg.gdblib.net.tcp, pwndbg.gdblib.net.unix, pwndbg.gdblib.net.netlink] functions = [tcp, unix, netlink]
for fd, path in fds.items(): for fd, path in fds.items():
if socket not in path: if socket not in path:
@ -196,7 +222,7 @@ class Process:
) )
@pwndbg.commands.OnlyWhenRunning @pwndbg.commands.OnlyWhenRunning
def pid() -> None: def pid() -> None:
print(pwndbg.gdblib.proc.pid) print(pwndbg.aglib.proc.pid)
@pwndbg.commands.ArgparsedCommand( @pwndbg.commands.ArgparsedCommand(
@ -207,7 +233,7 @@ def procinfo() -> None:
""" """
Display information about the running process. Display information about the running process.
""" """
if pwndbg.gdblib.qemu.is_qemu(): if pwndbg.aglib.qemu.is_qemu():
print( print(
message.error( message.error(
"QEMU target detected: showing result for the qemu process" "QEMU target detected: showing result for the qemu process"
@ -241,14 +267,9 @@ def procinfo() -> None:
print("%-10s %s" % ("ppid", proc.ppid)) print("%-10s %s" % ("ppid", proc.ppid))
if not pwndbg.gdblib.android.is_android():
print("%-10s %s" % ("uid", proc.uid)) print("%-10s %s" % ("uid", proc.uid))
print("%-10s %s" % ("gid", proc.gid)) print("%-10s %s" % ("gid", proc.gid))
print("%-10s %s" % ("groups", proc.groups)) print("%-10s %s" % ("groups", proc.groups))
else:
print("%-10s %s" % ("uid", list(map(pwndbg.lib.android.aid_name, proc.uid))))
print("%-10s %s" % ("gid", list(map(pwndbg.lib.android.aid_name, proc.gid))))
print("%-10s %s" % ("groups", list(map(pwndbg.lib.android.aid_name, proc.groups))))
for fd, path in files.items(): for fd, path in files.items():
if not set(path) < set(string.printable): if not set(path) < set(string.printable):

@ -10,7 +10,6 @@ import socket
from typing import List from typing import List
import pwndbg.aglib.arch import pwndbg.aglib.arch
import pwndbg.gdblib.file
# http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h # http://students.mimuw.edu.pl/lxr/source/include/net/tcp_states.h
TCP_STATUSES = { TCP_STATUSES = {

Loading…
Cancel
Save