import frida, time
JS=r"""
function rd(p){ try{if(p.isNull())return null;var l=p.add(8).readS32();if(l<0||l>256)return null;return p.add(0xc).readUtf16String(l);}catch(e){return "<e>";} }
var sn=null, gadget0=null;
function ins(){ var m=Process.findModuleByName("libil2cpp.so"); if(!m) return false;
 var b=m.base;
 var e=null; try{e=m.getExportByName("il2cpp_string_new");}catch(_){}
 if(e) sn=new NativeFunction(e,'pointer',['pointer']);
 Interceptor.attach(b.add(0x10ec2e8),{
   onEnter:function(a){ var sp=this.context.esp; var np=sp.add(8).readPointer(); var nm=rd(np);
     if(nm=="gadget" && sn){ if(!gadget0){ gadget0=sn(Memory.allocUtf8String("gadget_0")); }
       sp.add(8).writePointer(gadget0); send("RENAMED gadget -> gadget_0"); } }
 });
 var inLoad=false;
 Interceptor.attach(b.add(0xd8c232),{onEnter:function(a){ inLoad=true; send("LoadInventoryItem ENTER section="+rd(this.context.esp.add(4).readPointer())); },
                                     onLeave:function(r){ inLoad=false; }});
 Interceptor.attach(b.add(0x10e7edd),{onEnter:function(a){ if(inLoad){ send("  INV Get key="+rd(a[1])); } }});
 Interceptor.attach(b.add(0x22ba97),{onEnter:function(a){ if(inLoad) send("  INV FetchCommodity("+rd(a[0])+")"); }});
 send("__ready"); return true; }
var _t=0; if(!ins()){var iv=setInterval(function(){_t++; if(ins()||_t>60)clearInterval(iv);},100);}
"""
dev=frida.get_usb_device(timeout=10); pid=dev.spawn(["se.foglo.svt"])
s=dev.attach(pid); sc=s.create_script(JS); t0=time.time()
out=[]
sc.on("message",lambda m,d:(out.append(m.get("payload",str(m))), print("[%5.1f] %s"%(time.time()-t0,m.get("payload",str(m))),flush=True)))
sc.load(); dev.resume(pid); time.sleep(22)
open("/tmp/rename.out","w").write("\n".join(str(x) for x in out))
