Frida如何获取block数据

目的是想拿到网络通讯数据,一般在AF里数据在block回调里,现在就卡在怎么拿到block里的数据,请大神指教~~

iOS :8.1.3 越狱
MAC: 10.13.1
FRIDA: 12.1.2

脚本里拿到block代码:

var sucblock = new ObjC.Object(args[4]);

运行结果 :
message: {‘type’: ‘send’, ‘payload’: ‘success : < NSStackBlock : 0x16fd1db50>’} data: None

拿到block 后,我想把 block里的数据拿到

我尝试过看官方写的方法

const pendingBlocks = new Set();

Interceptor.attach(…,
{
onEnter(args)

{

const block = new ObjC.Block(args[4]);
pendingBlocks.add(block);// Keep it alive

const appCallback = block.implementation;

block.implementation = (error, value) =>
{ // Do your logging here
const result = appCallback(error, value);
pendingBlocks.delete(block);
return
result;
};
}
});

可能是我没理解透,总是不对,不知道怎么拿到block里的数据,求大神指点~~十分感谢

if(ObjC.available) {
var hook = ObjC.classes.className["- funcName"];
Interceptor.attach(hook.implementation, {
    onEnter: function(args) {
        var block = new ObjC.Block(args[4]);
        const appCallback = block.implementation;
        block.implementation = function (error, value)  {
            const result = appCallback(1, null);
            return result;
        };
    },
});
} else {
console.log("Objective-C Runtime is not available!");
}
3 个赞

首先谢谢您

您能解释一下
block.implementation = function (error, value)//这里的error,value是固定写,还是需要怎么修改吗 {
const result = appCallback(1, null) //这里的参数我也不太懂该怎么写;
return result;
};

最后我怎么将里面的值打印出来呢
我试了console.log("Block : " + appCallback.toString());

但结果是:
Block : function bound () { [bound code] }

十分感谢~~

是小白就得回复要审核好久吗。。。

那怎么打印返回值呢,十分感谢

https://blog.csdn.net/bboyfeiyu/article/details/25284461
请耐心的把这个看完,你如果想知道 appCallback 里面有啥,可以尝试 console.log("appCallback:"+ appCallback()),PS:应该是个内存地址,我没有打印过 :stuck_out_tongue:

我会耐心把它看完的,哈哈哈,虾虾农~~~

哇,我和你是一模一样的问题,请问你最后解决了吗?应该打印什么呀,我也试了好久都打印不出啥

好久了,都不太记得了,好像卡在那最后也不知道怎么打印里面的值,不过如果是从HOOK的角度其实可以换个思路,比如要破加解密你不用知道里面的内容直接调方法就行

啊哈?啥意思?hook直接调用原方法然后打印?哎。。。。我是想打印网络请求里面的数据,也试了好久都不行

哈哈哈哈,我是不知道怎么打印,所以换个思路解决我的问题,我们的需求不一样,你再问问大神们,我也很想知道

我觉得我俩一样啊,你不是也想拿到网络通讯数据吗?然后我就想hook常见的网络接口,所以最后你是hook了https加解密那儿吗?谢谢你啦~

是,我原来也是想hook常见的网络接口直接拿到请求和返回数据就行了,但如果是攻击的话其实可以直接把你要发的数据去调接口去发就行,如果是加密了就去看它的加密方法直接调然后让它发就行了,你好好再查查,我也好想知道怎么拿block里的数据,知道了要告诉我哦~~

更新:我发现他除了报错,也可以正常打印诶

hi~在今天的bug中又挖到你的回复了,哈哈哈哈,我也是想用frida hook AF中的函数,然后想打印block的内容,但是先不管block,为啥我用官方那一段代码,也就是你粘贴的这一段也报错啊
代码如下
if(ObjC.available) {
var className = “NSURLSession”;
var funcName = “- dataTaskWithRequest:completionHandler:”;
var hook = eval(‘ObjC.classes.’ + className + ‘["’ + funcName + ‘"]’);
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
var block = new ObjC.Block(args[4]);
console.log(“block11:” + block);
const appCallback = block.implementation;
console.log(“block22:” + appCallback.toString());
block.implementation = function (error, value) {
const result = appCallback(1, null);
return result;
};
},
});
} else {
console.log(“Objective-C Runtime is not available!”);
}

错误如下
Error: access violation accessing 0x18

at Block (frida/node_modules/frida-objc/index.js:1258)

at /repl1.js:132 dataTaskWithRequest retval -> object

TypeError: cannot read property ‘retType’ of undefined

at [anon] (duk_hobject_props.c:2384)

at frida/node_modules/frida-objc/index.js:1313

at /repl1.js:133

主要就是两个错误 一个是 access violation 一个是 “rettype” of undefined

谢谢~

一定一定,原来你是想攻击,我是想分析应用行为,所以必须要知道函数中拿了啥数据,知道了告诉你哈~

想问一下 有知道怎么分析行为了么, 我查了论坛之后发现大家好像都是知道入参类型, 能Hook就好了.
我的场景是 Block返回来的数据是加密的, 在Block内部本地解密, 我想■■他解密是怎么做的, 所以需要知道他的每一步.

lldb po一下不就知道类型了?

刚看到, 不知道我们的信息是否有偏差, 我的场景是想知道在这个Block中, 执行的每一步都是什么, 而不是他的参数类型以及具体是什么 (我当前场景是网络请求的数据处理, 抓包可以看到后端返回的原始数据, 我是想知道本地如何解密的)

那看汇编,看f5,或者lldb单步就好了啊

之前一直是CaptainHook来搞的, 惭愧, 那尝试用lldb一步步走试试, 谢谢思路~