Files
Matiq 25cf786c54 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 порядок).
2026-08-16 18:54:40 +03:00

44 lines
1.3 KiB
Python

from ghidra.program.model.listing import CodeUnit
from ghidra.program.model.symbol import SymbolTable, SymbolType, SourceType
from ghidra.program.model.data import DataUtilities
program = getCurrentProgram()
listing = program.getListing()
symtab = program.getSymbolTable()
def p(*a):
out = ",".join(str(x) for x in a)
print(out)
# 1. functions count
funcs = listing.getFunctions(True)
n = 0
for f in funcs:
n += 1
p("FUNCTION_COUNT", n)
# 2. symbols matching DSP keywords
import re
keys = ["Soothe2", "Spectral", "FilterGraph", "DigitalFilter", "IIRFilter", "LowPass", "ModuleBase", "Decryptor", "processBlock", "ProcessData"]
syms = symtab.getAllSymbols(True)
shown = set()
for s in syms:
name = s.getName(True) or s.getName()
for k in keys:
if k.lower() in name.lower():
key = (name, str(s.getAddress()), s.getSymbolType().toString())
if key not in shown:
shown.add(key)
p("SYMB", name, s.getAddress(), s.getSymbolType().toString())
break
p("SYM_TOTAL", len(shown))
# 3. exports
for s in symtab.getExternalSymbols():
pass
# external functions imports (VST exports / DLL imports of interest)
for f in listing.getFunctions(True):
sym = f.getSymbol()
if sym is not None and sym.isExternalEntryPoint():
p("EXP", f.getName(), f.getEntryPoint())