1
0

proj: Add library file name and symbol name to return address

This commit is contained in:
2025-04-17 13:46:16 +02:00
parent c848fa0514
commit 74c5fa7c2c
4 changed files with 204 additions and 121 deletions

View File

@@ -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()