mirror of https://github.com/pwndbg/pwndbg.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
|
|
import pwndbg.aglib.kernel.kallsyms
|
|
import pwndbg.commands
|
|
from pwndbg.color import message
|
|
from pwndbg.commands import CommandCategory
|
|
|
|
parser = argparse.ArgumentParser(description="Lookup kernel symbols")
|
|
|
|
parser.add_argument("symbol", type=str, nargs="?", help="Address or symbol name to lookup")
|
|
parser.add_argument(
|
|
"-a", "--apply", action="store_true", help="applies all the symbols that satisfy the filter"
|
|
)
|
|
|
|
|
|
@pwndbg.commands.Command(parser, aliases=["kallsyms"], category=CommandCategory.KERNEL)
|
|
@pwndbg.commands.OnlyWhenQemuKernel
|
|
@pwndbg.commands.OnlyWhenPagingEnabled
|
|
def klookup(symbol: str, apply: bool) -> None:
|
|
ksyms = pwndbg.aglib.kernel.kallsyms.get()
|
|
syms = []
|
|
try:
|
|
symbol_addr = int(symbol, 0)
|
|
for sym in ksyms:
|
|
if sym[2] == symbol_addr:
|
|
syms.append(sym)
|
|
if len(syms) == 0:
|
|
print(message.error(f"No symbol found at {symbol_addr:#x}"))
|
|
except (ValueError, TypeError):
|
|
for sym in ksyms:
|
|
if symbol is None or symbol in sym[0]:
|
|
syms.append(sym)
|
|
if len(syms) == 0:
|
|
print(message.error(f"No symbol found for {symbol}"))
|
|
for sym_name, sym_type, sym_addr in syms:
|
|
print(message.success(f"{sym_addr:#x} {sym_type} {sym_name}"))
|
|
|
|
if apply:
|
|
path = pwndbg.commands.cymbol.create_blank_elf()
|
|
if path is None:
|
|
return
|
|
try:
|
|
# path is not None means lief is installed
|
|
import lief
|
|
|
|
symelf = lief.ELF.parse(path)
|
|
for sym_name, sym_type, sym_addr in syms:
|
|
symelf.add_symtab_symbol(symelf.export_symbol(sym_name, sym_addr))
|
|
symelf.write(path)
|
|
pwndbg.dbg.selected_inferior().add_symbol_file(path)
|
|
print(message.success(f"Added {len(syms)} symbols"))
|
|
except Exception as e:
|
|
print(message.error(e))
|