一 目标
目标:比如回调函数会安排到了block里面,我们该如何用frida hook呢?
阅读时间:3分钟
二 步骤
2.1 首先我们写一个主动调用block的案例
console.log('\n')
var nsarr = ObjC.classes.NSMutableArray.array();
nsarr.addObject_("xiaoming")
nsarr.addObject_(15)
var handler = new ObjC.Block({
retType:'void',
argTypes:['object','int','int'],
implementation:function (a,b,c){
console.log('原block函数===》',a,b,c);
}
})
// 这里是枚举这个NSMutableArray,调用block函数handler
nsarr.enumerateObjectsUsingBloc k_(handler);
2.2 然后hook该block
console.log('\n')
var nsarr = ObjC.classes.NSMutableArray.array();
var arrUsingBlock = ObjC.classes.NSMutableArray['- enumerateObjectsUsingBlock:'];
const oldArrUsingBlock = arrUsingBlock.implementation;
// 替换掉arrUsingBlock.implementation的默认实现
arrUsingBlock.implementation = ObjC.implement(arrUsingBlock,function (handle,selector,callback){
var ret;
try{
// 【1】这个位置就是获取到block这个对象,然后我们修改其implementation方法。
console.log("callback",callback,new ObjC.Object(callback))
var block = new ObjC.Block(callback); // 获取到block 想设定需要这么写
const oldblock = block.implementation;
block.implementation = function (obj,idx,stop){
console.log("hook output",obj,idx)
// return oldblock(obj,idx,stop) // 返回不返回原函数都可以
}
// 【2】再次调用该方法,就会调用到改完了implementation的block,每次调用block,就会走自己定制的block了。
ret = oldArrUsingBlock(handle,selector,callback)
console.log(ret)
}catch (err){
console.log(err)
}
return ret;
})
nsarr.addObject_("xiaoming")
nsarr.addObject_(15)
var handler = new ObjC.Block({
retType:'void',
argTypes:['object','int','int'],
implementation:function (obj,index,stop){
console.log('原block函数===》',obj, index,stop)
// console.log('原block函数===》',obj, index,hex(stop))
}
})
// 这里是枚举这个NSMutableArray,调用block函数handler
nsarr.enumerateObjectsUsingBlock_(handler);