iOS逆向流程

為了表示我對(duì)簡(jiǎn)書(shū)『飽醉豚』事件的不滿,簡(jiǎn)書(shū)不再更新,后續(xù)有文章只更新 個(gè)人博客掘金

歡迎移步 個(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)境變量
  1. 編輯用戶配置文件
$ vim ~/.bash_profile
  1. 在.bash_profile文件后面加入下面兩行
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
  1. 讓bash_profiel配置的環(huán)境變量立即生效(或者重新打開(kāi)終端)
$ source ~/.bash_profile
  • 下載theos

    建議在$PATH 目錄下載代碼(就是剛才配置的)

     $ git clone --recursive https://github.com/theos/theos.git $THEOS
    
  • 新建tweak 項(xiàng)目
  1. cd到放文件的目錄下(比如桌面)
$ cd ~/Desktop
$ nic.pl
  1. 選擇選項(xiàng)[13.] iphone/tweak

  2. 填寫(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

十二、其他筆記:

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

參考資料

iOS應(yīng)用逆向工程(第2版)

iOS底層原理班

更多資料,歡迎關(guān)注個(gè)人公眾號(hào),不定時(shí)分享各種技術(shù)文章。

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容