import frida, time, sys
JS = r"""
var B=null;
function E(m,n){var p=m.findExportByName(n);if(!p)throw new Error("no "+n);return p;}
function main(){
 var m=Process.findModuleByName("libil2cpp.so");if(!m){setTimeout(main,150);return;}
 B=m.base;
 send({ev:"BASE", base: B.toString()});
 var dg=new NativeFunction(E(m,"il2cpp_domain_get"),'pointer',[]);
 send({ev:"got_dg"});
 var d = dg();
 send({ev:"domain", d: d.toString()});
 var dga=new NativeFunction(E(m,"il2cpp_domain_get_assemblies"),'pointer',['pointer','pointer']);
 send({ev:"got_dga"});
 var c=Memory.alloc(8);
 var a=dga(d,c);
 send({ev:"assemblies", n: c.readU32(), a: a.toString()});
 send({ev:"READY"});
}
main();
"""
pid = int(sys.argv[1])
dev = frida.get_usb_device(timeout=10)
s = dev.attach(pid)
def on_msg(m, d):
    print(m, flush=True)
sc = s.create_script(JS)
sc.on("message", on_msg)
sc.load()
time.sleep(3)
sc.unload()
s.detach()
print("DONE")
