日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios使用theos tweak logify.pl自动hook .h头文件中所有的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 配置theos環(huán)境變量
  • 手動在tweak里打印一個函數(shù)的信息
  • 使用logify.pl自動生成一個.h文件中的所有函數(shù)的打印信息
  • 只打印函數(shù)名
  • 修改報錯
    • 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環(huán)境變量

theos文件夾下的bin,下有一個logify.pl
把這個 theos/bin添加到系統(tǒng)環(huán)境變量里,就可以在任意位置使用這個pl文件
執(zhí)行命令

open ~/.zshrc

添加一行:

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

然后讓環(huán)境變量生效

source ~/.zshrc

手動在tweak里打印一個函數(shù)的信息

找到我們已經(jīng)脫殼,并且已經(jīng)使用class-dump導(dǎo)出了一個app包的.h頭文件.
因?yàn)檫@些頭文件里面方法太多,想要實(shí)驗(yàn)?zāi)硞€方法被執(zhí)行需要如下操作:

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

這樣在xcode里面 Window->Devices and Simulators->Open Console->開始 可以看到控制臺的信息,如果testFunc被執(zhí)行,%log
就會打印出來testFunc的函數(shù)名和參數(shù)

但是如果一個.h文件中有幾十個方法,那么每個方法都這樣寫,太麻煩了.

使用logify.pl自動生成一個.h文件中的所有函數(shù)的打印信息

在終端進(jìn)入.h文件的目錄下執(zhí)行下列命令.>一個大于號,是覆蓋,就是重新生成.xm文件

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

只打印函數(shù)名

使用

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

代替%log;
可以只打印函數(shù)名,這樣在控制臺查看打印信息可以簡潔點(diǎn),因?yàn)?log還會輸出frame和參數(shù)等信息

修改報錯

因?yàn)槭亲詣由傻?make編譯以后會報錯

error: unknown type name ‘xxx’

  • 修改方法1:
    是沒有找到類名
    解決方法:
    @class 類名
    @protocol 協(xié)議名
    建議直接把原來用class-dump導(dǎo)出的.h里面的 @class 和 @protocol 里面的所有類名協(xié)議名字都賦值到 .xm 或者.x文件里
  • 修改方法2(推薦):
    把類指針改成void *
    例如 error: unknown type name ‘xxView’
就全文查找 xxView * 替換成 void *

注意中間的空格,后面要加*,否則不是類指針的變量也被替換

error: no type or protocol named ‘xxxDelgate’

找不到某某協(xié)議
解決方法
在xxx協(xié)議兩邊添加尖括號,搜索替換成空,例如 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
    這種.點(diǎn)開頭的方法直接刪掉

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

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

替換成下面,因?yàn)?r是對象類型用%@可以打印

NSLog(@"%@",r);
  • 如果不是因?yàn)?NSLog(@" = 0x%x", (unsigned int)r) 出錯,而是 xxxDelegate方法里面帶<協(xié)議>的,后面%log會出錯
    解決方法1:去掉 <協(xié)議>
    解決方法2:把%log去掉換成 NSLog(@"%@", NSStringFromSelector(_cmd)); 只打印方法名
    例如下面的會報錯
(void)setM_delegate:( id <BaseMsgContentDelgate> )m_delegate { %log; %orig; }

修改方法1 去掉協(xié)議:

- (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));

總結(jié)

以上是生活随笔為你收集整理的ios使用theos tweak logify.pl自动hook .h头文件中所有的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。