import frida, time, subprocess
ADB="/opt/android-sdk/platform-tools/adb"
JS=r"""
function ins(){ var m=Process.findModuleByName("libil2cpp.so"); if(!m) return false; var b=m.base;
 // make UpdateRifle a graceful no-op (skip rifle-stat update when nothing valid)
 Interceptor.replace(b.add(0xd99335), new NativeCallback(function(self){ return; },"void",["pointer"]));
 Interceptor.replace(b.add(0xd87d14), new NativeCallback(function(self){ return; },"void",["pointer"]));
 // watch what happens after
 Interceptor.attach(b.add(0xd99264),{onEnter:function(){send("SetEquippedBag");}});
 Interceptor.attach(b.add(0xd9086e),{onLeave:function(){send("LinkInventory DONE-ok");}});
 Interceptor.attach(b.add(0xe1890d),{onLeave:function(){send("VaultThief.Initialise OK");}});
 Interceptor.attach(b.add(0xd437c9),{onLeave:function(){send("ConfigureFromPlayerProfile OK");}});
 var ab=Process.findModuleByName("libc.so").findExportByName("abort");
 Interceptor.attach(ab,{onEnter:function(){ var bt=Thread.backtrace(this.context,Backtracer.ACCURATE).slice(0,8).map(function(a){var mm=Process.findModuleByAddress(a);return mm?mm.name+"+0x"+a.sub(mm.base).toString(16):""+a;}).join(","); send("*** ABORT *** "+bt); }});
 send("__ready"); return true; }
if(!ins()){ var iv=setInterval(function(){ if(ins()) clearInterval(iv); },120); }
"""
subprocess.run([ADB,"shell","am","force-stop","se.foglo.svt"])
dev=frida.get_usb_device(timeout=10); pid=dev.spawn(["se.foglo.svt"])
s=dev.attach(pid); sc=s.create_script(JS)
s.on("detached", lambda r,c=None: print("DETACH %s"%r,flush=True))
sc.on("message",lambda m,d: print(m.get("payload",m),flush=True))
sc.load(); dev.resume(pid); time.sleep(40)
