天天看點

編寫dylib_iOS逆向-無需越獄注入動态庫

0x0 擷取

iTunes下載下傳

現在iTunes已經沒有下載下傳ipa的功能了

第三方市場

目前大部分隻能依靠第三方市場來下載下傳,而且第三方市場的ipa其實有一個優勢,大部分都是已經脫殼的,省去一個步驟

OTA安裝的企業版app

這種就更好辦了

首先拿到ota的url,基本上是itms-service之類的scheme

檢視裡面的一個url=的參數,就是plist配置的位址

下載下傳或者檢視這個plist,可以發現裡面就有ipa的真正位址了

0x1 砸殼

如果你的包是appstore上的包,那麼蘋果會加殼,我們需要先砸了

主流的砸殼基本上都是在手機上操作,是以大前提是你有一台越獄的手機

現在我基本上都是第三方市場下載下傳或者企業版證書的app,不過有興趣還是可以了解一下的

0x2 分析

一般我們逆向一個app,還是先把頭檔案dump出來分析一下,主要還是利用 nygard/class-dump,具體用途看它的 readme 就差不多了

class-dump -H xxx.app -o /Users/Desktop/Header

如果有更深入的分析要求,可以利用hopper、ida分析,包括一些調用關系等

0x3 編寫dylib

當目标分析完成,需求确定之後,就可以開始編寫自己的dylib了

一個很正常的做法,就是随便建立一個類,添加一個+ (void)Load作為你的代碼入口,或者在全局作用域上直接調用建立一個單例,如下

static Hacker *g_hacker = [Hacker sharedInstance]

@implementation Hacker

+ (instancetype)sharedInstance

{}

+ (void)load

{

// Setup my code here

}

@end

0x4 注入dylib

完成dylib後,需要把它挂到目标app上,這裡需要用到 optool 來給執行檔案添加LoadCommand

git clone –recursive https://github.com/alexzielenski/optool.git

cd optool

xcodebuild -project optool.xcodeproj -configuration Release ARCHS=”x86_64” build //編譯

/path/to/optool install -c load -p “@executable_path/yourdylib.dylib” -t /yourexefile

如果不放心,可以用Mach-O Viewer,或者otool來檢驗一下

otool -L yourexefile

0x5 重簽

萬事俱備,現在就隻差如何安裝到你的手機上了

因為你下載下傳的app經過你的修改,你也沒有原來的證書可以打包,手機也不在原來的證書裝置内,因為是無法安裝的,這時候需要重簽為你自己的證書,來允許安裝到你的手機上(未越獄)

iOSResigner

// 檢視你電腦目前的證書

security find-identity -v -p codesigning

// resign

./iOSResigner --ipa="Debug/test.ipa" --identity="iPhone Developer: xxx yyy (9J4EHR5R28)" --provision="cert/dev.mobileprovision" --output="out/test_resigned.ipa"

如果有需求修改裡面的東西再重新打包的話

cd inside-folder

zip --symlinks -r -q ../abc.ipa *

或者

xcrun -sdk iphoneos PackageApplication

-v ./PaulTest.app

-o ./paultest_yk_ume_release.ipa

iOS App Signer

這裡介紹一個更好使的開源工具 iOS App Signer,這個工程可以自動搜尋本機的證書和配置檔案,如果不想編譯那麼麻煩,也可以在releases裡面直接下載下傳編譯好的

這個工具有幾個缺點

不會實時監測檔案的變化,是以有變動證書相關檔案,需要重新開機app

因為Xcode的下載下傳證書相關,不會鑒别過期與否,有效與否,一腦子全部下下來,app本身也不會鑒别是否有效

在重簽後安裝不上的,需要人肉驗證上面兩步,嫌麻煩就整個檔案夾删了,到Developer確定證書沒問題,然後全部重新下下來

Provisioning Profiles 存放的目錄

~/Library/MobileDevice/Provisioning Profiles

0x6 參考