iOS逆向流程

本文首發於我的博客php

準備:完美越獄iPhone

逆向APP思路:1,代碼分析html

​ 2,對Mach-O文件的靜態分析MachOView、class-dump、Hopper Disassembler、ida等python

​ 3,動態調試 對運行中的APP進行代碼調試 p debugserver、LLDBios

​ 4,代碼編寫git

​ 5,注入代碼到APP中github

​ 6,必要時還可能須要從新簽名、打包ipa數據庫

1、Mac遠程登陸iPhone

  • SSH (Secure Shell) 是「安全外殼協議」vim

    OpenSSH 是SSH協議的免費開源實現 (在iPhone上經過Cydia安裝OpenSSH工具(軟件源http://apt.saurik.com))sass

    能夠經過OpenSSH的方式讓Mac遠程登陸到iPhone安全

  • SSH是經過TCP協議通訊,因此要確保Mac和iPhone在同一局域網下,好比鏈接着同一個WiFi下

    在終端輸入

ssh 帳戶名@服務器主機地址
複製代碼

​ 例如:

ssh root@192.168.8.157  而後輸入密碼(默認是alpine )     
複製代碼

​ 這種方式wifi登陸,受到網速限制

  • usb鏈接 (不須要網絡,速度快,安全) 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)

​ 上面的命令生效是由於已經把 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

cgit.sukimashita.com/usbmuxd.git…

2、獲取手機上軟件的ipa包

  • Cycript 安裝到手機上

    Cycript是Objective-C++、ES6(JavaScript)、Java等語法的混合物,能夠用來探索、修改、調試正在運行的Mac\iOS APP

    官網: www.cycript.org/

    文檔: www.cycript.org/manual/

    經過Cydia安裝Cycript,便可在iPhone上調試運行中的APP

    使用: cycript -p 進程ID 好比:cycript -p NewsBoard

    ​ cycript -p 進程名稱

    ​ 取消輸入:Ctrl + C

    ​ 退出:Ctrl + D

    ​ 清屏:Command + R

    Github 上有基於cycript封裝了一些函數 參考

    github.com/CoderMJLee/…

    ​ @import mjcript --->MJAppId、MJFrontVC()、MJDocPath、MJAppPath 等

  • Clutch -i 獲取加殼軟件的appid

  • PS命令 (手機上安裝adv-cmds)

    ps –A 列出全部的進程

​ ps命令是process status

​ 能夠過濾關鍵詞,好比 : ps -A | grep WeChat

  • 也能夠用github 上工具獲取 github.com/CoderMJLee/…

    MJAppTools 能夠獲取到架構,名稱,是否加殼,安裝包路徑,數據庫路徑等

3、脫殼

  • iOS中有不少好用的脫殼工具

​ Clutch:github.com/KJCracks/Cl…

​ dumpdecrypted:github.com/stefanesser…

​ 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 是加殼

4、反編譯出頭文件

  • class-dump

    顧名思義,它的做用就是把Mach-O文件的class信息給dump出來(把類信息給導出來),生成對應的.h頭文件

    官方地址:stevenygard.com/projects/cl…

    下載完工具包後將class-dump文件複製到Mac的/usr/local/bin目錄,這樣在終端就能識別class-dump命令了

    經常使用格式:

    class-dump -H Mach-O文件路徑 -o 頭文件存放目錄 -H表示要生成頭文件 -o用於制定頭文件的存放目錄

    例如:當前目錄下 class-dump -H NewsBoard -o Header (新建一個Header的文件夾) 這時候能夠用hopper 等分析代碼了

5、theos

  • 安裝簽名工具ldid

    1.先確保安裝brew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
複製代碼

​ 2.利用brew安裝ldid

$ brew install ldid
複製代碼
  • 修改環境變量
  1. 編輯用戶配置文件
$ vim ~/.bash_profile
複製代碼
  1. 在.bash_profile文件後面加入下面兩行
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
複製代碼
  1. 讓bash_profiel配置的環境變量當即生效(或者從新打開終端)
$ source ~/.bash_profile
複製代碼
  • 下載theos

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

    $ git clone --recursive https://github.com/theos/theos.git $THEOS
    複製代碼
  • 新建tweak 項目

  1. cd到放文件的目錄下(好比桌面)
$ cd ~/Desktop
$ nic.pl
複製代碼
  1. 選擇選項[13.] iphone/tweak

  2. 填寫項目信息

​ 名稱 項目ID隨便寫, MobileSubstrate Bundle filter 寫應用的id 其餘回車

6、編寫代碼

​ 具體狀況具體分析

7、打包編譯安裝

​ 當前tweak文件目錄下make clean && make && make package && make install (已經寫好了文件,能夠直接 sh ~/tweak.sh

​ 本身作的插件在 Device/Library/MobileSubstrate/DynamicLibraries

8、theos資料

  • 目錄結構: github.com/theos/theos…

  • 環境變量: iphonedevwiki.net/index.php/T…

  • Logoes語法: iphonedevwiki.net/index.php/L…

    • %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
        複製代碼

        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)

9、MAC、IPhone 軟件破解

​ 例:PC軟件破解 ./YZCTest

​ 例:網易新聞去廣告 NTESNBNewsListController hasAd

​ 例:優酷去掉90s開頭廣告 XAdEnginePreAdModule setupVideoAd needAd

​ 若是是未越獄的IPhone 則還須要打包簽名等操做。

10、動態調試

11、簽名打包

  • 準備一個embedded.mobileprovision文件(必須是付費證書產生的,appid,device必定要匹配)並放入到.app包中。

    • 能夠經過Xcode自動生成,而後再編譯後的APP包中找到
    • 能夠去開發者網站生成證書下載
  • 從embedded.mobileprovision文件中提取出entitlements.plist權限文件

    • security cms -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
      • github.com/maciekish/i…
      • 能夠對ipa進行重簽名,打包成ipa
      • 須要提供embedded.mobileprovision、entitlements.plist文件的路徑

12、其餘筆記:

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
複製代碼

參考資料

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

iOS底層原理班

更多資料,歡迎關注我的公衆號,不定時分享各類技術文章。

相關文章
相關標籤/搜索