iOS逆向工程(10)手動(dòng)HOOK自己編寫的APP

前言:上一篇文章已經(jīng)介紹過(guò)逆向開發(fā)需要用到的一些工具,theos的基本介紹也講過(guò)了,今天來(lái)實(shí)戰(zhàn)HOOK一個(gè)自己的APP。

一、使用Xcode創(chuàng)建自己的一個(gè)用于測(cè)試的App。

目的:攔截一個(gè)自己寫的方法,然后進(jìn)行重寫。
APP大家可以自己創(chuàng)建,我這邊已經(jīng)創(chuàng)建好了。

Bundle identifier:com.dasen.HOOK-APP
APP Name : HOOK_APP

攔截一個(gè)按鈕的點(diǎn)擊方法:

- (void)buttonClick {
    UIAlertController *alerView = [UIAlertController alertControllerWithTitle:@"提示"
                                                                      message:@"未被HOOK"
                                                               preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *cancelAction =[UIAlertAction actionWithTitle:@"取消"
                                                          style:UIAlertActionStyleCancel
                                                        handler:nil];
    [alerView addAction:cancelAction];
    [self presentViewController:alerView animated:YES completion:nil];
}
二、下載和配置theos

大家可自己手動(dòng)下載官方theos然后放入ldid、CydiaSubstrate、dpkg-deb等等到目錄中,或者使用腳本下載我這邊已經(jīng)放入好的theos。
腳本下載地址:https://github.com/bigsen/Theos-Script

三、創(chuàng)建theos項(xiàng)目

1,首先我們配置和準(zhǔn)備好theos后,我們進(jìn)入終端,然后cd進(jìn)入你要放工程的文件夾目錄比如桌面上我新建好的一個(gè)文件夾iosDev,然后執(zhí)行啟動(dòng) NIC(New Instance Creator),如下:。

zhangdasendeMacBook-Pro:iOS Dev zhangdasen$ cd /Users/zhangdasen/Desktop/iOSDev
zhangdasendeMacBook-Pro:iOSDev zhangdasen$ /opt/theos/bin/nic.pl
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/application_modern
  [3.] iphone/cydget
  [4.] iphone/flipswitch_switch
  [5.] iphone/framework
  [6.] iphone/ios7_notification_center_widget
  [7.] iphone/library
  [8.] iphone/notification_center_widget
  [9.] iphone/preference_bundle_modern
  [10.] iphone/tool
  [11.] iphone/tweak
  [12.] iphone/xpc_service
Choose a Template (required):

我們可以看到iphone/tweak,所以我們輸入 11 選擇一個(gè)tweak工程,然后回車確定后,會(huì)讓我們輸入一些名字 id 等等信息,上一篇文章已經(jīng)講解過(guò)了。
下面我用一張GIF圖來(lái)演示下:


然后我們進(jìn)入工程目錄會(huì)發(fā)現(xiàn)生成四個(gè)文件:

這四個(gè)文件的配置在上一篇文章已經(jīng)簡(jiǎn)單介紹了,下面我就直接貼上文件內(nèi)容。
1, Makefile

THEOS_DEVICE_IP = 10.10.243.124  
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = HOOKAPP
HOOKAPP_FILES = Tweak.xm
HOOKAPP_FRAMEWORKS = UIKit
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
    install.exec "killall -9 SpringBoard"

2, Tweak.xm

%hook ViewController

- (void)buttonClick
{
    UIAlertController *alerView = [UIAlertController alertControllerWithTitle:@"提示"
                                                                  message:@"已經(jīng)被HOOK了"
                                                           preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *cancelAction =[UIAlertAction actionWithTitle:@"取消"
                                                      style:UIAlertActionStyleCancel
                                                    handler:nil];
    [alerView addAction:cancelAction];
    [self presentViewController:alerView animated:YES completion:nil];
}
%end

其它這兩個(gè)文件 control 和 iosproject.plist 可以保持原樣。

三、打包并安裝dylib到設(shè)備中.

走到這一步需要注意幾點(diǎn)

  • iOS設(shè)備一定要已經(jīng)安裝了Open ssh (默認(rèn)密碼alpine,如果忘記密碼可自行查找如何修改密碼)
  • 設(shè)備和電腦保持在同一局域網(wǎng)下。
  • 保證你的theos配置文件沒有問題。

1,這個(gè)時(shí)候我們差不多都配置好了,可以把自己寫的APP,然后運(yùn)行到設(shè)備上了,運(yùn)行之后點(diǎn)擊測(cè)試下未HOOK之前的按鈕點(diǎn)擊方法:



2,接下來(lái)我們利用終端cd進(jìn)入你創(chuàng)建的tweak項(xiàng)目目錄,然后執(zhí)行make package install,然后輸入兩次ssh的連接密碼(ssh 默認(rèn)密碼alpine),然后設(shè)備就會(huì)重啟SpringBoard,然后我們?cè)俅未蜷_HOOK的APP發(fā)現(xiàn)按鈕的點(diǎn)擊方法已經(jīng)被替換了。

如果提示_Prefix/NullabilityCompat.h 說(shuō)明你是自己clone 的官方的theos,里面沒放入這些頭文件,可手動(dòng)clone header頭文件到目錄中:

sudo git clone https://github.com/theos/headers /opt/theos/include/

還有環(huán)境變量記得設(shè)置下:export THEOS=/opt/theos
下面gif圖演示操作下:


這個(gè)時(shí)候輸入成功后這個(gè)時(shí)候SpringBoard已經(jīng)開始重啟了。

(由于上傳圖片大小限制5M,我分了兩個(gè)GIF來(lái)演示,下面演示HOOK成功后)

到這一步很多人一定會(huì)好奇,怎么這么就成功了,下面說(shuō)說(shuō)原理。
其實(shí)原理不敢說(shuō),只能說(shuō)是一些自己的理解吧。
講到這里就不得不需要提到一些關(guān)鍵詞。

  • Cydia Substrate、Mobile Substrate
    • MobileHooker
      • MSHookMessageEx
      • MSHookFunction
    • MobileLoader
    • Safe Mode
  • Logos

下面進(jìn)行一一說(shuō)明

四、基本原理說(shuō)明

1,Cydia Substrate 和 Mobile Substrate

* Cydia Substrate 原名為 Mobile Substrate 已經(jīng)正式更名為 Cydia Substrate。

* 它是越獄后cydia插件/軟件運(yùn)行的一個(gè)基礎(chǔ)依賴包。提供軟件運(yùn)行的公共庫(kù),可以用來(lái)動(dòng)態(tài)替換
  內(nèi)存中的代碼、數(shù)據(jù)等所以iOS系統(tǒng)越獄環(huán)境下安裝絕大部分插件,必須首先安裝Cydia Substrate。

* Cydia Substrate主要由3部分組成:MobileHooker,MobileLoader 和 safe mode。

2,MobileHooker、Logos

* MobileHooker用于替換覆蓋系統(tǒng)的方法,這個(gè)過(guò)程被稱為Hooking(掛鉤)
* 它主要包含兩個(gè)函數(shù):
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
void MSHookFunction(void*function,void* replacement,void** p_original);
MSHookMessageEx 主要作用于Objective-C函數(shù)
MSHookFunction 主要作用于C和C++函數(shù)
Logos語(yǔ)法就是對(duì)此函數(shù)做了一層封裝,讓編寫hook代碼變的更直觀,上面的例子用的就是logos語(yǔ)法。
MSHookMessageEx 和MSHookFunction 使用方法這里就不介紹了,大家可去看書籍或者查詢相關(guān)資料。

3,MobileLoader

* MobileLoader用于加載第三方dylib在運(yùn)行的應(yīng)用程序中。
* 啟動(dòng)時(shí)MobileLoader會(huì)根據(jù)dylib的同名plist文件指定的作用范圍,有選擇的在不同進(jìn)程里通過(guò)dlopen函數(shù)打開目錄/Library/MobileSubstrate/DynamicLibraries/ 下的所有dylib。

4,safe mode

* 因?yàn)锳PP程序質(zhì)量參差不齊崩潰再所難免,tweak本質(zhì)是dylib,寄生在別人進(jìn)程里,如果注入Springboard等。
  系統(tǒng)進(jìn)程一旦出錯(cuò),可能導(dǎo)致整個(gè)進(jìn)程崩潰,崩潰后就會(huì)造成iOS癱瘓。

