Guess where TOC is when no TVectors are exported

This commit is contained in:
Elliot Nunn 2019-10-16 12:23:37 +08:00
parent e3704d0f41
commit 379beed301
1 changed files with 25 additions and 5 deletions

View File

@ -627,11 +627,13 @@ def dump_highlevel(basepath):
relocs = read_python(basepath, 'dump-lowlevel', 'relocations.txt')
relocs = {(rl['section'], rl['offset']): rl['to'] for rl in relocs}
# The base of the TOC is not guaranteed to be the base of the data section
# The base of the TOC is not guaranteed to be the base of the data section... what is the TOC of our exported funcs?
tvectors = [dct for dct in read_python(basepath, 'dump-lowlevel', 'exports.txt') if dct['kind'] == 'tvector']
tvectors.extend(read_python(basepath, 'dump-lowlevel', 'mainvectors.txt').values())
tvectors = [(tv['section'], tv['offset']) for tv in tvectors]
# Failing that, the TOC of our init/main/term funcs
tvectors.extend(read_python(basepath, 'dump-lowlevel', 'mainvectors.txt').values())
tvectors = [(tv['section'], tv['offset']) for tv in tvectors]
table_of_contents = {}
for section, offset in tvectors: # (section, offset) tuple
reloc_kind, toc_section = relocs.get((section, offset + 4), (None, None))
@ -640,10 +642,28 @@ def dump_highlevel(basepath):
toc_offset, = struct.unpack_from('>L', secdata, offset + 4)
table_of_contents = dict(section=toc_section, offset=toc_offset)
write_python(table_of_contents, basepath, 'dump-highlevel', 'table-of-contents.txt')
break
print(repr(table_of_contents))
# Sometimes we need to fall back on an educated guess based on our apparent tvectors
if not table_of_contents:
guesses = []
for (reloc_sec, reloc_offset), (reloc_kind, reloc_targ_section) in relocs.items():
if 'data' in reloc_sec and reloc_kind == 'section' and 'code' in reloc_targ_section:
toc_reloc_kind, toc_reloc_targ_section = relocs.get((reloc_sec, reloc_offset+4), (None, None))
if toc_reloc_kind == 'section' and 'data' in toc_reloc_targ_section:
secdata = read_bin(basepath, reloc_sec)
toc_offset, = struct.unpack_from('>L', secdata, reloc_offset + 4)
guesses.append(dict(section=toc_reloc_targ_section, offset=toc_offset))
for x in guesses:
if guesses.count(x) >= len(guesses)//2:
table_of_contents = dict(x)
break
# Somehow we got the table of contents
if table_of_contents:
write_python(table_of_contents, basepath, 'dump-highlevel', 'table-of-contents.txt')
# Exports!