iOS逆向工程(手動HOOK攔截APP方法)

一、使用Xcode創建自己的一個用于測試的App。

目的:攔截一個自己寫的方法,然后進行重寫。
APP大家可以自己創建,我這邊已經創建好了。

Bundle identifier:com.dasen.HOOK-APP
APP Name : HOOK_APP
攔截一個按鈕的點擊方法:

     - (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

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

三、創建theos項目

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

屏幕快照 2017-11-01 10.32.47.png
屏幕快照 2017-11-01 10.33.43.png

然后你再測試下
我選擇了這個:在終端提前執行export THEOS=/opt/theos
然后順利通過
我們可以看到iphone/tweak
,所以我們輸入 11 選擇一個tweak工程,然后回車確定后,會讓我們輸入一些名字 id 等等信息,上一篇文章已經講解過了。下面我用一張GIF圖來演示下:
注意:在寫Packag Name:時,后面不要有大寫字母或特殊字符,最好都用小寫字母


然后我們進入工程目錄會發現生成四個文件:

這四個文件的配置在上一篇文章已經簡單介紹了,下面我就直接貼上文件內容。

1, Makefile(這里的IP是手機設備的IP,不加IP可安裝在任意設備上,加上IP是可以快速自己安裝)

THEOS_DEVICE_IP = 10.10.243.124  
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0

include $(THEOS)/makefiles/common.mkTWEAK_NAME = HOOKAPP
HOOKAPP_FILES = Tweak.xmHOOKAPP_FRAMEWORKS = UIKit
 include $(THEOS_MAKE_PATH)/tweak.mkafter-install::
install.exec "killall -9 SpringBoard"

2, Tweak.xm

%hook ViewController

- (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];
 }
 %end

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

三、打包并安裝dylib到設備中.
走到這一步需要注意幾點
iOS設備一定要已經安裝了Open ssh (默認密碼alpine,如果忘記密碼可自行查找如何修改密碼)

設備和電腦保持在同一局域網下。

保證你的theos配置文件沒有問題。

1,這個時候我們差不多都配置好了,可以把自己寫的APP,然后運行到設備上了,運行之后點擊測試下未HOOK之前的按鈕點擊方法:


2,接下來我們利用終端cd進入你創建的tweak項目目錄,然后執行make package install,然后輸入兩次ssh的連接密碼(ssh 默認密碼alpine),然后設備就會重啟SpringBoard,然后我們再次打開HOOK的APP發現按鈕的點擊方法已經被替換了。如果提示_Prefix/NullabilityCompat.h 說明你是自己clone 的官方的theos,里面沒放入這些頭文件,可手動clone header頭文件到目錄中:
sudo git clone https://github.com/theos/headers /opt/theos/include

或者重新更新下我上傳的theos git pull 一下,還有環境變量記得設置下:export THEOS=/opt/theos
下面gif圖演示操作下:



這個時候輸入成功后這個時候SpringBoard已經開始重啟了。
這這個過程中可能會出現一個 DVTPlugInCompatibilityUUIDs 問題,說DVTPlugInCompatibilityUUIDs里不包含一個值,
解決辦法:
拷貝路徑,讓后將值添加到DVTPlugInCompatibilityUUIDs中,即可

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



到這一步很多人一定會好奇,怎么這么就成功了,下面說說原理。其實原理不敢說,只能說是一些自己的理解吧。講到這里就不得不需要提到一些關鍵詞。
Cydia Substrate、Mobile Substrate

MSHookMessageEx

MSHookFunction

MobileHooker

MobileLoader

Safe Mode

Logos

下面進行一一說明
四、基本原理說明
1,Cydia Substrate 和 Mobile Substrate

  • Cydia Substrate 原名為 Mobile Substrate 已經正式更名為 Cydia Substrate。* 它是越獄后cydia插件/軟件運行的一個基礎依賴包。提供軟件運行的公共庫,可以用來動態替換 內存中的代碼、數據等所以iOS系統越獄環境下安裝絕大部分插件,必須首先安裝Cydia Substrate。* Cydia Substrate主要由3部分組成:MobileHooker,MobileLoader 和 safe mode。

2,MobileHooker、Logos

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

3,MobileLoader

  • MobileLoader用于加載第三方dylib在運行的應用程序中。* 啟動時MobileLoader會根據dylib的同名plist文件指定的作用范圍,有選擇的在不同進程里通過dlopen函數打開目錄/Library/MobileSubstrate/DynamicLibraries/ 下的所有dylib。

4,safe mode

  • 因為APP程序質量參差不齊崩潰再所難免,tweak本質是dylib,寄生在別人進程里,如果注入Springboard等。 系統進程一旦出錯,可能導致整個進程崩潰,崩潰后就會造成iOS癱瘓。* 所以CydiaSubstrate引入了安全模式,在安全模 式下所有基于CydiaSubstratede 的三方dylib都會被禁用,便于查錯與修復。* 本人建議自己測試的時候如果HOOK Springboard的時候一定要注意!如果出錯,進入安全模式刪除插件即可。

總結:在我的理解就是:我們在Tweak.xm文件里用封裝后的logos語法編寫代碼(底層利用了MSHookMessageEx,MSHookFunction函數,使用 Object-C 的runtime特性發送了method_setImplementation消息)然后theos自動打包成dylib,上傳到/Library/MobileSubstrate/DynamicLibraries/里面后,重啟Springboard, 利用MobileLoader尋找目錄并根據dylib的同名plist文件加載里面的dylib動態庫,這時候當我們再打開APP后執行方法時,方法就被替換了。
下面我們可以來驗證一下,我用PP助手連接pad, 進入/Library/MobileSubstrate/DynamicLibraries/目錄,發現了我們編譯后的dylib如圖:


然后看下HOOKAPP.plist文件:

里面的com.dasen.HOOK-APP就是自己需要HOOK的app id說明已經放入這個目錄了,然后進入Cydia,查看已安裝插件:發現目標插件已經安裝進了Cydia 如圖:


好了驗證完畢,說明確實部分是如我們所想的那樣的,上面的例子很簡單,重要是簡單的解開了逆向的一點點面目,更多的是靠大家去發掘和利用探索更多知識。
感謝原文章:http://www.lxweimin.com/p/8982e9670fc6

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容