24jj: BIGKERNEL BODIES FOUND via runtime IAT resolve — 1803a06a0/180296c80/180323f20/1802dc0e0, real math functions with x87 transcendental pair (exp family); iat_name.py v2 with double-deref+PE exports

This commit is contained in:
2026-08-25 10:29:06 +03:00
parent 483f52f296
commit c33212c21b
2 changed files with 37 additions and 6 deletions
+15
View File
@@ -473,3 +473,18 @@ ILT-стаб с собственной idx-ячейкой (паковка/про
разворачивание обрывается. Тела bigkernel'ов (exp/abs-нелинейность шага разворачивание обрывается. Тела bigkernel'ов (exp/abs-нелинейность шага
14/17) остаются за пакером — при необходимости снимаются дампом памяти 14/17) остаются за пакером — при необходимости снимаются дампом памяти
ВОКРУГ вызова в рантайме (STOP + чтение таблиц после инициализации). ВОКРУГ вызова в рантайме (STOP + чтение таблиц после инициализации).
## ДОПОЛНЕНИЕ 24jj: ТЕЛА BIGKERNEL'ОВ НАЙДЕНЫ (рантайм-резолв IAT)
iat_name.py v2 (SIGSTOP + двойной deref + PE-экспорты) резолвит:
```
стаб 140b30/140b60 → runtime 1803a06a0 (общий для float/double!)
стаб 1409e0 → runtime 180296c80
стаб 140ad0 → runtime 180323f20
стаб 140a40 → runtime 1802dc0e0
```
Все — НАСТОЯЩИЕ функции внутри дампа (не импорты!): большие стек-фреймы,
x87 FNU-контроль, AVX2 полиномы, ДВЕ x87-трансцендентные инструкции
(fyl2x/f2xm1 класс = 2^x/exp семейство). Полный декод математики каждого —
отдельная сессия; вход/выход уже известны из контекста вызовов
(in-place над n/2+1 элементами FIR-буфера).
+22 -6
View File
@@ -83,6 +83,8 @@ t0=time.time(); host=None
while time.time()-t0<30 and not host: while time.time()-t0<30 and not host:
host=find_host(); time.sleep(0.002) host=find_host(); time.sleep(0.002)
print('host',host,flush=True) print('host',host,flush=True)
import signal as sg
os.kill(host,sg.SIGSTOP)
fd=os.open('/proc/%d/mem'%host,os.O_RDONLY) fd=os.open('/proc/%d/mem'%host,os.O_RDONLY)
# build module map # build module map
@@ -100,13 +102,27 @@ def owner(addr):
return None return None
targets={} targets={}
for stub in (0x180140b30,0x180140b60,0x1801409e0,0x180140ad0,0x180140a40): TBL={0x180140b30:0x1826176c8,0x180140b60:0x182617708,0x1801409e0:0x182617508,
off=stub-BASE 0x180140ad0:0x182617648,0x180140a40:0x182617588}
b=data[off:off+7] for stub,tbl in TBL.items():
rel=struct.unpack('<i',b[3:7])[0] v=rd(fd,tbl+32,8)
tbl=stub+14+rel
v=rd(fd,tbl+4*8,8)
tgt=struct.unpack('<Q',v)[0] if v else 0 tgt=struct.unpack('<Q',v)[0] if v else 0
# second level: tgt code = mov rax,[rip+rel]; jmp rax -> IAT slot
print(' L2: tgt=%x' % tgt, flush=True)
if 0x180000000 <= tgt < 0x187000000:
off2=tgt-BASE
b2=data[off2:off2+7] if 0<=off2<len(data)-7 else rd(tgt,7)
if b2[:2]==b'\x48\x8b':
rel2=struct.unpack('<i',b2[3:7])[0]
slot=tgt+7+rel2
print(' L2: b2=%s rel2=%x slot=%x' % (b2.hex(),rel2&0xffffffff,slot), flush=True)
fv=rd(fd,slot,8)
if fv:
tgt=struct.unpack('<Q',fv)[0]
else:
print(' slot read FAIL',slot,flush=True)
else:
print(' no mov-rax pattern at %x: %s'%(tgt,b2[:3].hex() if b2 else '-'),flush=True)
ow=owner(tgt) ow=owner(tgt)
print('%x idx4->%x runtime=%x owner=%s' % (stub,tbl,tgt,ow[2] if ow else '?'),flush=True) print('%x idx4->%x runtime=%x owner=%s' % (stub,tbl,tgt,ow[2] if ow else '?'),flush=True)
if ow: if ow: