diff --git a/handoff/NOTES_LEVEL.md b/handoff/NOTES_LEVEL.md index 3c44fc8..1752356 100644 --- a/handoff/NOTES_LEVEL.md +++ b/handoff/NOTES_LEVEL.md @@ -2271,3 +2271,19 @@ cut@500=10.32 дБ const ∀q; @2000=11.82 @q=0.5; Δcut≈2.25·(−ln res). гейт corpus --vs-bridge + контрольные числа dual. 3. ptrace-эскалация ТОЛЬКО если численная репликация не сойдётся: цель — брейкпоинт в момент param-change (init-окно хоста), а не рендер. + +### 23c (короткое): феасибилити log-свёртки — ОТРИЦАТЕЛЬНЫЙ результат +На живой кривой R@0x5407f8 (dual q=0.5): подбор ОПТИМАЛЬНОЙ симметричной +гаусс/бокс-свёртки в log-домене (ширина до 1500 бинов, свободный аффинный сдвиг, +точное совпадение @bin43=10.32 дБ) даёт минимум ошибки на bin171 ≈ 0.94–1.10 дБ +при ширине ~314–324 бина (~3.7 кГц) — такая ширина уничтожает избирательность +нотча на всём остальном корпусе. Вывод: механизмы класса «свёртка log-маски с +симметричным ядром» геометрию dual НЕ воспроизводят (расширяет теорему 22x с +поточечных законов на симметрично-свёрточные). Остаются: (а) вход bands[i] у +DESIGN ≠ захваченные кривые (768/788/7f8 — возможно, GUI/init-версии); +(б) асимметричные/структурные ops (cepstral-liftering класс); (в) темпоральный +кросс-фрейм механизм. Решающий недостающий факт — ИСТИННЫЙ массив bands[0] в +момент вызова DESIGN; рецепт добычи: seize главного треда yabridge-host в момент +ПОЯВЛЕНИЯ pid (ppid=reaper, comm ещё 'wine'), INT3 на 0x1802a24c0/0x1802fa420, +CONT, дамп rcx/rdx на хите (скрипт fnall.py готов, нужен только ранний захват — +нынешний finder по maps опаздывает на init-бурст <5 мс). diff --git a/scripts/fnall.py b/scripts/fnall.py index 2521f58..639eb1e 100644 --- a/scripts/fnall.py +++ b/scripts/fnall.py @@ -13,6 +13,7 @@ import json import os import signal import struct +import numpy as np import subprocess import sys import time @@ -51,14 +52,23 @@ def pt(req, pid, addr=0, data=0): def find_host(): + # fastest signal: any non-reaper child of a reaper process + reapers = [] + for p in glob.glob('/proc/[0-9]*'): + try: + cmd = open(f'/proc/{p}/cmdline', 'rb').read() + if b'reaper' in cmd and b'yabridge' not in cmd: + reapers.append(int(os.path.basename(p))) + except Exception: + continue for p in glob.glob('/proc/[0-9]*'): pid = int(os.path.basename(p)) try: - cmd = open(f'/proc/{pid}/cmdline', 'rb').read().replace(b'\0', b' ').decode('utf8', 'replace') - maps = open(f'/proc/{pid}/maps').read() + st = open(f'/proc/{pid}/stat').read().split() + ppid = int(st[3]) except Exception: continue - if 'soothe2' in maps and 'reaper' not in cmd: + if ppid in reapers and pid not in reapers: return pid return None @@ -176,7 +186,22 @@ def main(): rec = dict(ctx=regs.rcx, a2=regs.rdx, cnt=regs.r8 & 0xffffffff, r9=regs.r9 & 0xffffffff, ret=ret, rbx=regs.rbx, r12=regs.r12, r13=regs.r13, - r14=regs.r14, r15=regs.r15, rsp=regs.rsp, tid=pid) + r14=regs.r14, r15=regs.r15, rsp=regs.rsp, tid=pid, + dump_in=[], dump_out=[], dump_r14=[], dump_rbx=[]) + # dump arrays referenced by registers (process is stopped) + fdm = os.open(f'/proc/{host}/mem', os.O_RDONLY) + + def rdarr(ptr, n=2049): + try: + b = os.pread(fdm, n * 4, ptr) + return np.frombuffer(b, dtype='