iOS逆向筆記

xixinRunBoy發表於2018-02-28

學習逆向過程中的一些總結

參考資料連結

資料彙總

基本操作

unzip appname.ipa

ipa解壓,appname.app/appname就是二進位制檔案

file appname.app/appname

檢視包含哪些架構

armv7 32位真機架構

arm64 64位真機架構

otool -l WeChat.app/WeChat | grep -B 2 crypt

otool可以輸出app的load commands,然後通過檢視cryptid這個標誌位來判斷app是否被加密。1代表加密了,0代表被解密了

重簽名

resign直接指定ipa,證照和配置檔案就自動給app重簽名

resign自動給所有需要重簽名的plugin重簽名

上傳fir可以檢視是否重簽名成功

替換embedded.mobileprovision(app store沒有這個檔案,將develop拷貝進去)(resign會自動處理)

使用fastlane resign給app重簽名,會自動重新下載需要的檔案,包括plugin下的

resign(
  ipa: "./wangyi.ipa"
  signing_identity: "iPhone Distribution: XXX Technology XXXX Inc. (HAABBCCDD1122)",
  provisioning_profile: "./fastlane/XC_iOS_Ad_Hoc_.mobileprovision"
)
複製程式碼

靜態分析

class_dump(匯出標頭檔案) MonkeyDev已經整合

build settings最下面開啟該功能 User-Defined->MONKEYDEV_CLASS_DUMP設定成YES MONKEYDEV_RESTORE_SYMBOL 設定成YES

hopper disassembler使用

IDA使用

虛擬碼還原說明 a1,a2表示的是引數 v8表示self objc_msgSend(v8, "accquirePendingLock") 表示[self accquirePendingLock]; if ( objc_msgSend(v8, "accquireLoginLock") & 0xFF ) 表示if ([self accquireLoginLock]) (*(v11 + 12))(v11, 1, v17); block呼叫 &v48 傳遞地址表示傳block

動態分析

CaptainHook學習 文件

  • 方法Hook: CHOptimizedMethod(count, optimization, return_type, class_type, name1, type1, arg1)
    hook原來的方法(如果不加CHSuper(0, className, Method)表示替換原來的方法,CHSuper表示在當前位置呼叫原來的方法實現)
    count表示hook的方法引數個數,optimization一般填self,return_type即方法返回值型別,class_type填當前類的類名,name1是方法名,arg1是引數,如果沒有引數不填寫arg,以此類推。
    類方法: CHOptimizedClassMethod
    例項方法: CHOptimizedMethod
    喜馬拉雅FM不能播放: bundleID為aaa,版本號為應用本身的版本號

Logos Tweek

Logos語法
選擇Logos Tweak模板之後,新建出來的工程目錄結構如下圖所示,注意.xm檔案格式Xcode不識別需要在Xcode右側選擇Type為Objective-C++ Source,然後重新開啟。
logify.pl使用 $THEOS/bin/logify.pl ./SSDownloadAsset.h

cycript

先下載cycript,然後進入cycript目錄
執行如下命令
./cycript -r 192.168.0.103:6666

常用命令中文部落格 Cycript Tricks 官網

// Objective-C objects from addresses
cy# var p = #0x8614390
["<SKPaymentTransaction: 0x8613d80>"]
// 獲取屬性
cy# *controller
// 獲取檢視層級
cy# UIApp.keyWindow.recursiveDescription
// 獲取當前控制器
cy# function currentVC() {
        var app = [UIApplication sharedApplication]
            var keyWindow = app.keyWindow
                var rootController = keyWindow.rootViewController
                    var visibleController = rootController.visibleViewController
                        if (!visibleController){
                               return rootController
                                   }
                                       return visibleController.childViewControllers[0]
                                       }
cy# var vc = currentVC()

複製程式碼

可以直接初始化需要的類來看是否hook成功

lldb+debugserver(遠端斷點除錯)待學習

相關文章