diff --git a/pwndbg/commands/windbg.py b/pwndbg/commands/windbg.py index 0c1ab2743..80260f384 100644 --- a/pwndbg/commands/windbg.py +++ b/pwndbg/commands/windbg.py @@ -42,7 +42,7 @@ def db(address, count=64): Starting at the specified address, dump N bytes (default 64). """ - return dX(1, (address), (count)) + return dX(1, address, count, repeat=db.repeat) parser = argparse.ArgumentParser(description="Starting at the specified address, dump N words.") @@ -55,7 +55,7 @@ def dw(address, count=32): Starting at the specified address, dump N words (default 32). """ - return dX(2, (address), (count)) + return dX(2, address, count, repeat=dw.repeat) parser = argparse.ArgumentParser(description="Starting at the specified address, dump N dwrods.") @@ -68,7 +68,7 @@ def dd(address, count=16): Starting at the specified address, dump N dwords (default 16). """ - return dX(4, (address), (count)) + return dX(4, address, count, repeat=dd.repeat) parser = argparse.ArgumentParser(description="Starting at the specified address, dump N qwords.") parser.add_argument("address", type=int, help="The address to dump from.") @@ -80,7 +80,7 @@ def dq(address, count=8): Starting at the specified address, dump N qwords (default 8). """ - return dX(8, (address), (count)) + return dX(8, address, count, repeat=dq.repeat) parser = argparse.ArgumentParser(description="Starting at the specified address, hexdump.") parser.add_argument("address", type=int, help="The address to dump from.") @@ -88,16 +88,23 @@ parser.add_argument("count", type=int, default=8, nargs="?", help="The number of @pwndbg.commands.ArgparsedCommand(parser) @pwndbg.commands.OnlyWhenRunning def dc(address, count=8): - return pwndbg.commands.hexdump.hexdump(address=address, count=count) + return pwndbg.commands.hexdump.hexdump(address=address, count=count, repeat=dc.repeat) -def dX(size, address, count, to_string=False): +def dX(size, address, count, to_string=False, repeat=False): """ Traditionally, windbg will display 16 bytes of data per line. """ values = [] - address = int(address) & pwndbg.arch.ptrmask + + if repeat: + count = dX.last_count + address = dX.last_address + else: + address = int(address) & pwndbg.arch.ptrmask + count = int(count) + type = get_type(size) - count = int(count) + for i in range(count): try: gval = pwndbg.memory.poi(type, address + i * size) @@ -124,6 +131,9 @@ def dX(size, address, count, to_string=False): if not to_string: print('\n'.join(lines)) + dX.last_count = count + dX.last_address = address + len(rows)*16 + return lines def enhex(size, value):