import json,sys,time,frida
A=json.load(open("/root/ants/ps_addr.json"))
JS=r"""
var A=%s;
function rs(p){if(p.isNull())return"<null>";try{var l=p.add(8).readS32();if(l<0||l>8192)return"<obj>";return p.add(12).readUtf16String(l);}catch(e){return"<e>";}}
function ins(){var m=Process.findModuleByName("libil2cpp.so");if(!m)return false;var b=m.base;send({t:"info",m:"base"});
Interceptor.attach(b.add(A["<OnConnect>m__0"]),{onEnter:function(a){
  // instance: a0=this, a1=error, a2=recv(tree), a3=recvText(string)
  send({t:"oc",err:rs(a[1]),recvText:rs(a[3]),a2type:a[2].isNull()?"null":"obj"});
}});
return true;}
if(!ins()){var iv=setInterval(function(){if(ins())clearInterval(iv);},200);}
""" % json.dumps(A)
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);t0=time.time()
def om(m,d):
    if m["type"]!="send":print("!!",m);return
    p=m["payload"]
    if p["t"]=="oc":
        print("[%6.2fs] OnConnect callback:"%(time.time()-t0))
        print("   error   = %r"%p["err"])
        print("   recv    = %s"%p["a2type"])
        print("   recvText= %r"%p["recvText"])
    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 15)
