0x01.MonkeyDev
MonkeyDev主要包含四個模塊:
Logos Tweak
使用theos提供的logify.pl工具將.xm文件轉(zhuǎn)成.mm文件進(jìn)行編譯策肝,集成了CydiaSubstrate西乖,可以使用MSHookMessageEx和MSHookFunction來Hook OC函數(shù)和指定地址侄泽。
CaptainHook Tweak
使用CaptainHook提供的頭文件進(jìn)行OC 函數(shù)的Hook以及屬性的獲取呻纹。
Command-line Tool
可以直接創(chuàng)建運(yùn)行于越獄設(shè)備的命令行工具瓮床。
MonkeyApp
這是自動給第三方應(yīng)用集成Reveal志鹃、Cycript和注入dylib的模塊娄昆,支持調(diào)試dylib和第三方應(yīng)用,支持Pod給第三放應(yīng)用集成SDK佛纫,只需要準(zhǔn)備一個砸殼后的ipa或者app文件即可妓局。
你說他是集成也可以,說是二次開發(fā)也可以呈宇,反正非常方便好用而且穩(wěn)定好爬。
0x02.下載
配置環(huán)境
1.安裝最新的theos
sudo gitclone--recursive https://github.com/theos/theos.git /opt/theos
2.安裝ldid
brew install ldid,這個需要brew
安裝
1.選擇指定的Xcode安裝
sudo xcode-select ?-s ?+ 自己Xcode.app的路徑?
2.執(zhí)行安裝命令
sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)"
完成后重啟Xcode甥啄,就可以開始逆向開發(fā)了
0x03.簡單使用
例子就是fishhook的demo存炮,我簡單修改了一下button的邏輯讓它彈出一個提示框,我們就來看看怎么樣hook這個提示框
看看樣子
要Hook,先創(chuàng)建一個MonkeyDev工程啦
然后工程的結(jié)構(gòu)如圖所示
TaretApp是放我們要hook的應(yīng)用僵蛛,Logos編寫hook代碼尚蝌,fishhook就不多說了。這里有個點(diǎn)充尉,大哥告訴我說MonkeyDev是基于theos hook飘言,至于是基于fishhook來hook app的還是都有,我們等下看看驼侠。
把要hook的.ipa或者app文件夾放在TaretApp文件夾下姿鸿,put ipa or app here不要刪除。
然后就可以編寫Logos代碼來hook方法了倒源,很簡單
關(guān)于logos語法的官方文檔
hookdemoDylib.xm也會顯示苛预,只是這個名字是根據(jù)項(xiàng)目名來的,反正是這么個文件夾笋熬。
// See http://iphonedevwiki.net/index.php/Logos
#import@interfaceCustomViewController
@property(nonatomic,copy)NSString*newProperty;
+(void)classMethod;
-(NSString*)getMyName;
-(void)newMethod:(NSString*)output;
@end
%hook CustomViewController
+(void)classMethod{
%log;
%orig;
}
%new
-(void)newMethod:(NSString*)output {
NSLog(@"This is a new method : %@",output);
}
%new
-(id)newProperty {
returnobjc_getAssociatedObject(self,@selector(newProperty));
}
%new
-(void)setNewProperty:(id)value {
objc_setAssociatedObject(self,@selector(newProperty),value,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString*)getMyName
{
%log;
NSString*password=MSHookIvar<NSString*>(self,"_password");
NSLog(@"password:%@",password);
[%c(CustomViewController)classMethod];
[selfnewMethod:@"output"];
self.newProperty=@"newProperty";
NSLog(@"newProperty : %@",self.newProperty);
return %orig();
}
%end
以上可以對照官方文檔自己去看意思热某。
這里就使用基本的%hook即可
要使用Logos代碼來hook函數(shù),我們首先要知道這個函數(shù)的信息
在調(diào)試時獲取button控件的Controller信息
使用class-tump提取Mach-o文件中的@interface胳螟、@protocal信息提取并生產(chǎn)對應(yīng)的.h文件昔馋,通過該文件可查看被逆向應(yīng)用所有的類,及類的屬性糖耸、成員變量秘遏、方法。
把dump下來的文件夾放在sublime里面看
好嘉竟,開始寫代碼hook邦危,代碼如下:
%hook ViewController
- (void)crwindow{
? ? %log((NSString *)@"必須歡迎");
? ? UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"我不好" message:@"必須歡迎" preferredStyle:UIAlertControllerStyleAlert];
? ? [alert addAction:[UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil]];
? ? [[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController:alert animated:YES completion:nil];
}
%end
這里并不只有一個hook點(diǎn),這里做演示而已舍扰。
0x03.MSHookMessageEx
話說倦蚪,Hook有一種原理是通過Method Swizzle
一個方法的實(shí)現(xiàn)是保存在IMP里面的,?runtime提供了修改IMP的方法和交換兩個IMP實(shí)現(xiàn)的方法边苹。
Cydia Substrate是絕大部分tweak正常工作的基礎(chǔ)审丘,它由MobileHooker、MobileLoader和Safe mode組成勾给。
MobileHooker的作用就是替換系統(tǒng)函數(shù),也就是所謂的hook锅知,它主要包含以下兩個函數(shù):
void MSHookMessageEx (Classclass,SEL selector,IMP replacement,IMP*result);
void MSHookFunction (void*function,void*replacement,void**p_original);
其中MSHookMessageEx作用于Objective-C函數(shù)播急,通過調(diào)用method_setImplementtation函數(shù)將[class selector]的實(shí)現(xiàn)改成replacement,達(dá)到hook的目的售睹。說白了也就是修改IMP和交換IMP實(shí)現(xiàn)的方法桩警。
這在MonkeyApp工程運(yùn)行時生成的.mm文件中就有
Logos語法主要是對此函數(shù)作了一層封裝,讓編寫針對Objective-C函數(shù)的hook代碼變得更簡單直觀一些昌妹,所以對于Objective-C函數(shù)的hook捶枢,推薦使用Logos語法握截,當(dāng)然因人而異。
如果要對這種hook進(jìn)行檢查烂叔,當(dāng)然直接對HookMessageEx方法進(jìn)行檢測谨胞。
更本質(zhì)上是實(shí)現(xiàn)runtime過程中對imp指針的替換進(jìn)而達(dá)到對方法替換的目的。這個東西馬上學(xué)習(xí)一手蒜鸡。