ios使用theos tweak logify.pl自动hook .h头文件中所有的方法
文章目錄
- 配置theos環境變量
- 手動在tweak里打印一個函數的信息
- 使用logify.pl自動生成一個.h文件中的所有函數的打印信息
- 只打印函數名
- 修改報錯
- error: unknown type name 'xxx'
- error: no type or protocol named 'xxxDelgate'
- error: ARC __weak lifetime qualifier on return type is ignored [-Werror,-Wignored-qualifiers]
- error: interface type 'xxxType' cannot be passed by value; did you forget * in 'xxxType'?
- error: unknown type name 'inout'; did you mean 'ino_t'?
- error: expected selector for Objective-C method
- error: cast from pointer to smaller type 'unsigned int' loses information .
配置theos環境變量
theos文件夾下的bin,下有一個logify.pl
把這個 theos/bin添加到系統環境變量里,就可以在任意位置使用這個pl文件
執行命令
添加一行:
export PATH="theos的路徑/theos/bin:$PATH"然后讓環境變量生效
source ~/.zshrc手動在tweak里打印一個函數的信息
找到我們已經脫殼,并且已經使用class-dump導出了一個app包的.h頭文件.
因為這些頭文件里面方法太多,想要實驗某個方法被執行需要如下操作:
這樣在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’
注意中間的空格,后面要加*,否則不是類指針的變量也被替換
error: no type or protocol named ‘xxxDelgate’
找不到某某協議
解決方法
在xxx協議兩邊添加尖括號,搜索替換成空,例如 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) 里面 ,搜索
替換成下面,因為 r是對象類型用%@可以打印
NSLog(@"%@",r);- 如果不是因為 NSLog(@" = 0x%x", (unsigned int)r) 出錯,而是 xxxDelegate方法里面帶<協議>的,后面%log會出錯
解決方法1:去掉 <協議>
解決方法2:把%log去掉換成 NSLog(@"%@", NSStringFromSelector(_cmd)); 只打印方法名
例如下面的會報錯
修改方法1 去掉協議:
- (void)setM_delegate:( id )m_delegate { %log; %orig; }修改方法2 去掉%log ,去掉NSLog(@" = 0x%x", (unsigned int)r); ,改成用 NSLog(@"%@", NSStringFromSelector(_cmd)); 來打印
例如下面:
總結
以上是生活随笔為你收集整理的ios使用theos tweak logify.pl自动hook .h头文件中所有的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 的 max_allowed_
- 下一篇: alipay_open_auth_tok