Initial commit: soothe2 RE workspace + roadmap
- Инфраструктура: 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 порядок).
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user