Skip to content

Commit

Permalink
tools/run_guest.py: Add --append-payload
Browse files Browse the repository at this point in the history
Add command-line option for appending a separate file (or files) to
the payload.
  • Loading branch information
povik committed Oct 12, 2021
1 parent a1ecb18 commit 3d41c62
Showing 1 changed file with 66 additions and 1 deletion.
67 changes: 66 additions & 1 deletion proxyclient/tools/run_guest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
parser.add_argument('-S', '--shell', action="store_true")
parser.add_argument('-e', '--hook-exceptions', action="store_true")
parser.add_argument('-d', '--debug-xnu', action="store_true")
parser.add_argument('-a', '--append-payload', type=pathlib.Path, action="append", default=[])
parser.add_argument('payload', type=pathlib.Path)
parser.add_argument('boot_args', default=[], nargs="*")
args = parser.parse_args()
Expand Down Expand Up @@ -43,7 +44,71 @@
symfile = None
if args.symbols:
symfile = args.symbols.open("rb")
hv.load_macho(args.payload.open("rb"), symfile=symfile)


class Concat:
'''
Present the file interface over a concatenation of couple
component files.
'''
def __init__(self, *components):
self._components = components
sizes = [f.seek(0, 2) for f in components]
for f in components:
f.seek(0, 0)
self._offsets = [sum(sizes[:n]) for n in range(len(components))]
self._ends = [sum(sizes[:n+1]) for n in range(len(components))]
self._size = sum(sizes)
self._pos = 0
self._remaining = list(components)

def read(self, size=-1):
ret = bytearray()
if not len(self._remaining):
return bytes() # EOF
current = self._remaining[0]
while size:
read = current.read(size if size>=0 else -1)
if len(read):
self._pos += len(read)
size -= len(read)
ret += read
else:
self._remaining.pop(0)
if not len(self._remaining):
break
else:
current = self._remaining[0]
return bytes(ret)

def tell(self):
return self._pos

def seek(self, pos, whence=0):
if whence == 1:
pos += self._pos
elif whence == 2:
pos += self._size
remaining = []
for i, f in enumerate(self._components):
if self._ends[i] <= pos:
continue
if self._offsets[i] < pos:
f.seek(pos - self._offsets[i])
else:
f.seek(0)
remaining.append(f)
self._pos = pos
self._remaining = remaining
return pos


payload = args.payload.open("rb")

if args.append_payload:
payload = Concat(payload, *[p.open("rb") for p in args.append_payload])

hv.load_macho(payload, symfile=symfile)

for i in args.script:
try:
Expand Down

0 comments on commit 3d41c62

Please sign in to comment.