iOS逆向反編譯
iOS逆向
準備:完美越獄iPhone
逆向APP思路:1,程式碼分析
2,對Mach-O檔案的靜態分析MachOView、class-dump、Hopper Disassembler、ida等
3,動態除錯 對執行中的APP進行程式碼除錯 p debugserver、LLDB
4,程式碼編寫
5,注入程式碼到APP中
6,必要時還可能需要重新簽名、打包ipa
一、Mac遠端登入iPhone
-
SSH (Secure Shell) 是“安全外殼協議”
OpenSSH 是SSH協議的免費開源實現 (在iPhone上通過Cydia安裝OpenSSH工具(軟體源http://apt.saurik.com ))
可以通過OpenSSH的方式讓Mac遠端登入到iPhone
-
SSH是通過TCP協議通訊,所以要確保Mac和iPhone在同一區域網下,比如連線著同一個WiFi下
在終端輸入
ssh 賬戶名@伺服器主機地址
例如:
ssh [email protected]然後輸入密碼(預設是alpine )
這種方式wifi登入,受到網速限制
- usb連線 (不需要網路,速度快,安全) 1.1 sh usb.sh (注: python2 usbmuxd-1.0.8/python-client/tcprelay.py -t 22:10010 8888:8888)
1.2shlogin.sh (注:ssh -p 10010 root@localhost)
上面的命令生效是因為已經把 usb.sh 和 login.sh 兩個檔案做了埠對映並放到了根目錄 (對映需要usbmuxd工具包)
另外: 1.echo $PATH 檢視設定的根目錄,如果自己想寫指令碼在其他地方都能執行,也可以放在PATH路徑下
2.手機和電腦能連線是因為,手機的授權檔案 /var/root/.ssh/authorized_keys 中 添加了電腦的公鑰 ~/.ssh/id_rsa.pub
Mac上有個服務程式usbmuxd(它會開機自動啟動),可以將Mac的資料通過USB傳輸到iPhone
/System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd
下載usbmuxd工具包(下載v1.0.8版本,主要用到裡面的一個python指令碼:tcprelay.py)
https://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz
二、獲取手機上軟體的ipa包
-
Cycript 安裝到手機上
Cycript是Objective-C++、ES6(JavaScript)、Java等語法的混合物,可以用來探索、修改、除錯正在執行的Mac\iOS APP
文件:http://www.cycript.org/manual/
通過Cydia安裝Cycript,即可在iPhone上除錯執行中的APP
使用: cycript -p 程序ID 比如:cycript -p NewsBoard
cycript -p 程序名稱
取消輸入:Ctrl + C
退出:Ctrl + D
清屏:Command + R
Github 上有基於cycript封裝了一些函式 參考
https://github.com/CoderMJLee/mjcript
@import mjcript --->MJAppId、MJFrontVC()、MJDocPath、MJAppPath 等
-
Clutch -i 獲取加殼軟體的appid
-
PS命令 (手機上安裝adv-cmds)
ps –A 列出所有的程序
ps命令是process status
可以過濾關鍵詞,比如 : ps -A | grep WeChat
-
也可以用github 上工具獲取https://github.com/CoderMJLee/MJAppTools
MJAppTools 可以獲取到架構,名稱,是否加殼,安裝包路徑,資料庫路徑等
三、脫殼
- iOS中有很多好用的脫殼工具
Clutch:https://github.com/KJCracks/Clutch
dumpdecrypted:https://github.com/stefanesser/dumpdecrypted/
AppCrackr、Crackulous
-
Clutch -i 獲取到appid之後,Clutch -d (APP序號) 匯出app包 eg: Clutch -d 1 會打印出脫殼路徑
-
DYLD_INSERT_LIBRARIES 脫殼
例如:MJAppTools 獲取 到 【網易新聞】 <com.netease.news>/private/var/mobile/Containers/Bundle/Application/64F0B25C-062E-4A89-8834-3F534C24E70D/NewsBoard.app
執行:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /private/var/mobile/Containers/Bundle/Application/64F0B25C-062E-4A89-8834-3F534C24E70D/NewsBoard.app/NewsBoard
獲取到的脫殼檔案再當前目錄下 (Device/var/root)
-
檢視是否脫殼
otool -l 名稱 | grep crypt 例如: otool -l NewsBoard | grep crypt 檢視網易新聞是否脫殼
也可以用hopper看是否脫殼
cryptid 0 為脫殼 cryptid 1 是加殼
四、反編譯出頭檔案
-
class-dump
顧名思義,它的作用就是把Mach-O檔案的class資訊給dump出來(把類資訊給匯出來),生成對應的.h標頭檔案
官方地址:http://stevenygard.com/projects/class-dump/
下載完工具包後將class-dump檔案複製到Mac的/usr/local/bin目錄,這樣在終端就能識別class-dump命令了
常用格式:
class-dump -H Mach-O檔案路徑 -o 標頭檔案存放目錄 -H表示要生成標頭檔案 -o用於制定標頭檔案的存放目錄
例如:當前目錄下 class-dump -H NewsBoard -o Header (新建一個Header的資料夾) 這時候可以用hopper 等分析程式碼了
五、theos
-
安裝簽名工具ldid
1.先確保安裝brew
$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install )"
2.利用brew安裝ldid
$ brew install ldid
-
修改環境變數
- 編輯使用者配置檔案
$ vim ~/.bash_profile
2.在..bash_profie檔案後面加入下面兩行
export THEOS=~/theos
export PATH=PATH
3,讓.bash_profie配置的環境變數立即生效(或者重新開啟終端) >$ source ~/.bash_profile
-
下載theos
建議在$PATH 目錄下載程式碼(就是剛才配置的)
THEOS
-
新建tweak 專案
1,cd到放檔案的目錄下(比如桌面
nic.pl
2,選擇[13.] iphone/tweak 3,填寫專案資訊 名稱 專案ID隨便寫, MobileSubstrate Bundle filter 寫應用的id 其他回車
六、編寫程式碼
具體情況具體分析
七、打包編譯安裝
當前tweak檔案目錄下make clean && make && make package && make install (已經寫好了檔案,可以直接 sh ~/tweak.sh
自己做的外掛在 Device/Library/MobileSubstrate/DynamicLibraries
八、theos資料
-
Logoes語法:http://iphonedevwiki.net/index.php/Logos
-
%hook %end : hook一個類的開始和結束
-
%log : 列印方法呼叫詳情
可以Xcode -> Window -> Devices and Simulators中檢視
-
HBDebugLog 類似NSLog
-
%new : 新增一個新的方法
-
%c(className): 生成一個class物件,比如Class%c(NSObject) ,類似於NSStringFromClass()、objc_getClass()
-
%orig :函式呼叫原來的邏輯
-
%ctor : 在載入動態庫時候呼叫
-
%dtor : 程式退出時呼叫
-
logify.pl: 可以將一個頭檔案快速轉成已經包含列印資訊的xm檔案
logify.pl xx.h > xx.xm</pre>
1,在 UserCenterViewController.h 目錄下執行 logify.pl UserCenterViewController.h > UserCenterViewController.xm 2, UserCenterViewController.xm 拷貝到Makefile(Tweak.xm) 所在目錄 3, 新建一個src目錄,把.xm檔案放進去,修改路徑 YZRongxin_FILES = $(wildcard src/*.xm) 4,不認識的類 替換為void 刪除__weak 刪除協議 5, 不想太詳細 %log 換成NSLog(@"%@",NSStringFromSelector(_cmd)); 6,HBLogDebug(@" = 0x%x", (unsigned int)r) 改為 HBLogDebug(@" = 0x%@", r)
-
九、MAC、IPhone 軟體破解
例:PC軟體破解 ./YZCTest
例:網易新聞去廣告 NTESNBNewsListController hasAd
例:優酷去掉90s開頭廣告 XAdEnginePreAdModule setupVideoAdneedAd
如果是未越獄的IPhone 則還需要打包簽名等操作。
十、動態除錯
十一、簽名打包
-
準備一個embedded.mobileprovision檔案(必須是付費證書產生的,appid,device一定要匹配)並放入到.app包中。
-
可以通過Xcode自動生成,然後再編譯後的APP包中找到
-
可以去開發者網站生成證書下載
-
-
從embedded.mobileprovision檔案中提取出entitlements.plist許可權檔案
-
securitycms-D -i embedded.mobileprovision > temp.plist
-
/usr/libexec/PlistBuddy -x -c'Print :Entitlements' temp.plist > entilements.plist
-
-
檢視可用的證書
- security find-identity -v -p codesigning
-
對.app內的動態庫、AppExtension等進行簽名
- codesign -f -s 證書ID XXX.dylib
-
對.app包進行簽名
- codesign -f -s 證書id --entitlements entitlements.plist xxx.app
-
重簽名工具
-
iOS App Signer
">https://github.com/DanTheMan827/ios-app-signer
-
對.app重簽名,打包成ipa
-
需要再.app包中提供對應的embedded.mobileprovision檔案
-
-
iReSign
-
可以對ipa進行重簽名,打包成ipa
-
需要提供embedded.mobileprovision、entitlements.plist檔案的路徑
-
十二、其他筆記:
Tweak 技巧
1,載入 圖片資源 建立 layout 資料夾 相當於Device/Library
圖片會放在 在Device/Library/PreferenceLoader/Preference
2,自己做的外掛在 Device/Library/MobileSubstrate/DynamicLibraries
3,#define YZFile(path) @"/Library/PreferenceLoader/Preferences/yzxmly/" #path
4,多個檔案,多個目錄,引用標頭檔案要使用路徑比如 @import “abc/def/person.h”
5,路徑 全路徑,或者代替 比如:src/test.xm src/ .m (中間一個空格)
6,如果自己增加類,方法屬性等,要宣告的話
eg:
@interface yzdefine-(void)vipReOpenPlayer;@end</pre>