鍍金池/ 教程/ iOS/ iOS7 的動(dòng)態(tài)庫(kù)注入
Hack 實(shí)戰(zhàn)——支付寶 App 手勢(shì)密碼校驗(yàn)欺騙
使用 Reveal 分析他人 App
后臺(tái) daemon 非法竊取用戶(hù) iTunesstore 信息
使用 iNalyzer 分析應(yīng)用程序
越獄檢測(cè)的攻與防
使用 introspy 追蹤分析應(yīng)用程序
廢除應(yīng)用程序的 ASLR 特性
使用 Cycript 修改支付寶 App 運(yùn)行時(shí)
敏感邏輯的保護(hù)方案
Fishhook
使用 class-dump-z 分析支付寶 App
static 和被裁的符號(hào)表
iOS7 的動(dòng)態(tài)庫(kù)注入
二進(jìn)制和資源文件自檢
Hack 實(shí)戰(zhàn)——探究支付寶 App 手勢(shì)密碼
使用 Keychain-Dumper 導(dǎo)出 keychain 數(shù)據(jù)
數(shù)據(jù)擦除
Hack 實(shí)戰(zhàn)——解除支付寶 App 手勢(shì)解鎖錯(cuò)誤次數(shù)限制
Objective-C 代碼混淆
阻止 GDB 依附
基于腳本實(shí)現(xiàn)動(dòng)態(tài)庫(kù)注入
Hack 必備的命令與工具
鍵盤(pán)緩存與安全鍵盤(pán)
數(shù)據(jù)保護(hù) API

iOS7 的動(dòng)態(tài)庫(kù)注入

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ù)注入攻擊。

相關(guān)工具位置信息

先總結(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/

動(dòng)態(tài)庫(kù)源程序

我們編寫(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);  
}  

編譯 dylib

我們可以利用 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  

安置、驗(yàn)證 dylib

將編譯好的 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)行檢驗(yàn)效果

到了驗(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)什么呢?