请教Frida 主动调用lib中的OC 函数 传参与崩溃问题

Hook 的目标函数只有一个参数,a1,拦截之后,想打印x的值,frida 该怎么去实现呢?

因为OC 的Native 的类型,frida 中很多对不上,不知道该怎么处理了,objc_msgSend 调用的函数是: NSArray 的 arrayWithObjects:count: ,我最开始的方式是:

var tmp=args[0].add(0x30).readPointer(); // 获取a1[6]
console.log(“tmp is :”,tmp);
var selfobj=new ObjC.Object(tmp); // a1[6]创建 一个OC的Object
var array_obj=ObjC.classes.NSArray["+ arrayWithObjects:count:"].call(selfobj,1)
然后提示
image
提示1要变成指针,我改成 ptr(1)传进去,然后又提示这个:
image
通过看上面的类型呢,发现那个1的参数应该是NSUInteger,可是这个类型,它也不是类啊,看了OC 他其实就是相当于 C语言的 Long类型,无解了。

然后换了一种思路,按照IDA中显示的拿来构造objc_msgSend的主动调用来实现截图中的部分,构造如下:
前面定义 objc_msgSend 的nativefunction 是这样的:
var func_send=new NativeFunction(objc_msgSend_addr,‘pointer’,[‘pointer’,‘pointer’,‘pointer’,‘int’]);
然后 主动调用的代码如下:
var tmpstring=Memory.allocUtf8String(“arrayWithObjects:count:”);
console.log(“come here alloc utfstring”);
var func_string=ObjC.classes.NSString’+ stringWithUTF8String:’;
console.log(“come here:”,func_string.toString());
var tmp=args[0].add(0x30).readPointer(); // 获取a1[6]
console.log(“tmp is :”,tmp);
var selfobj=new ObjC.Object(tmp); // a1[6]创建 一个OC的Object
var goal=ObjC.classes.NSArray.alloc();
var transation_array=func_send(goal,func_string,selfobj,1)
然后一运行就崩,研究看了好多资料,还是没解决,初次接触IOS 逆向,不懂的还有很多,特来论坛请教各路大神,希望能解答疑惑

因为这个arrayWithObjects_count_函数的参数分别是C风格的对象数组和整数,但是你传给它的是单个对象本身。
看ida反编译的写法,是在v5存储了a1[6]对象的指针,然后把v5传给函数。

[Apple iPhone::设置]-> var nss = ObjC.classes.NSString
[Apple iPhone::设置]-> var s = nss.stringWithString_(‘12345678901234567890’)
[Apple iPhone::设置]-> var nsa = ObjC.classes.NSArray
[Apple iPhone::设置]-> var w = Memory.alloc(8)
[Apple iPhone::设置]-> w.writePointer(s.handle)
“0x1077db1d0”
[Apple iPhone::设置]-> nsa.arrayWithObjects_count_(w,1)
{
“handle”: “0x2828e0420”
}
[Apple iPhone::设置]-> var i = nsa.arrayWithObjects_count_(w,1)
[Apple iPhone::设置]-> i.toString()
“(\n 12345678901234567890\n)”
[Apple iPhone::设置]->

1 个赞

:ox:哇 大佬!

如果是 objc_msgSend 这种实现方式呢?趁着大神来了 ,多学习学习 大神的姿势

参数是一样的,需要注意selector需要用ObjC.selector("- init")这样转换一下,不能直接用js或者OC的字符串;然后不同参数数量的需要单独声明,理论上除了用浮点数的都可以直接pointer

好的 谢谢,学习到了

有啥问题发论坛里吧。论坛里还有其他的大佬们,也方便之后有人碰到同类问题能搜到

就感觉 论坛 好像讨论也比较少,哈哈