MonkeyDev是一個極為方便的逆向調(diào)試平臺,集眾家所長
主要包含四個模塊
Logos Tweak -- 使用theos提供的logify.pl工具將.xm文件轉(zhuǎn)成.mm文件進行編譯,集成了Cydia Substrate,它的主要作用是針對OC方法、C函數(shù)以及函數(shù)地址進行HOOK操作。
CaptainHook Tweak -- 使用CaptainHook提供的頭文件進行OC函數(shù)的Hook以及屬性的獲取。
Command-line Tool -- 可以直接創(chuàng)建運行于越獄設(shè)備的命令行工具。
MonkeyApp -- 自動給第三方應(yīng)用集成Reveal、Cycript和注入dylib的模塊,支持調(diào)試dylib和第三方應(yīng)用,只需要準備一個砸殼后的ipa或者app文件即可。
準備
使用
-
新建MonkeyDev項目,選擇MonkeyApp,輸入工程名,下一步即可
new project - 將砸殼后的ipa,拖入工程中
copy ipa
注:以前可以通過PP助手下載,越獄應(yīng)用即可獲得砸殼后的ipa,但是現(xiàn)在PP助手已不復存在!只有通過自己來砸殼了,獲取砸殼ipa的方法:
frida砸殼
Clutch砸殼
dumpdecrypted砸殼
其中,frida砸殼成功率最高,但是它的環(huán)境配置比較麻煩;Clutch環(huán)境配置簡單,砸殼成功率一般;dumpdecrypted最后導出的是decrypt文件,需要進行其他處理。 - run起來,就可以完成重簽名,讓他人之物變?yōu)樽约旱?,然后進行態(tài)調(diào)試,動態(tài)調(diào)試需要使用LLDB的高級用法和Chisel
- 文件擴展名的意義,x代表這個文件支持 Logos 語法
.x 將由Logos處理,然后進行預處理并編譯為objective-c。
.xm 將由Logos處理,然后進行預處理并編譯為objective-c ++。
Logos語法
- %hook - 指定需要hook的類,必須以%end結(jié)尾
- %log - hook內(nèi)部使用,將函數(shù)的類名及參數(shù)寫入syslog中,可以追加打印內(nèi)容%log[,.....]
- %orig - hook內(nèi)部使用,執(zhí)行被hook的函數(shù)的原始代碼,可以使用%orig改變原始函數(shù)參數(shù)
- %group - 將%hook分組,便于代碼管理,必須以%end結(jié)尾
- %init - 初始化某個%group,必須在%hook或%ctor中使用;如果帶參數(shù),則初始化指定的group,如果不帶參數(shù),則初始化_ungrouped;%group只有調(diào)用了%init后才會被初始化
- %ctor - Tweek的constructor,完成初始化工作;如果沒有定義,Theos則會自動生成一個%ctor,并在其中調(diào)用%init(_ungrouped)
- %new - 在hook內(nèi)部使用,給一個現(xiàn)有的class添加新函數(shù)
- %c - 根據(jù)類名獲取一個類
小試牛刀-動態(tài)調(diào)試釘釘,并將帳號密碼展示到頁面上
- 將砸過殼的ipa的頭文件導出
class_dump -H .app路徑 -o DingTalkHeaders
通過工具打開頭文件文件夾,以備后用

-
運行MonkeyDev Demo,進入帳號密碼登錄頁
帳號密碼登錄頁 -
點擊Debug View Hierarchy
Debug View Hierarchy
進入Debug View
找到頁面的類,以及當前對象的內(nèi)存地址
-
通過類名DTAccountPasswordViewController,到頭文件去搜索
DTAccountPasswordViewController
這里我們看到了想要hook的帳號和密碼的view,下面以密碼為例
-
先來看下密碼輸入框的類結(jié)構(gòu),在頭文件中搜索DTLoginPasswordInputView
DTLoginPasswordInputView
DTPasswordTextField
這樣一來密碼框的繼承關(guān)系就很明顯了,我們在DTAccountPasswordViewController中找到passwordView,再在passwordView中找到passwordTextField,最后打印它的text即可,下面我們通過lldb來驗證下
lldb驗證
帳號的hook步驟與密碼一樣!
這里在點擊登錄時做一個展示帳號密碼的操作,所以我們需要看下登錄按鈕的觸發(fā)了什么方法,找到登錄按鈕的內(nèi)存地址,并使用LLDB高級指令pactions,查看它的target和action
pactions
現(xiàn)在頭文件中看下DTAccountPasswordViewController這個類的loginButtonPressed的方法
loginButtonPressed
接下來我們就可以hookloginButtonPressed
下面看下logos代碼的實現(xiàn)
// See http://iphonedevwiki.net/index.php/Logos
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface DTAccountPasswordViewController:UIViewController
- (void)showPassword:(NSString *) msg;
@end
%hook DTAccountPasswordViewController
- (void)loginButtonPressed:(id)arg1 {
//獲取帳號
NSString *phone = [[[self valueForKey:@"phoneView"] valueForKey:@"_mobileInputView"] valueForKey:@"text"];
//獲取密碼內(nèi)容
NSString *pwd = [[[self valueForKey:@"passwordView"] valueForKey:@"passwordTextField"] valueForKey:@"text"];
[self showPassword:[NSString stringWithFormat:@"%@??????%@",phone, pwd]];
//%orig;
}
%new
- (void)showPassword:(NSString *) msg{
UIView *bgView = [[UIView alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
bgView.backgroundColor = [UIColor clearColor];
[[[UIApplication sharedApplication] keyWindow] addSubview:bgView];
UILabel* lab = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 300, 40)];
lab.layer.cornerRadius = 4;
lab.backgroundColor = [UIColor orangeColor];
lab.text = msg;
lab.textColor = [UIColor whiteColor];
lab.textAlignment = NSTextAlignmentCenter;
lab.alpha = 0.8;
lab.center = bgView.center;
[bgView addSubview:lab];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[bgView removeFromSuperview];
});
}
%end
重新運行,看下效果

至此,我們就完成了帳號密碼的hook,真是牛批
生活如此美好,今天就點到為止。。。










