iOS系統不斷升級,結構不斷調整,所以我們可以利用的動態庫注入方法也根據系統版本的不同而不同。
在此之前,我們可以利用環境變數 DYLD_INSERT_LIBRARY 來新增動態庫,iOS7被成功越獄後,我們需要自己去探索實踐iOS7動態庫注入的方式。
本文將在iOS7.0.4環境下,以 hook 支付寶app 程式中 ALPLauncherController 的檢視載入方法為例,介紹在iOS7下,如何實現動態庫注入攻擊。
相關工具位置資訊
先總結羅列一下相關編譯、連結工具的位置路徑資訊,在各位自行下載的iOS SDK中
clang : /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
gcc : /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
ld : /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
sdk : /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/
動態庫源程式
我們編寫一個 hook 支付寶app 程式中 ALPLauncherController 的 viewDidLoad 方法,具體方法是利用 Method Swizzling 。
不熟悉 Method Swizzling 的話,可以參看我之前的這篇文章:Objective-C的hook方案(一): Method Swizzling
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#import <UIKit/UIKit.h> #import <objc/runtime.h> @implementation UIViewController (HookPortal) -(void)myViewDidLoad { NSLog(@"----------------------- myViewDidLoad ----------------------"); } @end static void __attribute__((constructor)) initialize(void) { NSLog(@"======================= initialize ========================"); Class class = objc_getClass("ALPLauncherController"); Method ori_Method = class_getInstanceMethod(class, @selector(viewDidLoad)); Method my_Method = class_getInstanceMethod(class, @selector(myViewDidLoad)); method_exchangeImplementations(ori_Method, my_Method); } |
編譯dylib
我們可以利用xcode直接幫忙編譯.o,或者自己手動使用clang編譯,然後手動ld:
1 |
ld -dylib -lsystem -lobjc -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/ -o libwq.dylib xxx.o |
安置、驗證dylib
將編譯好的 libwq.dylib 拷貝到iPhone 檔案系統中 /Library/MobileSubstrate/DynamicLibraries/ 下
如果不放心庫是否能正常工作,可以加一步驗證操作,寫一個demo嘗試開啟自己的庫:
1 2 3 4 5 6 7 |
voidvoid *handle = (void*)dlopen("/Library/MobileSubstrate/DynamicLibraries/libwq.dylib", 0x2); handle = dlsym(handle, "myViewDidLoad"); if (handle) { NSLog(@"++++"); }else{ NSLog(@"----"); } |
執行檢驗效果
到了驗證效果的時候,重啟裝置後者執行:
1 |
killall SpringBoard |
啟動支付寶app,然後觀察log資訊:
1 2 3 4 |
Portal[3631] <Notice>: MS:Notice: Injecting: com.alipay.iphoneclient [Portal] (847.21) Portal[3631] <Notice>: MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/libwq.dylib Portal[3631] <Warning>: ======================= initialize ======================== Portal[3631] <Warning>: ----------------------- myViewDidLoad ---------------------- |
證明我們的動態庫已經被載入, 我們的Hook 也成功了。
剩下的就要自己去思考了,除了加句無聊的Log,我們還可以做點什麼呢?