iOS 系統(tǒng)不斷升級(jí),結(jié)構(gòu)不斷調(diào)整,所以我們可以利用的動(dòng)態(tài)庫(kù)注入方法也根據(jù)系統(tǒng)版本的不同而不同。
在此之前,我們可以利用環(huán)境變量 DYLD_INSERT_LIBRARY
來(lái)添加動(dòng)態(tài)庫(kù),iOS7 被成功越獄后,我們需要自己去探索實(shí)踐 iOS7 動(dòng)態(tài)庫(kù)注入的方式。
本文將在 iOS7.0.4 環(huán)境下,以 hook 支付寶 app 程序中 ALPLauncherController 的視圖加載方法為例,介紹在 iOS7 下,如何實(shí)現(xiàn)動(dòng)態(tài)庫(kù)注入攻擊。
先總結(jié)羅列一下相關(guān)編譯、鏈接工具的位置路徑信息,在各位自行下載的 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/
我們編寫(xiě)一個(gè) hook 支付寶 app 程序中 ALPLauncherController 的 viewDidLoad 方法,具體方法是利用 Method Swizzling 。
不熟悉 Method Swizzling 的話(huà),可以參看我之前的這篇文章:Objective-C的hook方案(一): Method Swizzling
#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);
}
我們可以利用 xcode 直接幫忙編譯 .o,或者自己手動(dòng)使用 clang 編譯,然后手動(dòng) ld :
ld -dylib -lsystem -lobjc -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/ -o libwq.dylib xxx.o
將編譯好的 libwq.dylib 拷貝到 iPhone 文件系統(tǒng)中 /Library/MobileSubstrate/DynamicLibraries/
下
如果不放心庫(kù)是否能正常工作,可以加一步驗(yàn)證操作,寫(xiě)一個(gè) demo 嘗試打開(kāi)自己的庫(kù):
voidvoid *handle = (void*)dlopen("/Library/MobileSubstrate/DynamicLibraries/libwq.dylib", 0x2);
handle = dlsym(handle, "myViewDidLoad");
if (handle) {
NSLog(@"++++");
}else{
NSLog(@"----");
}
到了驗(yàn)證效果的時(shí)候,重啟設(shè)備后者執(zhí)行:
killall SpringBoard
啟動(dòng)支付寶 app,然后觀(guān)察 log 信息:
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 ----------------------
證明我們的動(dòng)態(tài)庫(kù)已經(jīng)被加載, 我們的 Hook 也成功了。 剩下的就要自己去思考了,除了加句無(wú)聊的 Log,我們還可以做點(diǎn)什么呢?