#!/usr/bin/env python3 import frida, sys, struct, time TARGET = "yabridge-host" OUT = "/home/m/re-tools/soothe_mem.bin" js = r""" const name = "soothe2_x64.vst3"; let mod = null; for (const m of Process.enumerateModules()) { if (m.name.toLowerCase().includes(name)) { mod = m; break; } } if (!mod) { for (const m of Process.enumerateModules()) { if (m.path.toLowerCase().includes("soothe")) { mod = m; break; } } } if (!mod) { send({err: "soothe module not found"}); } else { send({base: mod.base.toString(), size: mod.size, path: mod.path, name: mod.name}); const buf = new ArrayBuffer(mod.size); try { const r = Memory.readByteArray(mod.base, mod.size); buf = r; send({ok: true, size: mod.size}, buf ? buf : new ArrayBuffer(0)); } catch (e) { send({err: "readByteArray: " + e}); } } """ def main(): dev = frida.get_local_device() procs = dev.enumerate_processes() target = None for p in procs: if TARGET in p.name and ("yabridge" in p.name or "wine" in p.name): target = p if target is None: print("target process not found:") for p in procs: if "wine" in p.name or "yabridge" in p.name or "reaper" in p.name: print(" ", p.pid, p.name) sys.exit(1) print("attaching to", target.pid, target.name) session = dev.attach(target.pid) done = {} def on_message(msg, data): if msg["type"] == "send": payload = msg["payload"] if isinstance(payload, dict) and "err" in payload: print("ERR:", payload["err"]) done["err"] = payload return if payload.get("ok"): with open(OUT, "wb") as f: f.write(data) print("DUMPED", len(data), "bytes to", OUT) done["dumped"] = len(data) else: print("module:", payload) elif msg["type"] == "error": print("JS ERR:", msg.get("description")) script = session.create_script(js) script.on("message", on_message) script.load() for _ in range(60): if done: break time.sleep(0.2) session.detach() main()