ios使用theos tweak logify.pl自动hook .h头文件中所有的方法

47 篇文章 4 订阅
8 篇文章 2 订阅

配置theos环境变量

theos文件夹下的bin,下有一个logify.pl
把这个 theos/bin添加到系统环境变量里,就可以在任意位置使用这个pl文件
执行命令

open ~/.zshrc

添加一行:

export PATH="theos的路径/theos/bin:$PATH"

然后让环境变量生效

source ~/.zshrc

手动在tweak里打印一个函数的信息

找到我们已经脱壳,并且已经使用class-dump导出了一个app包的.h头文件.
因为这些头文件里面方法太多,想要实验某个方法被执行需要如下操作:

%hook ViewController
- (id)testFunc:(id)arg1  {
%log;  //打印信息
id r = %orig; //执行原来的方法过程
NSLog(@" = %@", r);  //打印返回值
return r; //返回原来的值
}

这样在xcode里面 Window->Devices and Simulators->Open Console->开始 可以看到控制台的信息,如果testFunc被执行,%log
就会打印出来testFunc的函数名和参数

但是如果一个.h文件中有几十个方法,那么每个方法都这样写,太麻烦了.

使用logify.pl自动生成一个.h文件中的所有函数的打印信息

在终端进入.h文件的目录下执行下列命令.>一个大于号,是覆盖,就是重新生成.xm文件

logify.pl 文件名.h > 文件名.xm

只打印函数名

使用

NSLog(@"%@", NSStringFromSelector(_cmd));

代替%log;
可以只打印函数名,这样在控制台查看打印信息可以简洁点,因为%log还会输出frame和参数等信息

修改报错

因为是自动生成的,make编译以后会报错

error: unknown type name ‘xxx’

  • 修改方法1:
    是没有找到类名
    解决方法:
    @class 类名
    @protocol 协议名
    建议直接把原来用class-dump导出的.h里面的 @class 和 @protocol 里面的所有类名协议名字都赋值到 .xm 或者.x文件里
  • 修改方法2(推荐):
    把类指针改成void *
    例如 error: unknown type name ‘xxView’
就全文查找  xxView *
替换成  void * 

注意中间的空格,后面要加*,否则不是类指针的变量也被替换

error: no type or protocol named ‘xxxDelgate’

找不到某某协议
解决方法
在xxx协议两边添加尖括号,搜索替换成空,例如 xxxDelegate

搜索: <xxxDelegate>
替换成空

error: ARC __weak lifetime qualifier on return type is ignored [-Werror,-Wignored-qualifiers]

直接 cmd+ shift+f 替换 __weak 为空

error: interface type ‘xxxType’ cannot be passed by value; did you forget * in ‘xxxType’?

这个是没找到这个类型的定义,可以把这个类型替换成id类型

error: unknown type name ‘inout’; did you mean ‘ino_t’?

把inout直接替换为空

error: expected selector for Objective-C method

  • (void).cxx_destruct
    这种.点开头的方法直接删掉

error: cast from pointer to smaller type ‘unsigned int’ loses information .

  • 这种unsigned 如果是在 NSLog(@" = 0x%x", (unsigned int)r) 里面 ,搜索
NSLog(@" = 0x%x", (unsigned int)r) 

替换成下面,因为 r是对象类型用%@可以打印

NSLog(@"%@",r);
  • 如果不是因为 NSLog(@" = 0x%x", (unsigned int)r) 出错,而是 xxxDelegate方法里面带<协议>的,后面%log会出错
    解决方法1:去掉 <协议>
    解决方法2:把%log去掉换成 NSLog(@"%@", NSStringFromSelector(_cmd)); 只打印方法名
    例如下面的会报错
(void)setM_delegate:( id <BaseMsgContentDelgate> )m_delegate { %log; %orig; }

修改方法1 去掉协议:

- (void)setM_delegate:( id )m_delegate { %log; %orig; }

修改方法2 去掉%log ,去掉NSLog(@" = 0x%x", (unsigned int)r); ,改成用 NSLog(@"%@", NSStringFromSelector(_cmd)); 来打印
例如下面:

- (void)setM_delegate:( id <BaseMsgContentDelgate> )m_delegate { NSLog(@"%@", NSStringFromSelector(_cmd)); %orig; }
用下面代码来打印信息
NSLog(@"%@", NSStringFromSelector(_cmd));  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值