- Инфраструктура: 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 порядок).
44 lines
1.3 KiB
Python
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()) |