-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy patha64.py
135 lines (108 loc) · 3.2 KB
/
a64.py
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python
# SPDX-License-Identifier: MIT
# Copyright (c) 2021-2022 Iruatã Martins dos Santos Souza
import lldb
import shlex
from sys import byteorder
from lldbinit import *
CELL = 8
def reg_value(reg):
return int(get_register(reg), 16)
def mem_bytes(addr, len):
error = lldb.SBError()
return get_target().GetProcess().ReadMemory(addr, len, error)
def mem_value(addr, len):
return int.from_bytes(mem_bytes(addr, len), byteorder=byteorder)
def get_symbol(name):
symbols = get_target().FindSymbols(name)
if symbols.GetSize() == 0:
return None
for context in symbols:
if context.GetModule().GetFileSpec().GetFilename() == "nop":
return context.GetSymbol()
return None
def symbol_address(name):
symbol = get_symbol(name)
if symbol is None:
return None
return symbol.GetStartAddress().GetLoadAddress(get_target())
def dstk():
print("top %s" % get_register("x0"))
p = reg_value("fp")
ep = symbol_address("dstack0")
i = 1
while p < ep:
print("%3d 0x%016x" % (i, mem_value(p, CELL)))
p += CELL
i += 1
R0 = 0
def grabR0():
global R0
R0 = reg_value("sp")
def rstk():
if R0 == 0:
grabR0()
p = reg_value("sp")
while p < R0:
print("0x%016x" % mem_value(p, CELL))
p += CELL
def state(debugger, command, exe_ctx, result, internal_dict):
dstk()
print()
rstk()
def go(debugger, command, exe_ctx, result, internal_dict):
debugger.HandleCommand("step")
state(debugger, command, exe_ctx, result, internal_dict)
def dodh(addr):
link = mem_value(addr, CELL)
cfa = mem_value(addr + CELL, CELL)
namelen = mem_value(addr + 2 * CELL, 1)
try:
name = mem_bytes(addr + 2 * CELL + 1, namelen).decode("utf-8")
except:
name = ""
print("0x%016x" % addr)
print("link 0x%016x" % link)
print("cfa 0x%016x" % cfa)
print("#name %16d" % namelen)
print("name %16s" % name)
return link
def dh(debugger, command, exe_ctx, result, internal_dict):
args = shlex.split(command)
if len(args) < 1:
print("usage: dh addr")
return
addr = 0
try:
addr = int(args[0], 16)
except:
print("invalid address %s" % args[0])
return
dodh(addr)
def dodict(addr):
if addr == 0:
return
dodict(mem_value(addr, CELL))
dodh(addr)
print()
def ddict(debugger, command, exe_ctx, result, internal_dict):
args = shlex.split(command)
if len(args) < 1:
print("usage: ddict [addr|forth|macro]")
return
if args[0] == "macro":
addr = mem_value(symbol_address("mlatestp"), CELL)
elif args[0] == "forth":
addr = mem_value(symbol_address("flatestp"), CELL)
else:
try:
addr = int(args[0], 16)
except:
print("invalid address", args[0])
return
dodict(addr)
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand("command script add state -f a64.state")
debugger.HandleCommand("command script add go -f a64.go")
debugger.HandleCommand("command script add dh -f a64.dh")
debugger.HandleCommand("command script add ddict -f a64.ddict")