ios hook框架之——MonkeyDev

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工程啦

new

然后工程的結(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信息


method

使用class-tump提取Mach-o文件中的@interface胳螟、@protocal信息提取并生產(chǎn)對應(yīng)的.h文件昔馋,通過該文件可查看被逆向應(yīng)用所有的類,及類的屬性糖耸、成員變量秘遏、方法。


class-dump

把dump下來的文件夾放在sublime里面看


知道要hook哪個了

好嘉竟,開始寫代碼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


寫好了


window也hook了

這里并不只有一個hook點(diǎn),這里做演示而已舍扰。

0x03.MSHookMessageEx

話說倦蚪,Hook有一種原理是通過Method Swizzle


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文件中就有


MSHookMessageEx

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í)一手蒜鸡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胯努,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逢防,更是在濱河造成了極大的恐慌叶沛,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘朝,死亡現(xiàn)場離奇詭異灰署,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)局嘁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門溉箕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人导狡,你說我怎么就攤上這事约巷。” “怎么了旱捧?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵独郎,是天一觀的道長。 經(jīng)常有香客問我枚赡,道長氓癌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任贫橙,我火速辦了婚禮贪婉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卢肃。我一直安慰自己疲迂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布莫湘。 她就那樣靜靜地躺著尤蒿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幅垮。 梳的紋絲不亂的頭發(fā)上腰池,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼示弓。 笑死讳侨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奏属。 我是一名探鬼主播跨跨,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拍皮!你這毒婦竟也來了歹叮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤铆帽,失蹤者是張志新(化名)和其女友劉穎咆耿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹橱,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萨螺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愧驱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慰技。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖组砚,靈堂內(nèi)的尸體忽然破棺而出吻商,到底是詐尸還是另有隱情,我是刑警寧澤糟红,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布艾帐,位于F島的核電站,受9級特大地震影響盆偿,放射性物質(zhì)發(fā)生泄漏柒爸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一事扭、第九天 我趴在偏房一處隱蔽的房頂上張望捎稚。 院中可真熱鬧,春花似錦求橄、人聲如沸今野。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腥泥。三九已至,卻和暖如春啃匿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工溯乒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夹厌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓裆悄,卻偏偏與公主長得像矛纹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子光稼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348