小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

iOS 逆向-非越獄手機(jī)Hook App

 最初九月雪 2017-04-13

引子


由于對(duì)iOS逆向分析很感興趣,所以也花了很長(zhǎng)一段時(shí)間學(xué)習(xí)了iOS逆向相關(guān)知識(shí),并積累了一些相關(guān)經(jīng)驗(yàn),在越獄設(shè)備上成功讓我爽了一把,前段時(shí)間比較火的微信搶紅包功能也是一步一腳印讓自己給弄出來(lái)了。

后來(lái),覺(jué)得在越獄設(shè)備上逆向App已經(jīng)沒(méi)有多大吸引力了,就放了一段時(shí)間,當(dāng)時(shí)也嘗試過(guò)學(xué)習(xí)非越獄設(shè)備逆向App的,但是最后還是以失敗告終。

這幾天又到看雪論壇逛了一下,看看最近有沒(méi)有什么大牛分享心得成果的!還真讓我看到一篇有意思的文章【原創(chuàng)】微信雙開(kāi)是定時(shí)炸彈?關(guān)于非越獄iOS上微信分身高危插件ImgNaix的分析 ,通過(guò)讀完這篇文章,讓我又有了站在巨人的肩膀上,也來(lái)探究和學(xué)習(xí)一下非越獄設(shè)備如何Hook App的興趣了。

思路


越獄和非越獄Hook iOS App的關(guān)鍵就是讓App在啟動(dòng)的時(shí)候加載自己的dylib。那么在非越獄上加載dylib的思路就是利用:Mach-o LC_LOAD_DYLIB , 在App在被加載的時(shí)候,把我們的動(dòng)態(tài)庫(kù)dylib也一起加載起來(lái)。

關(guān)于非越獄設(shè)備Hook App網(wǎng)上有很多資料,下面摘抄來(lái)自阿里安全工程師的博客“iOS冰與火之歌番外篇 - 在非越獄手機(jī)上進(jìn)行App Hook”關(guān)于非越獄手機(jī)Hook App的思路。也可以在IOS應(yīng)用逆向工程官方論壇搜索更多關(guān)于逆向的資料。

今天我就來(lái)介紹一種不需要越獄就能hook iOS app方法,也就是Mach-O LC_LOAD_DYLIB Hook。這種方法是通過(guò)修改binary本身來(lái)加載第三方dylib并實(shí)現(xiàn)hook,具體思路是:

提取ipa中的二進(jìn)制文件 -> 修改二進(jìn)制文件的Load Commands列表,加入要hook的dylib –> hook.dylib在函數(shù)constructor函數(shù)中完成對(duì)特定函數(shù)的hook->對(duì)修改后的ipa進(jìn)行簽名,打包和安裝。


工具

MachOView
iReSign
yololib
同步助手(或者pp助手、iTools)

本文實(shí)踐工程

被注入目標(biāo)代碼工程:AppRe
生成動(dòng)態(tài)庫(kù)dylib代碼工程:dylib


1.目標(biāo)App

也就是要被注入的App。這里我們自己寫(xiě)一個(gè)簡(jiǎn)單的App,代碼非常簡(jiǎn)單:點(diǎn)擊“點(diǎn)擊我”按鈕彈出一個(gè)窗口,顯示一句話“Hello iOS!”以及app的bundleid。

