上一篇文章: "靜待花開:iOS密碼學算法解讀"
1.
如果遇到bool類型的方法,我們如何調試.
我依然用源項目代碼做實驗.
ViewController
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)UIButton *revealBtn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.view addSubview:self.revealBtn];
[self booljudge];
}
-(BOOL)booljudge{
NSLog(@"hello bool judge");
int i = 100;
if (i > 0) {
NSLog(@"i > 0 ture");
return true;
}else{
NSLog(@"i < 0 false");
return false;
}
}
-(UIButton*)revealBtn{
if (!_revealBtn) {
_revealBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_revealBtn.frame = CGRectMake(100,100, 100,40);
_revealBtn.backgroundColor = [UIColor redColor];
[_revealBtn setTitle:@"測試" forState:UIControlStateNormal];
[_revealBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[_revealBtn addTarget:self action:@selector(revealClick) forControlEvents:UIControlEventTouchUpInside];
}
return _revealBtn;
}
-(void)revealClick{
NSLog(@"hello");
}
@end
我在代碼中加入了 -(BOOL)booljudge的方法
我們編譯源碼生成IPA文件后,從中提取可執行文件。
我們使用class-dump工具導出頭文件。如果你是從這篇文章開始閱讀的,你可以查看有關class-dump工具的詳細介紹。
我們找到了一個名為ViewController的頭文件。
#import "UIViewController.h"
@class UIButton;
@interface ViewController : UIViewController
{
UIButton *_revealBtn;
}
- (void).cxx_destruct;
- (_Bool)booljudge;
@property(retain, nonatomic) UIButton *revealBtn; // @synthesize revealBtn=_revealBtn;
- (void)revealClick;
- (void)viewDidLoad;
@end
我們找到
- (_Bool)booljudge
方法我們接著寫hook方法的代碼
-(id)booljudge{
NSLog(@"this a bool function");
return %orig;
}
這樣只需使用return %orig來返回,以確保源碼正常執行。
如果將返回類型修改為true或false,則只會執行一種邏輯。
我們接著對tweak工程進行編譯到安裝.如果你看到這里的朋友,你可以查看一下tweak工程文章,如何創建tweak項目.
下面是打印的日志輸出
源代碼是這樣寫的
-(BOOL)booljudge{
NSLog(@"hello bool judge");
int i = 100;
if (i > 0) {
NSLog(@"i > 0 ture");
return true;
}else{
NSLog(@"i < 0 false");
return false;
}
}
hook 代碼
-(id)booljudge{
NSLog(@"this a bool function");
return %orig;
}
如果需要深入分析代碼中的源碼邏輯,最好的方式是親自動手試試。通過實際操作和調試,您可以更好地理解代碼的執行流程和邏輯結構,發現潛在的問題并進行解決。實踐是加深理解和提升技能的最佳途徑,因此鼓勵大家積極動手,深入研究代碼。
2.
有位小伙伴的cycript -p 命令執行不成功
- 有可能是系統的原因導致的.
我的手機系統是iOS12.3
cycript -p 應用名/進程名 出錯了
我們該如何處理呢?
- 我們需要安裝另一款軟件.
1
wget http://apt.saurik.com/debs/cycript_0.9.594_iphoneos-arm.deb
2
wget http://www.tateu.net/repo/files/net.tateu.cycriptlistenertweak_1.0.0_iphoneos-arm.deb
3
wget http://www.tateu.net/repo/files/net.tateu.cyrun_1.0.5_iphoneos-arm.deb
4
pkg -i cycript_0.9.594_iphoneos-arm.deb
5
dpkg -i net.tateu.cycriptlistenertweak_1.0.0_iphoneos-arm.deb net.tateu.cyrun_1.0.5_iphoneos-arm.deb
- 我們安裝完成后,我們可以這樣執行命令
cyrun -n SpringBoard -e
Cycript加載到SpringBoard中。SpringBoard將終止并自動重啟
cyrun -n SpringBoard -d
SpringBoard卸載Cycript。SpringBoard將終止并自動重啟
- 我們來嘗試一下
我們已經注入TEST項目
- 我們打印一下層級結構
UIApp.keyWindow.recursiveDescription().toString()
- 其他命令需要親自嘗試.
3.
在點擊事件中加入其他控件
這里更簡單了,因為在之前我寫的hook demo里,我們已經加過一個alertView了。
%new
-(void)newMethod{
NSLog(@"first new mehtod");
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"溫馨提示" message:@"我的第一個tweak工程創建成功了" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:@"取消",nil];
[alertView show];
}
其他控件也可以同樣的添加.
4.
總結
- 本篇文章主要介紹了如何解決三個問題:
當遇到bool類型的方法時,我們如何進行調試。
cycript -p 命令執行不成功的解決方法。
如何在點擊事件中加入其他控件。
如果讀者嘗試了這些解決方案后仍然不適合自己的情況,可以考慮尋找其他原因,因為問題可能由多種因素引起,例如系統設置等。
感謝您的閱讀和關注。