import json,sys,time,frida
A=json.load(open("/root/ants/ps_addr.json"))
JS=r"""
var A=%s;
function tryname(p){
  // il2cpp Il2CppClass name pointer varies by version; probe common offsets
  var res={};
  [0x8,0xc,0x10,0x14,0x18,0x1c,0x2c].forEach(function(off){
    try{var np=p.readPointer().add(off).readPointer(); var s=np.readUtf8String(); if(s&&s.length<64&&/^[\x20-\x7e]+$/.test(s)) res["k+"+off.toString(16)]=s;}catch(e){}
  });
  return res;
}
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){
  send({t:"k", names:tryname(a[1])});
}});
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"]=="k":print("[%6.2fs] ParseSession arg class-name probes: %s"%(time.time()-t0,json.dumps(p["names"])))
    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 14)
