proj: Add library file name and symbol name to return address
This commit is contained in:
@@ -21,15 +21,22 @@ StructAddrInfo = TypedDict('StructAddrInfo', {})
|
||||
StructMsgHdr = TypedDict('StructMsgHdr', {})
|
||||
|
||||
|
||||
RET_ADDR_RE = re.compile(r': *((0x)?[0-9a-fA-Fx]+) *\((.+?)\+(.+?)(, *(.+?))?\)$')
|
||||
|
||||
|
||||
class ThreadedUnixStreamServer(ThreadingMixIn, UnixStreamServer):
|
||||
pass
|
||||
|
||||
|
||||
class Handler(StreamRequestHandler):
|
||||
pid: Optional[int]
|
||||
tid: Optional[int]
|
||||
path: Optional[str]
|
||||
stack: list[tuple[int, str, tuple]]
|
||||
stack: list[tuple[int, str, int, Optional[str], str, tuple]]
|
||||
ret_addr: int
|
||||
dli_file_name: str
|
||||
rel_ret_addr: int
|
||||
dli_sym_name: Optional[str]
|
||||
|
||||
def before(self) -> None: pass
|
||||
def after(self) -> None: pass
|
||||
@@ -164,13 +171,20 @@ class Handler(StreamRequestHandler):
|
||||
|
||||
def handle_msg(self, msg: bytes):
|
||||
timestamp, pid, tid, data = msg.rstrip(b'\n').split(b' ', 3)
|
||||
self.pid, self.tid = int(pid), int(tid)
|
||||
if not data.startswith(b'return ') and not data == b'return':
|
||||
call = data.decode('utf-8')
|
||||
print(f'[{self.pid}] {call}')
|
||||
print(f'[{self.pid}][{self.tid}] {call}')
|
||||
func_name = call[:call.find('(')]
|
||||
self.ret_addr = int(call[call.rfind(':') + 1:], 0)
|
||||
ret = call[call.rfind(':'):]
|
||||
m = RET_ADDR_RE.match(ret)
|
||||
g_ret, _, g_fname, g_rel, _, g_sym = m.groups()
|
||||
self.ret_addr = int(g_ret, 0)
|
||||
self.dli_file_name = g_fname
|
||||
self.rel_ret_addr = int(g_ret, 0)
|
||||
self.dli_sym_name = g_sym
|
||||
args, _ = Handler.parse_args(call[call.find('(') + 1:call.rfind(':') - 1])
|
||||
self.stack.append((self.ret_addr, func_name, args))
|
||||
self.stack.append((self.ret_addr, self.dli_file_name, self.rel_ret_addr, self.dli_sym_name, func_name, args))
|
||||
try:
|
||||
func = getattr(self, f'before_{func_name}')
|
||||
if not callable(func):
|
||||
@@ -183,12 +197,12 @@ class Handler(StreamRequestHandler):
|
||||
command = func(*args) or self.before_fallback(func_name, *args) or 'ok'
|
||||
except NotImplementedError:
|
||||
command = self.before_fallback(func_name, *args) or 'ok'
|
||||
print(f'[{self.pid}] -> {command}')
|
||||
print(f'[{self.pid}][{self.tid}] -> {command}')
|
||||
self.wfile.write(command.encode('utf-8') + b'\n')
|
||||
else:
|
||||
ret = data.decode('utf-8')
|
||||
ret_value, _ = Handler.parse_arg(ret[7:].split(';')[0])
|
||||
self.ret_addr, func_name, args = self.stack.pop()
|
||||
(self.ret_addr, self.dli_file_name, self.rel_ret_addr, self.dli_sym_name, func_name, args) = self.stack.pop()
|
||||
try:
|
||||
func = getattr(self, f'after_{func_name}')
|
||||
if not callable(func):
|
||||
@@ -207,7 +221,7 @@ class Handler(StreamRequestHandler):
|
||||
self.after_fallback(func_name, *args)
|
||||
else:
|
||||
self.after_fallback(func_name, *args, ret_value)
|
||||
print(f'[{self.pid}] -> {ret}')
|
||||
print(f'[{self.pid}][{self.tid}] -> {ret}')
|
||||
|
||||
def before_malloc(self, size: int) -> str:
|
||||
raise NotImplementedError()
|
||||
|
||||
Reference in New Issue
Block a user