cycript注入動態庫的方式,這必需要在越獄環境下才能實現。ios
cycript的原理是動態庫注入,可是其動態庫注入的原理,與咱們常見的經過LC_LOAD_DYLIB在可執行文件中注入動態庫不一樣. cycript的操做是 : 抓取到要掛載的應用, 因爲越獄機上擁有權限,因此直接在掛載的進程上建立一個掛起的線程, 而後在這個線程裏申請一片用於加載動態庫的內存,而後恢復線程,動態庫就被注入。
二次打包動態庫的注入,是經過修改可執行文件的Load Commands來實現的. 在Load Commands中增長一個LC_LOAD_DYLIB , 寫入dylib路徑,這樣程序執行的時候, 就會編譯這個 LC_LOAD_DYLIB 找到要注入的 dylib,加載動態庫 .c++
tweak,它是各類破解補丁的統稱git
iOS的tweak大體分爲兩種:github
第一種是在cydia上發佈的,須要越獄才能安裝,大部分是deb格式的安裝包,iOS在越獄後,會默認安裝一個名叫mobilesubstrate的動態庫,它的做用是提供一個系統級的入侵管道,全部的tweak均可以依賴它來進行開發,目前主流的開發工具備theos和iOSOpenDev,前者是採用makefile的一個編譯框架,後者提供了一套xcode項目模版,能夠直接使用xcode開發可調試,可是這個項目已經中止更新了,對高版本的xcode支持很差。
第二種是直接打包成ipa安裝包,並使用本身的開發證書或者企業證書籤名,不需越獄也能夠安裝,可直接放到本身的網站上,可實如今線安裝;對於沒有越獄的手機,因爲權限的限制,咱們是沒有辦法寫系統級的tweak的,例如springboard的補丁是無法運行的,這種tweak大可能是針對某個app,把目標app進行修改注入處理,再從新簽名和發佈,有點相似於windows軟件的xxx破解版、xxx免註冊版
沒有越獄的機器因爲系統中沒有mobilesubstrate這個庫,咱們有二個選擇,第一個是直接把這個庫打包進ipa當中,使用它的api實現注入,第二個是直接修改彙編代碼;第一個適用於較爲複雜的破解行爲,並且越獄tweak代碼能夠複用,第二種適用於破解一些if…else…之類的條件語句spring
oc屆著名的method swizzling技術,他就是iOS的注入原理,相似於windows的鉤子,因此咱們注入也稱爲hooksegmentfault
Mobilesubstrate爲了方便tweak開發,提供了三個重要的模塊:windows
MobileHooker 就是用來作上面所說的這件事的,它定義一系列的宏和函數,底層調用objc-runtime和fishhook來替換系統或者目標應用的函數 MobileLoader 用來在目標程序啓動時根據規則把指定目錄的第三方的動態庫加載進去,第三方的動態庫也就是咱們寫的破解程序,他的原理下面會簡單講解一下 Safe mode 相似於windows的安全模式,好比咱們寫的一些系統級的hook代碼發生crash時,mobilesubstrate會自動進入安全模式,安全模式下,會禁用全部的第三方動態庫
上面講到了mobileloader,他是怎麼作到把第三方的lib注入進目標程序的呢?
這個咱們要從二進制文件的結構提及,從下面的圖來看,Mach-O文件的數據主體可分爲三大部分,分別是頭部(Header)、加載命令(Load commands)、和最終的數據(Data)。mobileloader會在目標程序啓動時,會根據指定的規則檢查指定目錄是否存在第三方庫,若是有,則會經過修改二進制的loadCommands,來把本身注入進全部的app當中,而後加載第三方庫。api
下面用machoview來打開一個真實的二進制文件給你們看看,能夠看出,二進制當中全部引用到的動態庫都放在Load commands段當中,因此,經過給這個段增長記錄,就能夠注入咱們本身寫的動態庫了xcode
在這裏插入咱們本身的動態庫有什麼用?咱們本身寫的代碼如何新增執行的入口,咱們還須要一個」main」函數來執行咱們本身的代碼,這個」main」函數在oc裏面稱爲構造函數,只要在函數前聲明 「attribute((constructor)) static」 便可,sass
#import "CaptainHook.h" static __attribute__((constructor)) void entry(){ // NSLog(@"\n ?!!!congratulations!!!?\n?----------------insert dylib success----------------?"); // // [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { // // CYListenServer(6666); // }]; }
逆向分析最經常使用的有三種方法:
網絡分析
經過分析和篡改接口數據,能夠有效的破解經過接口數據來控制客戶端行爲的app,經常使用的抓包工具備Tcpdump, WireShark, Charles等,windows平臺有fidller
靜態分析
經過砸殼、反彙編、classdump頭文件等技術來分析app行爲,經過這種方式能夠有效的分析出app實用的一些第三方庫,甚至分析出app的架構等內容,經常使用的工具備dumpdecrypted(砸殼)、hopper disassembler(反彙編)、class_dump(導頭文件)
動態分析
有靜就有動,萬物都是相生相剋的,動態分析指的是經過分析app的運行時數據,來定位注入點或者獲取關鍵數據,經常使用的工具備[cycript][5](運行時控制檯)、 lldb+debugserver(遠程斷點調試)、logify(追蹤)
control+D,來退出Cydia.
Logify.pl腳本在你安裝theos的時候就自帶:/opt/theos/bin/logify.pl
神器Logify了,它是theos的一個模塊,做用就是根據頭文件自動生成tweak,生成的tweak會在頭文件的全部方法中注入NSLog來打印方法的入參和出參,很是適合追蹤方法的調用和數據傳遞
把一個本身的dylib放到APP的目錄下,而後修改二進制文件,以讓APP加載這個動態庫。這個動態庫也是須要簽名的,使用對app重簽名的方式對這個動態庫進行簽名。
動態庫的注入,可使用這個工具 insert_dylib腳本.
insert_dylib --all-yes @executable_path/test.dylib Payload/WeChat.app/WeChat
/Users/devzkn/code/taokeSearchtweak/taokesearchtweak/.theos/obj/debug
-rwxr-xr-x 1 devzkn staff 148160 Oct 31 18:02 taokeSearchTweak.dylib
devzkndeMacBook-Pro:debug devzkn$ otool -L taokeSearchTweak.dylib taokeSearchTweak.dylib (architecture armv7): /Library/MobileSubstrate/DynamicLibraries/taokeSearchTweak.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.55.0) /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1349.56.0) /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2) taokeSearchTweak.dylib (architecture arm64): /Library/MobileSubstrate/DynamicLibraries/taokeSearchTweak.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.55.0) /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1349.56.0) /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)
Theos會在編譯動態庫時, 會這個動態庫添加上這一條依賴,因此要想在非越獄環境上運行,還得把CydiaSubstrate庫也跟着打包到APP中.
在Makefile裏Tweak_Name=XXXX下添加如下兩行 :
SUBSTRATE ?= yes instance_USE_SUBSTRATE = $(SUBSTRATE)
把上面的instance替換成你的TweakName,在上面的這個例子中就是XXXX
而後打包使用命令:
`make SUBSTRATE=no
`這樣Theos打包的時候,會將依賴的CydiaSubstrate中的符號加載到最終生成的動態庫中,再也不依賴CydiaSubstrate庫.
codesign -f -s "iPhone Distribution: xxxx..." --entitlements Entitlements.plist Payload/wework.app
打包APP :
xcrun -sdk iphoneos PackageApplication -v Payload/wework.app -o ~/xxx.ipa
# 查看當前系統中可用的全部簽名證書 security find-identity -v -p codesigning # 簽名, 能夠加 -f 參數 以覆蓋簽名 codesign -s 'iPhone Developer: Thomas Kollbach (7TPNXN7G6K)' Example.app # 查看簽名狀態 codesign -vv -d Example.app # 另一種方式來查看簽名 ldid -e Demo.app/demo