學習逆向過程中的一些總結
參考資料連結
基本操作
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成功