"暢所欲言: iOS逆向問題討論"

上一篇文章: "靜待花開: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 命令執行不成功的解決方法。

    • 如何在點擊事件中加入其他控件。

如果讀者嘗試了這些解決方案后仍然不適合自己的情況,可以考慮尋找其他原因,因為問題可能由多種因素引起,例如系統設置等。

感謝您的閱讀和關注。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容