docs(evidence): trace autoplay camera switches

This commit is contained in:
2026-07-18 13:55:17 +04:00
parent 1bd50662b1
commit 59d810e5e7
2 changed files with 24 additions and 1 deletions
+13
View File
@@ -1291,6 +1291,19 @@ pointer are therefore not yet proven to have the same adjustment/layout; those
offsets must remain unassigned until the selector/interface relationship is offsets must remain unassigned until the selector/interface relationship is
recovered. recovered.
The unattended demo also proves that this global is dynamic. Across 25 seconds
of read-only sampling it held three distinct heap pointers; all began with the
same relocated outer vtables `0x025765B4` and `0x02576558`. Two selected
objects exposed synchronized translation triples in the paired raw blocks at
offsets `+0x2C/+0x3C/+0x4C` and `+0x6C/+0x7C/+0x8C`, with world-like values
such as `(491.562, 761.551, 7.361)`. A third object used the same vtable but
reported normalized-looking values near `(0.098, 0.018, 0.856)` and did not
match the paired block. The observed pointer transitions are consistent with
the unattended camera changes, but the sample carries no mode label and does
not prove first- versus third-person identity. It does prove that the static
direct-xref initializer is not the sole runtime writer of the global; indirect
or unanalyzed write paths remain to be recovered.
A fresh no-input launch of the canonical `iron_3d.exe` did create a responsive A fresh no-input launch of the canonical `iron_3d.exe` did create a responsive
window titled `Parkan. Железная Стратегия`. A read-only probe then requested window titled `Parkan. Железная Стратегия`. A read-only probe then requested
`PROCESS_QUERY_INFORMATION | PROCESS_VM_READ` and attempted to read the known `PROCESS_QUERY_INFORMATION | PROCESS_VM_READ` and attempted to read the known
+11 -1
View File
@@ -280,12 +280,22 @@ adjustment; их offsets остаются unassigned до recovery selector rela
Локальная IDA-база уточняет адреса этой связи: `stdGetCurrentCamera2` — это Локальная IDA-база уточняет адреса этой связи: `stdGetCurrentCamera2` — это
шестибайтный getter по RVA `0x4FD80`, который возвращает `dword` по RVA шестибайтный getter по RVA `0x4FD80`, который возвращает `dword` по RVA
`0x7355C`. Единственный найденный initializer этого global — функция Terrain `0x7355C`. Единственный найденный **direct static** initializer этого global — функция Terrain
по RVA `0x4D4D0`: она запрашивает selector `8` у своего `this` и сохраняет по RVA `0x4D4D0`: она запрашивает selector `8` у своего `this` и сохраняет
полученный interface pointer. Это доказывает адрес хранения и путь заполнения, полученный interface pointer. Это доказывает адрес хранения и путь заполнения,
но не разрешает трактовать pointer как конкретный layout камеры либо читать его но не разрешает трактовать pointer как конкретный layout камеры либо читать его
как runtime evidence без доступа к процессу на том же уровне привилегий. как runtime evidence без доступа к процессу на том же уровне привилегий.
Elevated live sampling теперь доказывает, что direct static xref не исчерпывает
runtime writers: за 25 секунд autoplay global переключился между тремя heap
pointer, все с relocated outer vtables `0x025765B4`/`0x02576558`. У двух объектов
paired blocks `+0x2C/+0x3C/+0x4C` и `+0x6C/+0x7C/+0x8C` синхронно несли
world-like translation, например `(491.562, 761.551, 7.361)`; третий давал
normalized-looking `(0.098, 0.018, 0.856)` и не совпадал с paired block.
Наблюдение согласуется с автоматическими camera switches, но не маркирует mode;
оно запрещает называть `0x4D4D0` единственным runtime writer и требует recovery
indirect/unanalyzed write path.
### Vtable и interface negotiation ### Vtable и interface negotiation
Вызовы вида `object->vfunc(offset)` доказывают порядок slots, даже когда имя Вызовы вида `object->vfunc(offset)` доказывают порядок slots, даже когда имя