Skip to content

Instantly share code, notes, and snippets.

@NeatMonster
Created October 25, 2019 10:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NeatMonster/0054e83c716539f92900b61594a4d964 to your computer and use it in GitHub Desktop.
Save NeatMonster/0054e83c716539f92900b61594a4d964 to your computer and use it in GitHub Desktop.
import argparse
from construct import Int16ul, Int64ul
def main(args):
with open(args.kernel, 'rb') as f:
data = f.read()
sym_addrs = data.find(Int64ul.build(0xffffff8008080000) * 2)
for offset in range(0, len(data), 0x100):
count = Int64ul.parse(data[offset:offset + 8])
if count >= 0x1000 and count <= 0x20000:
if data[offset + 8:offset + 0x100] == b'\x00' * (0x100 - 8):
sym_names = offset + 0x100
sym_count = count
#print("[*] Symbols count = %d" % sym_count)
#print("[*] Symbols addresses = %#x" % sym_addrs)
#print("[*] Symbols names = %#x" % sym_names)
for offset in range(0, len(data), 0x100):
last = 0
for token in range(1, 200):
curr = Int16ul.parse(data[offset + token * 2:offset + (token + 1) * 2])
if curr > last:
last = curr
else:
break
else:
token_index = offset
token_table = token_index - 1
while data[token_table:token_table + 1] == b'\x00':
token_table -= 1
while data[token_table:token_table + 2] != b'\x00\x00':
token_table -= 1
token_table += 2
#print("[*] Token Table = %#x" % token_table)
#print("[*] Token Index = %#x" % token_index)
nametbl = []
tokentbl = []
for i in range(256):
idx = Int16ul.parse(data[token_index + i * 2:token_index + (i + 1) * 2])
token = b""
j = 0
while data[token_table + idx + j:token_table + idx + j + 1] != b'\x00':
token += data[token_table + idx + j: token_table + idx + j + 1]
j += 1
# print("token %d: %s" % (i, token))
tokentbl.append(token)
for i in range(sym_count):
nlen = data[sym_names]
sym_names += 1
name = b""
while nlen > 0:
j = data[sym_names]
# print("j: %d, token: %s" % (j, tokentbl[j]))
name += tokentbl[j]
sym_names += 1
nlen -= 1
# print("Name %d: %s" % (i, name))
nametbl.append(name)
addr = Int64ul.parse(data[sym_addrs + i * 8:sym_addrs + (i + 1) * 8])
print("%016x %s %s" % (addr, chr(name[0]), name[1:].decode("utf-8")))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('kernel')
main(parser.parse_args())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment