文章目录
配置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));