functionStalkerTrace() { var base_hello_jni = Module.findBaseAddress("libhello-jni.so"); var sub_1CFF0 = base_hello_jni.add(0x1CFF0); console.log(sub_1CFF0); var module_hello_jni = Process.findModuleByName("libhello-jni.so");
var module_start = module_hello_jni.base; var module_end = module_hello_jni.base + module_hello_jni.size; var pre_regs = {}
var so_name = "libmetaxxx.so" var so_addr = Module.findBaseAddress(so_name); var so_size = Process.getModuleByName(so_name).size;
if (so_addr) { console.log("so_addr:", so_addr); // var hook_addr = so_addr.add(0xc167c); var hook_addr = so_addr.add(0xbe040); console.log("The addr_13F91:", hook_addr);
var stalker_hook = false;
var pre_regs = {}
Interceptor.attach(hook_addr, { onEnter: function (args) { console.warn(JSON.stringify({ // fname: args[1].readCString(), // text: new ObjC.Object(args[2]).toString(), backtrace: Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).map(m => m.moduleName+'!'+m.name), ctx: this.context }, null, 2)); var tid = Process.getCurrentThreadId(); this.tid = tid; Stalker.follow(tid, { events: { call: true }, /* onCallSummary: function (summary) { Object.keys(summary).forEach(s => { var sym = DebugSymbol.fromAddress(ptr(s)); if (sym.moduleName == 'Viber') console.log(summary[s], sym.name); }) } */ transform: function (iterator) { var instruction = iterator.next(); const startAddress = instruction.address; if (startAddress){ var isModule = startAddress.compare(so_addr.add(0xbe040)) >= 0 && startAddress.compare(so_addr.add(so_size)) < 0; do{ if (isModule){ if (instruction.mnemonic.startsWith('bl')) { // var uuid = getUuid() // console.log("uuid 1", uuid) try {
iterator.putCallout(function (context) { var pc = context.pc; //获取pc寄存器,当前地址 var lr = context.lr; //获取pc寄存器,当前地址 var x0 = context.x0; //获取pc寄存器,当前地址 varmodule = Process.findModuleByAddress(pc); if (module) { //如果模块存在 // var diff_regs = get_diff_regs(context, pre_regs);//得到所有的变化寄存器。
// Other events: ret: false, // RET instructions exec: false, // all instructions: not recommended as it's // a lot of data block: false, // block executed: coarse execution trace compile: false// block compiled: useful for coverage }, onReceive: function () { },
/* transform: function (iterator) {//主要是transform var instruction = iterator.next(); do{ console.log(instruction.address + "\t:\t" + instruction); iterator.keep(); } while ((instruction = iterator.next()) !== null); }, */ onCallSummary(summary) { /*//console.log(JSON.stringify(summary)); // 调用的所有函数及次数,注意并不是实际调用顺序。 for (const target in summary) { const number = summary[target]; if (number == TraceCallNum) { var module = Process.findModuleByAddress(target); if (module != null && module.name == TargetLibName) { console.log(module.name + "!" + ptr(target).sub(module.base)); } } }*/ }