Hook到了一个函数,打印arg1的属性报错

我想hook 一个app定位回调,看到arg1中有个m_loactionMgrList数组 里面可能是我想要的 但是想打印编译不了
%hook MMLocationMgr

  • (void)locationManager:(id)arg1 didUpdateToLocation:(id)arg2 fromLocation:(id)arg3{
    NSLog(@"\n定位didUpdateToLocationarg1 %@\n",arg1.m_loactionMgrList); //这一行编译不通过
    NSLog(@"\n定位didUpdateToLocationarg2 %@\n",arg2);
    NSLog(@"\n定位didUpdateToLocationarg3 %@\n",arg3);
    %orig;

}
%end

可能是需要在某个地方声明下? 请问在哪里呢,我尝试在几个地方声明 但是都报错

你的arg1是id类型,编译的时候他是没有m_loactionMgrList这个属性的,所以你直接用. 去获取是会报错的

明白,但是怎么骗过编译器 从而打印这个数组呢

你用id类型的对象。获取这个属性的值

然后再打印

%hook MMLocationMgr

  • (void)locationManager:(id)arg1 didUpdateToLocation:(id)arg2 fromLocation:(id)arg3{
    //NSLog(@"\n微信定位didUpdateToLocationarg1 %@\n",arg1.m_loactionMgrList);
    id obj = arg1;
    NSLog(@"\n微信定位didUpdateToLocationarg1 %@\n",obj.m_loactionMgrList);
    NSLog(@"\n微信定位didUpdateToLocationarg2 %@\n",arg2);
    NSLog(@"\n微信定位didUpdateToLocationarg3 %@\n",arg3);
    %orig;

}
%end

这样么

这样也报错的。。。。。

确实,那怎么用 id类型的对象。获取这个属性的值呐

用object_send。吧属性获取出来

valueForKeyPath:

查一下 KVC 使用方法,或者自己导入一个头文件

1 个赞

已解决 感谢