import json,sys,time,frida
ADDRS=json.load(open("/root/ants/scene_addr.json"))
JS=r"""
var A=%s;
function ins(){var m=Process.findModuleByName("libil2cpp.so");if(!m)return false;var b=m.base;send({t:"info",m:"base"});
for(var n in A){(function(n,r){try{Interceptor.attach(b.add(r),{
 onLeave:function(rv){send({t:"r",n:n,v:rv.toInt32()&0xff});}
});}catch(e){send({t:"e",m:n+e});}})(n,A[n]);}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()
seen={}
def om(m,d):
    if m["type"]!="send":print("!!",m);return
    p=m["payload"]
    if p["t"]=="r":
        k=(p["n"],p["v"])
        seen[k]=seen.get(k,0)+1
        if seen[k]<=2 or seen[k]%200==0:
            print("[%6.2fs] %-30s returned %d (call #%d)"%(time.time()-t0,p["n"],p["v"],seen[k]))
    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 25)
print("\n=== summary ===")
agg={}
for (n,v),c in seen.items(): agg.setdefault(n,{})[v]=c
for n,vs in agg.items(): print("  %-30s %s"%(n,vs))