* 所以CydiaSubstrate引入了安全模式,在安全模
  式下所有基于CydiaSubstratede 的三方dylib都會(huì)被禁用,便于查錯(cuò)與修復(fù)。

* 本人建議自己測(cè)試的時(shí)候如果HOOK Springboard的時(shí)候一定要注意!如果出錯(cuò),進(jìn)入安全模式刪除插件即可。

總結(jié):
在我的理解就是:

  • 我們?cè)赥weak.xm文件里用封裝后的logos語(yǔ)法編寫代碼(底層利用了MSHookMessageEx,MSHookFunction函數(shù),使用 Object-C 的runtime特性發(fā)送了method_setImplementation消息)

  • 然后theos自動(dòng)打包成dylib,上傳到/Library/MobileSubstrate/DynamicLibraries/里面后

  • 重啟Springboard, 利用MobileLoader尋找目錄并根據(jù)dylib的同名plist文件加載里面的dylib動(dòng)態(tài)庫(kù),這時(shí)候當(dāng)我們?cè)俅蜷_APP后執(zhí)行方法時(shí),方法就被替換了。


下面我們可以來(lái)驗(yàn)證一下,我用PP助手連接pad, 進(jìn)入
/Library/MobileSubstrate/DynamicLibraries/目錄,發(fā)現(xiàn)了我們編譯后的dylib如圖:


然后看下HOOKAPP.plist文件:



里面的com.dasen.HOOK-APP就是自己需要HOOK的app id
說(shuō)明已經(jīng)放入這個(gè)目錄了,然后進(jìn)入Cydia,查看已安裝插件:

發(fā)現(xiàn)目標(biāo)插件已經(jīng)安裝進(jìn)了Cydia 如圖:



好了驗(yàn)證完畢,說(shuō)明確實(shí)部分是如我們所想的那樣的,上面的例子很簡(jiǎn)單,重要是簡(jiǎn)單的解開了逆向的一點(diǎn)點(diǎn)面目,更多的是靠大家去發(fā)掘和利用探索更多知識(shí)。

待續(xù)。。。。。。


iOS逆向知識(shí)涉及繁多,以上自己的個(gè)人整理和心得,如有誤,希望大家多多提醒。
推薦下:http://bbs.iosre.com/ 這個(gè)論壇是《iOS逆向工程 第2版》書籍作者創(chuàng)辦的論壇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容