Skip to content

Commit

Permalink
adding parse_arguments for pie * commands (#659)
Browse files Browse the repository at this point in the history
  • Loading branch information
hugsy committed Jul 1, 2021
1 parent 2b5bb29 commit 5fb2e90
Showing 1 changed file with 31 additions and 23 deletions.
54 changes: 31 additions & 23 deletions gef.py
Expand Up @@ -131,7 +131,7 @@ def update_gef(argv):


try:
import gdb # pylint: disable=import-error
import gdb # pylint: disable=
except ImportError:
# if out of gdb, the only action allowed is to update gef.py
if len(sys.argv) == 2 and sys.argv[1].lower() in ("--update", "--upgrade"):
Expand Down Expand Up @@ -3559,7 +3559,8 @@ def safe_parse_and_eval(value):
try:
return gdb.parse_and_eval(value)
except gdb.error:
return None
pass
return None


@lru_cache()
Expand Down Expand Up @@ -4272,7 +4273,7 @@ def __set_repeat_count(self, argv, from_tty):
# Copy/paste this template for new command
# @register_command
# class TemplateCommand(GenericCommand):
# """TemplateCommand: description here will be seen in the help menu for the command."""
# """TemplateCommand: description here will be seen in the help menu for the command."""
# _cmdline_ = "template-fake"
# _syntax_ = "{:s}".format(_cmdline_)
# _aliases_ = ["tpl-fk",]
Expand Down Expand Up @@ -4412,18 +4413,16 @@ class PieBreakpointCommand(GenericCommand):
_cmdline_ = "pie breakpoint"
_syntax_ = "{:s} BREAKPOINT".format(_cmdline_)

def do_invoke(self, argv):
@parse_arguments({"expression": ""}, {})
def do_invoke(self, argv, *args, **kwargs):
global __pie_counter__, __pie_breakpoints__
if len(argv) < 1:
self.usage()
return
bp_expr = " ".join(argv)

if bp_expr[0] == "*":
addr = int(gdb.parse_and_eval(bp_expr[1:]))
else:
addr = int(gdb.parse_and_eval("&{}".format(bp_expr))) # get address of symbol or function name

args = kwargs["arguments"]
bp_expr = args.expression[1:] if args.expression[0] == "*" else "&{}".format(args.expression)
addr = int(gdb.parse_and_eval(bp_expr))
self.set_pie_breakpoint(lambda base: "b *{}".format(base + addr), addr)

# When the process is already on, set real breakpoints immediately
Expand All @@ -4432,12 +4431,14 @@ def do_invoke(self, argv):
base_address = [x.page_start for x in vmmap if x.path == get_filepath()][0]
for bp_ins in __pie_breakpoints__.values():
bp_ins.instantiate(base_address)
return

@staticmethod
def set_pie_breakpoint(set_func, addr):
global __pie_counter__, __pie_breakpoints__
__pie_breakpoints__[__pie_counter__] = PieVirtualBreakpoint(set_func, __pie_counter__, addr)
__pie_counter__ += 1
return


@register_command
Expand All @@ -4447,23 +4448,24 @@ class PieInfoCommand(GenericCommand):
_cmdline_ = "pie info"
_syntax_ = "{:s} BREAKPOINT".format(_cmdline_)

def do_invoke(self, argv):
@parse_arguments({"breakpoints": [-1,]}, {})
def do_invoke(self, argv, *args, **kwargs):
global __pie_breakpoints__
if len(argv) < 1:

args = kwargs["arguments"]
if args.breakpoints[0] == -1:
# No breakpoint info needed
bps = [__pie_breakpoints__[x] for x in __pie_breakpoints__]
else:
try:
bps = [__pie_breakpoints__[int(x)] for x in argv]
except ValueError:
err("Please give me breakpoint number")
return
bps = [__pie_breakpoints__[x] for x in args.breakpoints]

lines = []
lines.append("VNum\tNum\tAddr")
lines += [
"{}\t{}\t{}".format(x.vbp_num, x.bp_num if x.bp_num else "N/A", x.addr) for x in bps
]
gef_print("\n".join(lines))
return


@register_command
Expand All @@ -4473,16 +4475,18 @@ class PieDeleteCommand(GenericCommand):
_cmdline_ = "pie delete"
_syntax_ = "{:s} [BREAKPOINT]".format(_cmdline_)

def do_invoke(self, argv):
@parse_arguments({"breakpoints": [-1,]}, {})
def do_invoke(self, argv, *args, **kwargs):
global __pie_breakpoints__
if len(argv) < 1:
args = kwargs["arguments"]
if args.breakpoints[0] == -1:
# no arg, delete all
to_delete = [__pie_breakpoints__[x] for x in __pie_breakpoints__]
self.delete_bp(to_delete)
try:
self.delete_bp([__pie_breakpoints__[int(x)] for x in argv])
except ValueError:
err("Please input PIE virtual breakpoint number to delete")
else:
self.delete_bp([__pie_breakpoints__[x] for x in args.breakpoints])
return


@staticmethod
def delete_bp(breakpoints):
Expand All @@ -4493,6 +4497,7 @@ def delete_bp(breakpoints):
gdb.execute("delete {}".format(bp.bp_num))
# delete virtual breakpoints
del __pie_breakpoints__[bp.vbp_num]
return


@register_command
Expand Down Expand Up @@ -4535,6 +4540,7 @@ def do_invoke(self, argv):
except gdb.error as e:
err(e)
gdb.execute("kill")
return


@register_command
Expand All @@ -4558,6 +4564,7 @@ def do_invoke(self, argv):
for bp_ins in __pie_breakpoints__.values():
bp_ins.instantiate(base_address)
gdb.execute("context")
return


@register_command
Expand All @@ -4581,6 +4588,7 @@ def do_invoke(self, argv):
for bp_ins in __pie_breakpoints__.values():
bp_ins.instantiate(base_address)
gdb.execute("context")
return


@register_command
Expand Down

0 comments on commit 5fb2e90

Please sign in to comment.