#!/usr/bin/env python3 import subprocess, os, glob, sys, time, struct RPP = "/home/m/soothe-bt/render_long.rpp" proc = subprocess.Popen(['reaper', '-nosplash', '-renderproject', RPP], stdout=open('/tmp/rtdeep2.log', 'w'), stderr=subprocess.STDOUT) print('reaper', proc.pid, flush=True) def find_hosts(): out = [] for p in glob.glob('/proc/[0-9]*'): try: pid = int(os.path.basename(p)) m = open(f'/proc/{pid}/maps').read() c = open(f'/proc/{pid}/cmdline', 'rb').read().decode('utf8', 'replace') if 'soothe2' in m and 'yabridge-host.exe' in c: out.append(pid) except Exception: pass return out def scan(pid): # strategy: enumerate every readable chunk; build set of img addresses whose content is 0x18052xxxx # then find heap words equal to any such address mem = os.open(f'/proc/{pid}/mem', os.O_RDONLY) img_sp = set() # vtbl-slot candidates: addrs in module image holding 0x18052xxxx heap_addrs = [] # (va, chunk) heap chunks maps = open(f'/proc/{pid}/maps').read() for line in maps.splitlines(): p = line.split() lo, hi = (int(x, 16) for x in p[0].split('-')) if 'r' not in p[1]: continue try: d = os.pread(mem, hi - lo, lo) except Exception: continue if lo < 0x180000000 < hi or (0x180000000 <= lo < 0x183000000): for off in range(0, len(d) - 7, 8): q = struct.unpack_from('