- Инфраструктура: RTTI-дампы (rtti_dsp/full.json), декомпиляции DSP-классов (decomp_*.txt), Ghidra-скрипты (Dump*.java, ImportRtti*.java, Diag.java), depthcurve/curve_fits LUT. - Поведенческая модель sim_v5.py + sim.py (RMSE ~0.3dB), утилиты (measure, tt_sweep, patchparam, sweep, harness_*, verify_sim). - summary.md + roadmap.md (контракт из manual M1-M12, топология пайплайна из OCR, фазы A-C). - pipeline_ocr.txt: OCR диаграммы Appendix A (mid/side ручка, trim/mix/bypass порядок).
70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
#!/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() |