在iOS應用程式中使用Frida繞過越獄檢測

来源:http://www.cnblogs.com/alisecurity/archive/2017/05/11/6840816.html
-Advertisement-
Play Games

阿裡聚安全在之前的三篇博客中介紹了利用Frida攻擊Android應用程式,整個過程仿佛讓開發者開啟上帝視角,在本篇博客中,我們將會介紹在iOS應用程式中使用Frida繞過越獄檢測。即使你從來沒有使用過Frida,這篇文章也將會作為進入移動安全開發和分析的入門指南。 相關文章內容: 利用FRIDA攻 ...


 

     阿裡聚安全在之前的三篇博客中介紹了利用Frida攻擊Android應用程式,整個過程仿佛讓開發者開啟上帝視角,在本篇博客中,我們將會介紹在iOS應用程式中使用Frida繞過越獄檢測。即使你從來沒有使用過Frida,這篇文章也將會作為進入移動安全開發和分析的入門指南。

 

相關文章內容:

利用FRIDA攻擊Android應用程式(一)

利用FRIDA攻擊Android應用程式(二)

利用FRIDA攻擊Android應用程式(三)

一、Frida介紹

Frida是一個可以hook App的動態代碼工具包,可以向Windows、macOS、Linux、iOS、Android和QNX的本機應用程式中註入JavaScript或自己的庫代碼。最開始的時候,它是基於谷歌的V8 Javascript運行,但是從版本9開始,Frida已經開始使用其內部的Duktape運行。

 

列舉一些Frida的使用場景:

1、hooking特定函數並更改返回值

2、分析定製協議,同時其動態嗅探/解密

3、應用調試

4、在iOS應用上dump 類和方法信息

 

Firda眾多不同的使用場景,花樣繁多的啟動方式,包括各種強大的API和方法,讓它成為開發者建立自己安全分析的首選工具。它可以使用命令行界面或類似frida-trace的工具來跟蹤底層函數。同時還可以使用C、NodeJS或Python綁定完成更複雜的任務。但是在其內部,Frida使用Javascript的時候較多,可以通過JavaScript完成大部分的工作。

 

Frida之所以如此的能對安全檢測如此有用,就是因為它能夠在非越獄的設備上運行。 Frida提供了一個叫做“FridaGadget.dylib”的動態庫,可以用來在未越獄設備上為應用程式插入FridaGadget.dylib。開發者可以使用Swizzler2等工具來修改應用程式以在應用程式中添加FridaGadget.dylib。

 

iOS系統下,已有幾種基於Frida的安全分析工具,例如Needle和AppMon。

Needle是一個開源的模塊化框架,主要簡化iOS應用程式安全評估過程,並作為一個中心點。鑒於其模塊化方法,Needle很容易擴展新模塊,可以以Python腳本的形式加入。

地址:https://github.com/mwrlabs/needle

 

AppMon是監測和修改本地macOS、iOS、Android系統API的自動化框架,並能通過web介面顯示和操作

地址:https://github.com/dpnishant/appmon

 

 

二、在iOS上的設置Frida

設置步驟十分簡單,開發者同時在iOS設備和電腦上設置安裝Frida。

在iOS設備安裝步驟如下:

1、在iOS設備中打開Cydia APP

2、添加URL地址:https://build.frida.re

 

 

3、打開Source或搜索Frida,點擊Modify,然後安裝。

 

 

4、打開終端並輸入pip install frida來安裝Frida綁定, 當然你還可以使用python、C或NodeJS綁定來完成更複雜的任務

 

三、使用Frida連接iOS進程

完成Frida所有設置後,開始對iOS應用安全評估和利用之旅。

Damn Vulnerable iOS Application(DVIA)作為本次的測試方法,地址:http://damnvulnerableiosapp.com/

下文涉及的代碼,GitHub地址:https://github.com/interference-security/frida-scripts/tree/master/iOS

 

我們將從DVIA中分析越獄檢測操作,當前設備已顯示越獄。

 

 

首先查看目標設備的所有運行進程列表

frida-ps –U

 