- (void)viewDidLoad {
    [super viewDidLoad];
    //布局UIButton
    self.view.backgroundColor = [UIColor whiteColor];
    UIButton *button  =[UIButton buttonWithType:UIButtonTypeSystem ];
    [button setTitle:@"點(diǎn)擊我" forState:UIControlStateNormal];
    [button setFrame:CGRectMake((self.view.frame.size.width-120)/2, (self.view.frame.size.height-40)/2, 120, 40)];
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

- (void)buttonClick:(id)sender
{
    [self say:@"Hello iOS!"];
}

- (void)say:(NSString *)string
{
    NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:string message:identifier preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:nil];
    [alert addAction:okAction];
    [self presentViewController:alert animated:YES completion:nil];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

這里寫(xiě)圖片描述

2.生成動(dòng)態(tài)庫(kù)dylib

由上面的代碼可知,在viewController類中有一個(gè)say的函數(shù),該函數(shù)完成了彈窗的功能。
那么我們接下來(lái)要做的是,將通過(guò)hook viewController 的say方法,把“Hello iOS!”改成“Hello, Android!”

xcode本身不直接提供構(gòu)建dylib的工程,但是可以通過(guò)其他方式來(lái)構(gòu)建,這里也直接使用“iOS冰與火之歌番外篇 - 在非越獄手機(jī)上進(jìn)行App Hook”提供的代碼工程直接修改一下。我也是從文中學(xué)習(xí)到CaptainHook的使用,摘抄下來(lái):

下一步就是要實(shí)現(xiàn)對(duì)特定函數(shù)的hook。在這里我推薦使用CaptainHook這個(gè)framework。作者已經(jīng)幫我們實(shí)現(xiàn)了hook所需要的各種宏,只要按照如下步驟就可以完成針對(duì)特定函數(shù)的hook:

使用 CHDeclareClass() 聲明想要hook的class

在構(gòu)造函數(shù)中用 CHLoadClass() 或 CHLoadLateClass() 加載聲明過(guò)的class

使用CHMethod() hook相應(yīng)的method

在CHMethod()中可以使用CHSuper()來(lái)調(diào)用原函數(shù)

在構(gòu)造函數(shù)中使用CHClassHook()來(lái)注冊(cè)將要hook的method

CHDeclareClass(ViewController);
//參數(shù)個(gè)數(shù)、返回值類型、類名、selector名稱、selector的類型、selector對(duì)應(yīng)的參數(shù)的變量名
CHMethod(1, void, ViewController, say, id, arg1)
{
    NSString* tmp=@"Hello, Android!";

    CHSuper(1, ViewController, say, tmp);
}


__attribute__((constructor)) static void entry()
{
    CHLoadLateClass(ViewController);
    CHClassHook(1, ViewController,say);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注意:

  • 生成動(dòng)態(tài)庫(kù)dylib使用的簽名方式要和你要注入dylib的可執(zhí)行文件重簽名后的簽名方式一致。

通過(guò)“iOS冰與火之歌番外篇 - 在非越獄手機(jī)上進(jìn)行App Hook”提供的源碼生成的dylib注入app之后,會(huì)導(dǎo)致App閃退,通過(guò)調(diào)試和各種折騰發(fā)現(xiàn)在生成dylib工程中配置正確的Entitlements.plist即可解決。
圖片1

2.注入dylib

注入dylib這一步,如果要深入理解的話,就需要學(xué)習(xí)mach-o文件結(jié)構(gòu)相關(guān)知識(shí)了。這里只需知道在mach-o文件結(jié)構(gòu)的Load Commands 中的如何LC_LOAD_DYLIB指定了一個(gè)要加載的dylib,那么App在啟動(dòng)的時(shí)候就會(huì)自動(dòng)加載該dylib。

注入dylib實(shí)際就是修改mach-o的結(jié)構(gòu)體,插入一條新的load command 即LC_LOAD_DYLIB。這里也使用大神提供的工具yololib來(lái)進(jìn)行修改mach-o結(jié)構(gòu)體注入dylib,使用很簡(jiǎn)單。也可以使用二進(jìn)制編輯器010Editor來(lái)進(jìn)行修改,手動(dòng)修改會(huì)比較麻煩。

./insertdylib AppRe hook1.dylib

這里,我將該工具yololib重新命名為insertdylib,方便自己快速記憶。
這里寫(xiě)圖片描述

注入后我們使用machOView工具可以發(fā)現(xiàn)mach-o結(jié)構(gòu)體成功被插入了一條load command(如果你熟悉命令行也可以使用otool查看)。

這張圖是舊的圖O(∩_∩)O哈哈~,因?yàn)閙achOView有時(shí)會(huì)閃退,該死的,寫(xiě)該文章的時(shí)候就一直閃退。圖片中dev_sfa.png,實(shí)際也是hook.dylib重命名過(guò)來(lái)的,偽裝成一個(gè)png圖片!!
圖片3

注意:

這里有個(gè)坑!在執(zhí)行insertdylib的兩個(gè)參數(shù)binary文件dylib文件,不要帶上全路徑。要把dylib文件拷貝到AppRe.app目錄,然后cd 到AppRe.app目錄,然后直接insertdylib binaryfile dylibfile如果帶上了全路徑那么路徑也被插入到mach-o結(jié)構(gòu)體中,導(dǎo)致注入失敗。

3.重簽名

當(dāng)AppRe.app注入之后,剩下的就是打包和重簽名了!對(duì)于重簽名我推薦大牛的iReSign

把AppRe.app 轉(zhuǎn)成ipa 很簡(jiǎn)單,新建一個(gè)Payload目錄,把AppRe.app放到Payload目錄里面,在執(zhí)行下面命令即可

zip -qry AppRe.ipa Payload/

進(jìn)行重簽名.步驟如下:

  1. 拖拽進(jìn)對(duì)應(yīng)的AppRe.ipa文件到iReSign中.

  2. 拖拽進(jìn)對(duì)應(yīng)mobileprovision文件,這里我使用的是dev的開(kāi)發(fā)授權(quán)文件

  3. “entitlements.plist的路徑”可以不填,在iReSign源碼中看出來(lái),iReSign會(huì)自動(dòng)成成一個(gè)entitlements.plist文件的。

  4. 勾選修改ID。 即修改Info.plist的bundle identifier 。因?yàn)槲覀円话闱闆r下是沒(méi)有原App的證書(shū)的,所以需要修改bundle identifier

  5. 選擇對(duì)應(yīng)的簽名。這里的簽名一定要和生成dylib的時(shí)選擇的簽名是一致的!這里我使用的是dev的簽名

  6. 點(diǎn)擊“重新簽名!”,會(huì)在ipa所在目錄重新生成一個(gè)AppRe.-resignipa的包。

這里寫(xiě)圖片描述

4.安裝

使用同步助手或者pp助手都可以,拖拽安裝到手機(jī)并運(yùn)行!
這里寫(xiě)圖片描述

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多