import json, sys, time, subprocess, frida
ADB="/opt/android-sdk/platform-tools/adb"
A=json.load(open("/root/ants/sid_addr.json"))
JS=r"""
var A=%s;
function ins(){var m=Process.findModuleByName("libil2cpp.so");if(!m)return false;var b=m.base;
 function T(f){try{f();}catch(e){send({warn:""+e});}}
 // --- THE THREE EQUIP PATCHES (equip first owned item) ---
 T(function(){ Memory.patchCode(b.add(0xd99242),2,function(c){c.writeByteArray([0xEB,0x0b]);}); }); // rifle je->jmp
 T(function(){ Memory.patchCode(b.add(0xd99313),2,function(c){c.writeByteArray([0xEB,0x0b]);}); }); // bag je->jmp
 T(function(){ Memory.patchCode(b.add(0xd90d8b),2,function(c){c.writeByteArray([0x90,0x90]);}); }); // mask je->nop
 send({info:"3 equip patches applied"});
 // --- boot forcing ---
 var e=null;try{e=Module.findExportByName("libil2cpp.so","il2cpp_string_new");}catch(_){}
 var sn=e?new NativeFunction(e,'pointer',['pointer']):null;
 if(sn)T(function(){Interceptor.attach(b.add(A["get_sessionId"]),{onLeave:function(rv){var em=true;try{if(!rv.isNull())em=(rv.add(8).readS32()<=0);}catch(x){}if(em)rv.replace(sn(Memory.allocUtf8String("rev-1")));}});});
 ["get_TermsAccepted","get_FacebookTermsAccepted"].forEach(function(k){if(A[k])T(function(){Interceptor.attach(b.add(A[k]),{onLeave:function(rv){rv.replace(ptr(1));}});});});
 if(A["Check25RoundsPlayed"])T(function(){Interceptor.replace(b.add(A["Check25RoundsPlayed"]),new NativeCallback(function(s){},"void",["pointer"]));});
 // --- monitors ---
 T(function(){Interceptor.attach(b.add(0xd9086e),{onEnter:function(a){this.p=a[0];},onLeave:function(){ try{var p=this.p; send({info:"LinkInv OK: mask="+(p.add(0x134).readPointer().isNull()?"NULL":"set")+" rifle[+0x50]="+(p.add(0x50).readPointer().isNull()?"NULL":"set")+" bag[+0x38]="+(p.add(0x38).readPointer().isNull()?"NULL":"set")});}catch(e){} }});});
 T(function(){Interceptor.attach(b.add(0xe1890d),{onLeave:function(){send({info:"VaultThief OK"});}});});
 T(function(){Interceptor.attach(b.add(0xd437c9),{onLeave:function(){send({info:"ConfigureFromProfile OK"});}});});
 // match chain
 [[0xd31a4f,"Matchmaking.Initiate"],[0xd34da2,"CreateBotMatch"],[0xe484bd,"GameController.Start"],[0xe4bd6a,"SpawnPlayers"]].forEach(function(x){T(function(){Interceptor.attach(b.add(x[0]),{onEnter:function(){send({info:"CHAIN "+x[1]});}});});});
 T(function(){var ab=Process.findModuleByName("libc.so").findExportByName("abort");Interceptor.attach(ab,{onEnter:function(){var bt=Thread.backtrace(this.context,Backtracer.ACCURATE).slice(0,10).map(function(a){var mm=Process.findModuleByAddress(a);return mm?mm.name+"+0x"+a.sub(mm.base).toString(16):""+a;}).join(",");send({info:"*** ABORT "+bt});}});});
 send({info:"__ready"});return true;}
if(!ins()){var iv=setInterval(function(){if(ins())clearInterval(iv);},120);}
""" % json.dumps(A)
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); t0=time.time()
s.on("detached", lambda r,c=None: print("DETACH %s @%.1f"%(r,time.time()-t0),flush=True))
sc.on("message",lambda m,d: print("[%5.1f] %s"%(time.time()-t0,m.get("payload",m)),flush=True))
sc.load(); dev.resume(pid); time.sleep(int(sys.argv[1]) if len(sys.argv)>1 else 45)