從上面的截圖可以看到所有在iOS設備上運行的進程。

輸入frida –U process-name即可附加到任一進程,在Frida控制台獲取目標進程的屬性,記憶體和函數。

 

現在我們可以在Frida的shell中工作,它可以與我們的iOS進程進行交互,也可以編寫JavaScript來獲取我們想要的分析數據

 

四、Dump 類和方法信息

這個步驟是用於識別哪個ViewController和function負責驗證iOS設備是否越獄

 

ViewController是iOS應用程式中重要的部分,是應用程式數據和視圖之間的重要橋梁,ViewController管理應用中的眾多視圖。 iOS的SDK中提供很多原生ViewController,以支持標準的用戶界面,例如表視圖控制器(UITableViewController)、導航控制器(UINavigationController)、標簽欄控制器(UITabbarController)和iPad專有的UISplitViewController等。

 

先寫一個基礎的Frida腳本來dump目標應用程式中所有的class文件和method信息。開始尋找任何和越獄相關的內容,以便我們在Frida的幫助下繞過越獄檢測。

 

進程示意圖如下:

 

1、在DVIA中使用Frida尋找越獄檢測的類

先來看看應用程式中所有的class文件

for (var className in ObjC.classes)

    {

        if (ObjC.classes.hasOwnProperty(className))

        {

            console.log(className);

        }

}

 

運行腳本,我們就會看到Frida附加到目標進程,一旦載入完成,它將在目標進程中顯示出許多class文件。

使用grep命令來找到相關的class文件是比較好的辦法。當我們運行grep Jailbreak的命令時,我們就會看到一個名為JailbreakDetectionVC的類,如下圖所示

 

 

在找到所有實例之後,會看到一個safe to ignore的錯誤聲明。因此首要任務就是尋找目標類,找出此類中任何相關的方法,這是一個有趣的過程。

 

2、在DVIA中使用Frida尋找越獄檢測的方法

使用ObjC.classes.class-name.$methods,此例中只需在我們的目標類-JailbreakDetectionVC,找到該方法。

console.log("[*] Started: Find All Methods of a Specific Class");

if (ObjC.available)

{

    try

    {

        var className = "JailbreakDetectionVC";

        var methods = eval('ObjC.classes.' + className + '.$methods');

        for (var i = 0; i < methods.length; i++)

        {

            try

            {

                console.log("[-] "+methods[i]);

            }

            catch(err)

            {

                console.log("[!] Exception1: " + err.message);

            }

        }

    }

    catch(err)

    {

        console.log("[!] Exception2: " + err.message);

    }

}

else

{

    console.log("Objective-C Runtime is not available!");

}

console.log("[*] Completed: Find All Methods of a Specific Class");

 

繼續運行,運行grep檢索例如Jailbreak、Jailbroken、detection的字元串,如下圖所示

 

 

我們找到isJailbroken、jailbreakTest1Tapped:、jailbreakTest2Tapped:的3種字元串,符合上檢索目標。其中,isJailbroken看起來最像檢測設備是否越獄並返回值的函數。

 

3、在DVIA中使用Frida修改越獄檢測方法的返回值

查看isJailbroken發送的返回值

{

    try

    {

        var className = "JailbreakDetectionVC";

        var funcName = "- isJailbroken";

        var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');

        Interceptor.attach(hook.implementation, {

          onLeave: function(retval) {

            console.log("[*] Class Name: " + className);

            console.log("[*] Method Name: " + funcName);

            console.log("\t[-] Type of return value: " + typeof retval);

            console.log("\t[-] Return Value: " + retval);

          }

        });

    }

    catch(err)

    {

        console.log("[!] Exception2: " + err.message);

    }

}

else

