1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
from __future__ import absolute_import
from __future__ import division
import argparse
import os
import signal
import sys
import io
import pwnlib.args
pwnlib.args.free_form = False
from pwn import *
from pwnlib.commandline import common
parser = common.parser_commands.add_parser(
'phd',
help = 'Pretty hex dump',
description = 'Pretty hex dump'
)
parser.add_argument(
'file',
metavar='file',
nargs='?',
help='File to hexdump. Reads from stdin if missing.',
type=argparse.FileType('rb'),
default=getattr(sys.stdin, 'buffer', sys.stdin)
)
parser.add_argument(
"-w", "--width",
help="Number of bytes per line.",
default='16',
)
parser.add_argument(
"-l", "--highlight",
help="Byte to highlight.",
nargs="*",
)
parser.add_argument(
"-s", "--skip",
help="Skip this many initial bytes.",
default='0',
)
parser.add_argument(
"-c", "--count",
help="Only show this many bytes.",
default='-1',
)
parser.add_argument(
"-o", "--offset",
help="Addresses in left hand column starts at this address.",
default='0',
)
parser.add_argument(
"--color",
nargs='?',
help="Colorize the output. When 'auto' output is colorized exactly when stdout is a TTY. Default is 'auto'.",
choices = ('always', 'never', 'auto'),
default='auto',
)
def asint(s):
if s.startswith('0x'):
return int(s, 16)
elif s.startswith('0'):
return int(s, 8)
else:
return int(s, 10)
def main(args):
infile = args.file
width = asint(args.width)
skip = asint(args.skip)
count = asint(args.count)
offset = asint(args.offset)
# if `--color` has no argument it is `None`
color = args.color or 'always'
text.when = color
if skip:
try:
infile.seek(skip, os.SEEK_CUR)
except IOError:
infile.read(skip)
if count != -1:
infile = io.BytesIO(infile.read(count))
hl = []
if args.highlight:
for hs in args.highlight:
for h in hs.split(','):
hl.append(asint(h))
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
try:
for line in hexdump_iter(infile, width, highlight = hl, begin = offset + skip):
print(line)
except (KeyboardInterrupt, IOError):
pass
if __name__ == '__main__':
pwnlib.commandline.common.main(__file__, main)
|