0xEA
大佬,基于stalker封装的那几个函数能否发下
function trace_entry_bl(baseModeName, targetAddr, traceStartAddr, traceEndAddr, bEnterCall = false) {
traceInit()
var baseAddr = 0
try{
baseAddr = Module.findBaseAddress(baseModeName)
if(!baseAddr) {
console.log("can't find module:", baseModeName)
return;
}
var imports = Module.enumerateImportsSync(baseModeName)
for(var i = 0; i < imports.length; i++){
g_imports[imports[i].address] = imports[i].name
}
var exports = Module.enumerateExportsSync(baseModeName)
for(var i = 0; i < exports.length; i++){
g_exports[exports[i].address] = exports[i].name
}
}catch (e) {
console.log(e.stack)
return
}
console.log(baseModeName, baseAddr)
var modinfo = getBaseInfoByAddr(ptr(baseAddr).add(traceStartAddr))
var modBase = modinfo["base"]
var modSize = modinfo["size"]
g_baseAddr = modBase
g_baseSize = modSize
Interceptor.attach(targetAddr, {
onEnter: function (args) {
//对参数进行排除
for(var i = 0; i < g_excludeArgs.length; i++){
if((ptr(g_excludeArgs[i]).compare(this.context.x2)) == 0){
return
}
}
g_enterCondition = true
if(!g_runOnce){
return ;
}
this.tid = Process.getCurrentThreadId();
if(g_traceTid == 0){
g_traceTid = this.tid
}else{
if(g_traceTid != this.tid){
return ;
}
}
console.log("-------------------------------- Enter targetAddr bl --------------------------------")
console.log(this.context.x2)
Stalker.follow(this.tid, {
events: {
call: false,
ret: false,
exec: false,
block: false,
compile: false
}, onReceive: function (events) {
}, transform: function (iterator) {
var instruction = iterator.next();
const startAddr = instruction.address
var isModule = false
if(bEnterCall){
isModule = startAddr.compare(ptr(modBase)) >= 0 && startAddr.compare(ptr(modBase).add(modSize)) <= 0
}else{
isModule = startAddr.compare(baseAddr.add(traceStartAddr)) >= 0 && startAddr.compare(baseAddr.add(traceEndAddr)) <= 0;
}
do{
if(isModule){
// iterator.putCallout(context => {
// })
}
iterator.keep()
if(isModule){
iterator.putCallout((context) => {
var insnNext = Instruction.parse((context.pc.add(4)))
if(insnNext.mnemonic.startsWith("bl")){
var bShow = true;
var args = ""
args = "\t\t\t\t\t\tx0:" + context.x0 +
", x1:" + context.x1 +
", x2:" + context.x2 +
", x3:" + context.x3 +
", x4:" + context.x4 +
", x5:" + context.x5 +
", x6:" + context.x6 +
", x7:" + context.x7
console.log(args)
var tmp = getAddrStr(context.x0)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ0:" + tmp)
}
tmp = getAddrStr(context.x1)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ1:" + tmp)
}
tmp = getAddrStr(context.x2)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ2:" + tmp)
}
tmp = getAddrStr(context.x3)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ3:" + tmp)
}
tmp = getAddrStr(context.x4)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ4:" + tmp)
}
tmp = getAddrStr(context.x5)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ5:" + tmp)
}
tmp = getAddrStr(context.x6)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ6:" + tmp)
}
tmp = getAddrStr(context.x7)
if(tmp.length > 0){
console.log("\t\t\t\t\t\targ7:" + tmp)
}
if(insnNext.mnemonic == "bl"){
var jmpAddr = getBAddr(context, insnNext)
var insnTmp = Instruction.parse(ptr(jmpAddr))
var insnTmp2 = Instruction.parse(ptr(jmpAddr).add(4))
if(insnTmp.mnemonic == "adrp" && insnTmp2.mnemonic == "ldr"){
var insnBase = ptr(insnTmp.operands[1].value)
var insnOff = insnTmp2.operands[1].value.disp
var blFuncName = g_imports[insnBase.add(insnOff).readPointer()]
var insnBlStr = insnNext.toString().padEnd(25, " ")
if(blFuncName != undefined){
insnBlStr = "bl " + blFuncName
}else{
// console.log("blFuncName not found")
//尝试拿取模块名及偏移
blFuncName = g_exports[insnBase.add(insnOff).readPointer()]
if(blFuncName != undefined) {
blFuncName = getModOffsetInfo(jmpAddr)
}
insnBlStr = insnBlStr + " bl " + blFuncName + " "
}
insnBlStr = insnBlStr.padEnd(25, " ")
console.log(insnNext.address.sub(baseAddr) + " " + insnNext.address + ":\t" + insnBlStr + "<--> ")
bShow = false
}
}
if(insnNext.mnemonic == "blr"){
var jmpAddr = getBAddr(context, insnNext)
var insnTmp = Instruction.parse(ptr(jmpAddr))
var insnTmp2 = Instruction.parse(ptr(jmpAddr).add(4))
if(insnTmp.mnemonic == "adrp" && insnTmp2.mnemonic == "ldr"){
var insnBase = ptr(insnTmp.operands[1].value)
var insnOff = insnTmp2.operands[1].value.disp
var blFuncName = g_imports[insnBase.add(insnOff).readPointer()]
var insnBlStr = insnNext.toString().padEnd(25, " ")
if(blFuncName != undefined){
insnBlStr = "bl " + blFuncName
}
insnBlStr = insnBlStr.padEnd(25, " ")
console.log(insnNext.address.sub(baseAddr) + " " + insnNext.address + ":\t" + insnBlStr + "<--> ")
bShow = false
}
}
if(bShow){
if(insnNext.mnemonic.startsWith("bl")){
var insnNextStr = insnNext.toString().padEnd(25, " ")
var bAddr = getBAddr(context, insnNext)
var bOffset = bAddr.sub(baseAddr)
var outModuleName = ""
if(bAddr < baseAddr || bAddr > baseAddr.add(g_baseSize)){
var outModuleInfo = getBaseInfoByAddr(bAddr)
if(outModuleInfo != null){
outModuleName = outModuleInfo["name"]
var outModuleOffset = ptr(bAddr).sub(outModuleInfo["base"])
bOffset = outModuleName + "!" + outModuleOffset
if(outModuleName in g_allExports){
var mdexpts = g_allExports[outModuleName]
if(ptr(bAddr) in mdexpts){
bOffset = bOffset + " " + mdexpts[ptr(bAddr)]
}else if(ptr(bAddr) in g_artSymbols){
bOffset = bOffset + " " + g_artSymbols[ptr(bAddr)]
}
}
}
}
console.log(insnNext.address.sub(baseAddr) + " " + insnNext.address + ":\t" + insnNextStr + "\t" + "-->(" + bOffset + ") " + getOpInfo(context, insnNext))
}
}
}
})
}
}while((instruction = iterator.next()) != null);
}, onCallSummary: function (summary) {
}
})
}, onLeave: function (retval) {
var tid = Process.getCurrentThreadId();
if(g_traceTid != 0){
if(g_traceTid == tid){
if(g_runOnce){
g_runOnce = false;
if(g_enterCondition){
Stalker.unfollow(g_traceTid)
g_traceTid = 0
console.log("retval:", retval)
console.log("-------------------------------- Leave targetAddr bl --------------------------------")
}
}
}
}
}
})
}
将就一下,我都不好意思发,新手代码风格,大致逻辑就是这样子的,其它的也是在这个基础上进行的改动