{

    console.log("Objective-C Runtime is not available!");

 

運行腳本,在iOS應用中按下Jailbreak Test 1按鈕,我們可以在Frida控制台看到返回值

因為設備已經越獄,顯示的返回值為0*1,意味著返回函數True。

 

接下來我們的任務是覆蓋返回值並修複方法,以便每當按下Jailbreak Test 1按鈕的時候,返回值為false或0*0。

 

我們添加另一行來改變這個特定函數的返回值。通過下麵的代碼來實現,並將其記錄到控制台。

newretval = ptr("0x0")

retval.replace(newretval)

console.log("\t[-] New Return Value: " + newretval)

 

最終腳本如下:

if (ObjC.available)

{

    try

    {

        var className = "JailbreakDetectionVC";

        var funcName = "- isJailbroken";

        var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');

        Interceptor.attach(hook.implementation, {

          onLeave: function(retval) {

            console.log("[*] Class Name: " + className);

            console.log("[*] Method Name: " + funcName);

            console.log("\t[-] Type of return value: " + typeof retval);

            console.log("\t[-] Original Return Value: " + retval);

            newretval = ptr("0x0")

            retval.replace(newretval)

            console.log("\t[-] New Return Value: " + newretval)

          }

        });

    }

    catch(err)

    {

        console.log("[!] Exception2: " + err.message);

    }

}

else

{

    console.log("Objective-C Runtime is not available!");

}

 

一旦運行腳本,我們看到返回值已經修改

 

查看iOS的APP,可以看到設備顯示未越獄

 

 

---------------------------------------------------------

本文由Douglas編譯自attify,原文地址:http://blog.attify.com/2017/05/06/bypass-jailbreak-detection-frida-ios-applications/

更多移動安全類知識乾貨,請持續關註阿裡聚安全的博客


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • css選擇器 在介紹之前我麽你先來看看css大致分為幾種選擇器: 1.類型選擇器(元素選擇器) 2.後代選擇器(元素的所有後代) 3.偽類(:active, :hover, :focus, :link, :visited, :first-child, :lang) 4.通用選擇器(*) 5.子選擇器 ...
  • XMLHttpRequest是一個瀏覽器介面,使得Javascript可以進行HTTP(S)通信。 最早,微軟在IE 5引進了這個介面。因為它太有用,其他瀏覽器也模仿部署了,ajax操作因此得以誕生。 但是,這個介面一直沒有標準化,每家瀏覽器的實現或多或少有點不同。HTML 5的概念形成後,W3C開 ...
  • node上傳圖片第一種方式 1,首先引入模塊 "connect-multiparty": "~1.2.5", 在package.json中添加 "connect-multiparty": "~1.2.5", 然後在命令中切換到項目目錄,使用npm命令:npm installl; 基本配置完成 ind ...
  • Array.from() 用於將兩類對象轉為真正的數組,類似數組對象和可遍歷對象(包括數據結構Set和Map)轉化為數組 格式:Array.from(arrayLike[, mapFn[, thisArg]]) // 字元串 Array.from('foo'); // ["f", "o", "o"] ...
  • 我們就把這個問題叫做圖片查看器吧,它的主要功能有: 1、雙擊縮放圖片。 2、 雙指縮放圖片。 3、單指拖拽圖片。 為此這個圖片查看器需要考慮以下的技術點: 一、雙擊縮放圖片: 1、如果圖片高度比屏幕的高度小得多,那麼就將圖片放大到高度與屏幕高度相等,否則就放大一個特定的倍數。 2、如何判斷是否到達這 ...
  • 1 方法:public boolean moveTaskToBack(boolean nonRoot) activity里有這個方法,參數說明如下: nonRoot=false→ 僅當activity為task根(即首個activity例如啟動activity之類的)時才生效 nonRoot=tru ...
  • Android中,如果想把stack中的某個Activity moveTaskToFront,可以定義一個BroadcastReceiver接收某種類型的Broadcast,併在onReceive中start該Activity。但是需要註意的是,startActivity前面的context參數問題 ...
  • NB_10分鐘10行代碼_做出來的程式讓人驚嘆 (10分鐘瞭解Delphi XE全平臺開發流程 ) 超清晰下載地址: http://info.lm.tv.sohu.com/redirect.do?wec=MTQl6w3n5xtZKh-ZkssiPvnT2lqhm4iEqmI1U0jIphc5Ll8r ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...