From 8e08ecf7e5c0ac8648ebdf34f413c0613df4fc21 Mon Sep 17 00:00:00 2001 From: Matiq Date: Mon, 17 Aug 2026 20:40:18 +0300 Subject: [PATCH] roadmap: detector twins FUN_180535880/180536f90 decoded, per-stub dispatch tables --- roadmap.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/roadmap.md b/roadmap.md index 462318b..3abd013 100644 --- a/roadmap.md +++ b/roadmap.md @@ -268,3 +268,40 @@ - План: разметить таблицу → извлечь байты функций 0x18004xxxx (+0x18000a160..0x180074740) → objdump 0x180000000-adjust → транскрипция в dsp/detect.cpp → верификация SNR 19.8 дБ. - Непустые ранее известные ядра (0x180040cc0..0x180041700) = 8 функций = полный алгоритм детектора. + +### B.6 — ДЕТЕКТОР ПОЛНОСТЬЮ ДЕШИФРОВАН (2026-08-17) — dispatch-модель ИСПРАВЛЕНА +- **ИСПРАВЛЕНИЕ dispatch**: у КАЖДОГО стаба СВОЯ таблица (не одна общая 0x182616008). + Все стабы читают ОДИН глобальный индекс `DAT_1826159a0` (в дампе = 4, константа), но + каждый берёт свой слот из своей таблицы (RIP-rel `48 63 05/4c 8d 15/41 ff 24 c2`). + `/tmp/dispatch_map.txt` (223 записи одной таблицы) — УСТАРЕЛ для вызовов детектора. +- **Карта стабов FUN_180535880 (float-детектор)**: `0x180001d00`→tbl`0x182616008`→`0x180040d40` + (AVX-memset); `0x1800019a0`→tbl`0x182615b88`→`0x180004200`→`0x181a63fe0` (fill float N штук + значением из xmm0: rcx=bits, rdx=dst, r8d=N; ветка больших через 0x180017580); + `0x1800021e0`→tbl`0x182616688`→`0x1800130e0`; `0x1800018b0`→tbl`0x182615a48`→`0x180003040`→`0x181a557c0`; + `0x180001af0`→tbl`0x182615d48`→`0x180005a20`; `0x180001dc0`→tbl`0x182616108`→`0x18000ad60` + (комплексное умножение `vfmaddsub213ps`); `0x180001fd0`→tbl`0x1826163c8`→`0x18000f620` + (векторная FMA-аккумуляция `out[i]=out[i]+xmm1*in[i]`, AVX2, развёртка по 8); + `0x180001e20`→tbl`0x182616188`→`0x18000b820`→`0x181a775a0`. +- **FUN_180536f90 = DOUBLE-БЛИЗНЕЦ FUN_180535880** (тот же 3-итерационный цикл, `movsd`/`shl 4` + против `movss`/`shl 3`): `0x180001a30`→`0x180004d60`; `0x1800022d0`→`0x180015300`→`0x180040d40`; + `0x180001e80`→`0x18000c7e0`; `0x180001910`→`0x1800034c0`→`0x181a62d00`; `0x180001ac0`→`0x180005720`; + `0x180001e50`→`0x18000bba0`; `0x180002150`→`0x180012320` (double-FMA-аккум); + `0x180001f40`→`0x18000df20`→`0x181a78060`. +- **Алгоритм FUN_180535880** (rcx=this, rdx=r15=out, r8={double* A, double* B} по 3 double, + r9→[rsp+0x20], [rsp+0xf0]=N): читает A[0..2]/B[0..2], cvtpd2ps→стек [0x28..0x40]; + r13=2N, r12=r15+N*8, rbp=r15+2N*8. Цикл i=0..2: + - i=0: memset r15 (N qword) значением (A0,0); memset r12 (N qword) значением (B0,0); + - i=1: rbx=r15+3N*8; fill rbx (N float) константой 0x1824c3ea4; затем 0x1800021e0(rbx,r9,this,N), + 0x1800018b0(this,N), 0x180001af0(this,rbp,N); + - i=2: 0x180001dc0(this,rbp,rbp,N) = комплексное умножение rbp на самого себя; + - (после каждого i): rbp += A[i]*r15 (0x180001fd0, 2N float) и rbp += B[i]*r12; + - после цикла: 0x180001e20(r12,r15,this,N). +- **Ключевые ядра (реальные .text/0x181a*)**: `0x180040d40`=AVX memset по qword-паттерну (798б); + `0x181a63fe0`=fill N*4 байт широковещательным 32-бит значением (AVX2, up to 0x8000); + `0x18000f620`=FMA-аккум (scalar+ymm+tail, возврат -8/-6 при null/0); + `0x18000ad60`=комплексное умножение (vfmaddsub213ps, цепочки xmm/ymm, маска-зоны 0x20 байт); + `0x180005a20`=обёртка больших chunk`ов (0x7fffffe0 по 8байт) вокруг 0x18001a5a0. +- **Конечные артефакты**: `/tmp/det/det_535880.bin/.dis` (1668б, 435 стр), `det_536f90.bin/.dis` + (1935б, 582 стр), `r_*/f_*/p_*` для всех ядер, `sizes.json`. +- **Следующий шаг**: транскрипция обоих близнецов в dsp/detect.cpp (или dsp/detector.cpp) + с точным порядком float/double операций + комплексного умножения rbp; верификация SNR 19.8 дБ.