Amanda
(Amanda)
1
目的是想拿到网络通讯数据,一般在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里的数据,求大神指点~~十分感谢
xkang
(Frida&IOS)
2
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 个赞
Amanda
(Amanda)
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] }
十分感谢~~
xkang
(Frida&IOS)
8
https://blog.csdn.net/bboyfeiyu/article/details/25284461
请耐心的把这个看完,你如果想知道 appCallback
里面有啥,可以尝试 console.log("appCallback:"+ appCallback())
,PS:应该是个内存地址,我没有打印过
哇,我和你是一模一样的问题,请问你最后解决了吗?应该打印什么呀,我也试了好久都打印不出啥
Amanda
(Amanda)
11
好久了,都不太记得了,好像卡在那最后也不知道怎么打印里面的值,不过如果是从HOOK的角度其实可以换个思路,比如要破加解密你不用知道里面的内容直接调方法就行
啊哈?啥意思?hook直接调用原方法然后打印?哎。。。。我是想打印网络请求里面的数据,也试了好久都不行
Amanda
(Amanda)
13
哈哈哈哈,我是不知道怎么打印,所以换个思路解决我的问题,我们的需求不一样,你再问问大神们,我也很想知道
我觉得我俩一样啊,你不是也想拿到网络通讯数据吗?然后我就想hook常见的网络接口,所以最后你是hook了https加解密那儿吗?谢谢你啦~
Amanda
(Amanda)
15
是,我原来也是想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内部本地解密, 我想■■他解密是怎么做的, 所以需要知道他的每一步.
刚看到, 不知道我们的信息是否有偏差, 我的场景是想知道在这个Block
中, 执行的每一步都是什么, 而不是他的参数类型以及具体是什么 (我当前场景是网络请求的数据处理, 抓包可以看到后端返回的原始数据, 我是想知道本地如何解密的)
之前一直是CaptainHook
来搞的, 惭愧, 那尝试用lldb
一步步走试试, 谢谢思路~