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