15 lines
1.9 KiB
JavaScript
15 lines
1.9 KiB
JavaScript
// Research only: revision SHA c5e02e6e984f7e5577c78b995a8efeee2d06ee22e67d484ad5e859c8bf21e144.
|
|
// FromBinary callers and their flat dictionary getters are traced in
|
|
// battle_diagnostics/cw-*-flat-*.asm. No scene/gameplay factories are invoked.
|
|
const m=Process.getModuleByName('GameAssembly.dll');
|
|
const tables=[['orb',0x1dd79470],['consumable',0x1e88ddc0],['forge',0x1ddfbd20],['item',0x1edcc120],['combination',0x1de23170]];
|
|
for(const [name,rva]of tables){const b=Array.from(new Uint8Array(m.base.add(rva).readByteArray(4)));if(b.join(',')!=='72,131,236,40')throw Error('Getter identity differs: '+name);}
|
|
const serialize=new NativeFunction(m.base.add(0x1d3efb60),'pointer',['pointer','pointer']);
|
|
let table=0,index=0,count=0,entries=null,done=false;
|
|
Interceptor.attach(m.base.add(0xdb5f860),{onLeave(){if(done)return;try{
|
|
if(entries===null){const [name,rva]=tables[table],get=new NativeFunction(m.base.add(rva),'pointer',['pointer']);const d=get(ptr(0));if(d.isNull())throw Error('Missing '+name);count=d.add(0x20).readU32();entries=d.add(0x18).readPointer();index=0;if(count>4096||entries.isNull()||entries.add(0x18).readU32()<count)throw Error('Dictionary bound '+name);send({kind:'BEGIN',table:name,count});}
|
|
for(let n=0;n<64&&index<count;n++){const entry=entries.add(0x20+24*index++);if(entry.readS32()<0)continue;const row=entry.add(16).readPointer();if(row.isNull())continue;const v=serialize(row,ptr(0));if(v.isNull())throw Error('Empty serialization');const length=v.add(0x10).readS32();if(length<2||length>32768)throw Error('Row serialization bound');send({kind:'ROW',table:tables[table][0],json:v.add(0x14).readUtf16String(length)});}
|
|
if(index>=count){send({kind:'TABLE_END',table:tables[table][0],count});table++;entries=null;if(table===tables.length){done=true;send({kind:'END'});}}
|
|
}catch(e){done=true;send({kind:'ERROR',error:String(e)});}}});
|
|
send({kind:'ATTACHED',path:m.path,scope:'five named flat reward tables; at most 64 row serializations per managed callback'});
|