import json,sys,time,frida
ADDRS=json.load(open("/root/ants/scene_addr.json"))
JS=r"""
var addrs=%s;
function rs(p){if(p.isNull())return"<null>";try{var l=p.add(8).readS32();if(l<0||l>4096)return"<l="+l+">";return p.add(12).readUtf16String(l);}catch(e){return"<e>";}}
function ins(){var m=Process.findModuleByName("libil2cpp.so");if(!m)return false;var base=m.base;send({t:"info",m:"base "+base});
for(var name in addrs){(function(name,rva){try{Interceptor.attach(base.add(rva),{
 onEnter:function(a){
   // try reading several arg slots as string + int
   send({t:"c",n:name,
     s0:rs(a[0]),i1:a[1].toInt32(),s1:rs(a[1]),i2:a[2].toInt32(),s2:rs(a[2]),i0:a[0].toInt32()});
 }});}catch(e){send({t:"e",m:name+": "+e});}})(name,addrs[name]);}
return true;}
if(!ins()){var iv=setInterval(function(){if(ins())clearInterval(iv);},200);}
"""
dev=frida.get_device_manager().add_remote_device("127.0.0.1:27042")
pid=dev.spawn(["se.foglo.svt"]); s=dev.attach(pid)
sc=s.create_script(JS%json.dumps(ADDRS)); t0=time.time()
def om(m,d):
    if m["type"]!="send":print("!!",m);return
    p=m["payload"]
    if p["t"]=="c":print("[%6.2fs] %s\n   s0=%r i1=%d s1=%r i2=%d s2=%r"%(time.time()-t0,p["n"],p["s0"],p["i1"],p["s1"],p["i2"],p["s2"]))
    else:print("[%s] %s"%(p["t"],p.get("m")))
sc.on("message",om); sc.load(); dev.resume(pid)
time.sleep(int(sys.argv[1]) if len(sys.argv)>1 else 30)
