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>500)return"<obj l="+l+">";return p.add(12).readUtf16String(l);}catch(e){return"<e>";}}
function klass(p){try{var k=p.readPointer();var n=k.add(0x10).readPointer();return n.readUtf8String();}catch(e){return"?";}}
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["ParseSession"]),{onEnter:function(a){
  var o=a[1];
  var d={klass:klass(o)};
  [0x8,0xc,0x10,0x14,0x18,0x1c,0x20].forEach(function(off){ try{d["+"+off.toString(16)]=rs(o.add(off).readPointer());}catch(e){d["+"+off.toString(16)]="x";} });
  send({t:"ps",d:d});
}});
Interceptor.attach(b.add(A["get_sessionId"]),{onLeave:function(rv){send({t:"sid",v:rs(rv)});}});
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()
sidseen=set()
def om(m,d):
    if m["type"]!="send":print("!!",m);return
    p=m["payload"]
    if p["t"]=="ps":print("[%6.2fs] ParseSession arg: %s"%(time.time()-t0,json.dumps(p["d"])))
    elif p["t"]=="sid":
        if p["v"] not in sidseen: sidseen.add(p["v"]); print("[%6.2fs] sessionId = %r"%(time.time()-t0,p["v"]))
    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 20)
