Object-C測試工具與Frida

原文鏈接:rotlogix.com/2016/03/20

原文作者:Rotlogix

譯者:lockdown(看雪ID:小調調)

搬運工:草莓丶(看雪ID:ksmokee)

微信公眾號:看雪iOS安全小組

我們的微博:weibo.com/pediyiosteam

Overview

一個朋友最近在問怎麼使用Frida來測試Objective-C的應用程序,我將這個過程分享給大家,這個簡要的教程闡述了我是如何教他一步一步做到的。

Frida是一個非常強大的跨平台測試工具。對於那些不熟悉Frida是什麼、能做什麼的人,我強烈建議在開始這個教程之前,先去下面的網頁查看一下。

frida.re/

在本教程中,我們將使用Frida在一個非常簡單的Objective-C應用中,攔截一個方法(函數)。我們將使用Frida的Python通用介面來實現。

Objective-C Application

我們的Objective-C程序中有一個類叫Hook和一個實例化方法叫hookMe。該實例化方法有一個參數,並通過NSLog列印輸出。

-(void)hookMe:(NSString *)arg {nNSLog(@"%@", arg);n}n

在應用程序的main函數中,我們創建一個新的Hook實例,然後調用hookMe。

Hook *hook = [[Hook alloc]init];n[hook hookMe:@"Hello, World!"];n

我們的目標是編寫一個腳本,它將攔截hookMe並列印出其參數內容以及一些附加信息。

Hook.py

想要閱讀完整的腳本,你可以在這裡查看這裡。

在本教程中,我們僅關注注入到我們的目標進程中的JavaScript代碼。我更傾向於對所有的Frida Python腳本使用相同的框架代碼,所以你可以根據需要複製粘貼,並根據自己的需求添加自己所需要的功能。

for(var className in ObjC.classes) { n if (ObjC.classes.hasOwnProperty(className)) {n if(className == "Hook") {n send("Found our target class : " + className);n }n }n}n

如果你查看Frida的文檔中對Objective-C的支持,你會看到ObjC.classes返回當前註冊類的映射表。n這些類可以很容易地通過for循環遍歷,並且應該允許我們查找我們的目標類Hook。

它不包括在腳本中,但是可以使用以下的方式執行訪問方法。

ObjC.classes.Hook.$methods; n

你可以使用特殊屬性n$methods訪問對象公開的方法數組。這將包括hookMe方法以及通過繼承可用的任何其他方法。

事情從這裡開始變的有趣了。

if(ObjC.available) {n for(var className in ObjC.classes) {n if (ObjC.classes.hasOwnProperty(className)) {n if(className == "Hook") {n send("Found our target class : " + className);n }n }n }n var hook = ObjC.classes.Hook["- hookMe:"];n Interceptor.attach(hook.implementation, {n onEnter: function(args) {n var receiver = new ObjC.Object(args[0]);n send("Target class : " + receiver);n send("Target superclass : " + receiver.$superClass);n var sel = ObjC.selectorAsString(args[1]);n send("Hooked the target method : " + sel);n var obj = ObjC.Object(args[2]);n send("Argument : " + obj.toString());n }n });n} else {n console.log("Objective-C Runtime is not available!");n}n

首先,我們創建一個包含我們要攔截的方法的新變數。

var hook = ObjC.classes.Hook["- hookMe:"]; n

在Objective-C中 「-「 是描述實例方法的語法。如果你遍歷$methods特殊屬性返回的所有方法,你將看到hookMe以這種方式展現出來。

Objective-C運行時將所有方法調用轉換為objc_msgSend調用。objc_msgSend函數聲明如下:

id objc_msgSend(id self, SEL op, args);n

當我們攔截的方法被 Objective-C 運行時調用時,Frida通過攔截方法的參數提供對底層objc_msgSend函數的訪問介面。

var receiver = new ObjC.Object(args[0]); nsend("Target class : " + receiver); nsend("Target superclass : " + receiver.$superClass);nnvar sel = ObjC.selectorAsString(args[1]); nsend("Hooked the target method : " + sel);nnvar obj = ObjC.Object(args[2]); nsend("Argument : " + obj.toString()); n

第一個參數是一個指針,指向接收消息的實例類。在我們的例子中它指向 Hook 。 您還可以通過Frida還提供的$ superClass特殊屬性訪問對象的超類。

objc_msgSend聲明中的第二個參數是SEL,它本質上是一個包含調用方法名的CString(selector)。你可以使用Frida的selectorAsString JavaScript函數將其轉換並將其發送回您的Python代碼。

我們可以訪問傳遞給args [2]中的hookMe方法的參數,並從中創建一個新的ObjC.Object。 Frida對對象的處理允許我們簡單地調用toString以獲得參數的值。

下面是我們的hook.py腳本的最終輸出:

Conclusion

我希望這些信息對你有幫助。再次,你可以仔細閱讀整個腳本。我強烈建議深入了解Frida的文檔和frida-gum,以更熟悉Frida。

References

github.com/frida/frida-


推薦閱讀:

為什麼通過對Wi-Fi區域網嗅探可以從中劫持到iPhone本地圖片?
我們的電腦是否始終被國家監控著?
Joomla 曝高危漏洞b 攻擊者可重置密碼並接管網站
紀錄片《零日》中提及的網路戰會不會演變成國家間的一種新的戰鬥方式?如果會,又會產生什麼後果?

TAG:iOS应用 | 网络安全 | 移动应用 |