安全路透社
当前位置:安全路透社 > 网络转载 > 正文

如何在iOS应用程序中用Frida来绕过“越狱检测”?

modifying-the-return-value-790x435.png

本文我将为大家展示,如何在iOS应用程序中使用Frida来绕过越狱检测。在正式开始之前,让我们先来简单了解下本文的具体流程。

以下是本文将要介绍的内容:

  1. Frida框架介绍
  2. Frida在iOS上的设置
  3. 将Frida连接到一个iOS进程
  4. dump类和方法信息
  5. 使用Frida进行iOS应用程序的运行时操作
  6. 总结

Frida介绍

Frida是一款基于python + javascript 的hook与调试框架。它允许你将 JavaScript 的部分代码或者你自己的库注入到 windows、macos、linux、iOS、Android,以及 QNX 的原生应用中,同时能完全访问内存和功能。

该工具由OleAndréV.Ravnås(@oleavr)开发,并且还有一个非常活跃的IRC频道,在这里你可以与其他许多同样热衷于Frida的技术人员探讨交流。你可以通过irc.freenode.net上的#frida加入IRC。

Frida的一些实际用例(根据自身使用的目的而定)–

  • hook特定函数并更改返回值
  • 分析定制协议,并迅速嗅探/解密流量
  • 对自己的应用程序进行调试
  • 从iOS应用程序中dump类和方法信息
  • 等等。

除以上提到的作用之外,Frida 还提供了一系列的 API 以及方法。你可以使用命令行窗口或者像 frida-trace 的记录 low-level 函数(例如 libc.so 中的’open’调用)的工具来快速运行。你可以使用C,NodeJs或者Python绑定来完成更加复杂的工作。因此,Frida 也是我强烈推荐大家使用的安全或分析工具的首选。目前,已经有好几种工具都建立在了Frida上,包括Needle 和AppMon

Frida的另一大优势就是,可以在非越狱的设备上正常工作。为了更好的运行Frida来调试非越狱设备上的应用程序,你可以使用Swizzler2等工具来修改应用程序,以便在应用程序中添加FridaGadget dylib。

Frida在iOS上的设置

Frida在ios上的设置也非常的简单,只需要在你的iOS设备以及主机上执行以下操作。

要在你的iOS设备上安装Frida服务器,请参照以下步骤。

1.在你的iOS设备上打开Cydia应用程序。

2.添加一个源,URL为:https://build.frida.re

IMG_0002-576x1024.png

3.打开Source或搜索Frida,单击Modify,然后单击Install。

IMG_0001-576x1024.png

为了在你的系统上安装Frida的Python绑定,你需要启动erminal并输入pip install frida来进行安装。

将Frida连接到一个iOS进程

现在我们已经安装了Frida。下面我们就要正式开始使用Frida,对我们的iOS应用程序进行安全评估和开发了!

在本案例中,我们将使用Damn Vulnerable iOS App(DVIA)这款包含大量安全漏洞的app来进行测试,你可以从这里下载到它。以下大部分所使用的ios app Frida测试脚本你可以在Github获取到。

我们将分析DVIA的越狱检测行为,目前该设备显示已越狱。

IMG_0003-576x1024.png

让我们先来查看下,目标设备上所有正在运行的进程有哪些:

frida-ps –U

frida-show-list-of-running-processes.png

从上面的截图我们可以看到,所有当前正在运行的进程。

下面让我们来attach一个进程。你可以通过 ‘frida -U 进程名’ 的格式来attach某个进程。成功attach后,我们将进入到frida的控制台界面,在该控制台我们可以访问到目标进程的所有不同属性,内存内容和功能。

attaching-to-a-process-using-Frida.png

我们可以在Frida的shell中工作,并与我们的进程进行交互,或者我们还可以通过编写自己的JavaScript,来获取我们想要的数据。

dump类和方法信息

这项工作的目的是为了确定在DVIA的越狱检测中,负责验证我们的设备是否越狱的ViewControllerfunction是哪个。

我们先来写一个基本的Frida脚本,来转储目标应用程序中存在的所有类和方法。在这里,我们将寻找与越狱相关所有的内容,以便我们能够在Frida的帮助下绕过越狱检测。

基本操作流程如下:

iOS-application-security-process.png

使用Frida查找DVIA中的越狱检测类

我们先来看看,应用程序中的类都有哪些。

for (var className in ObjC.classes)
    {
        if (ObjC.classes.hasOwnProperty(className))
        {
            console.log(className);
        }
}

一旦运行它,你会看到Frida成功attach到目标进程(如下图所示),随后它将为我们显示目标进程中的所有类。

Executing-JavaScript-with-Frida-on-iOS.png

这里我们可以通过grep命令来筛查出包含Jailbreak字样的类。这里我们看到一个叫JailbreakDetectionVC的类,如下所示。

Identifying-target-class.png

找到所有实例后,在这里你可能会遇到一个可忽略的错误语句。

在完成了目标类的查找之后,接下来让我们将目光转向类中的方法。

使用Frida查找DVIA中越狱检测类的方法

为了找到方法,我们需要使用 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字符串的内容,如下所示。

Identifying-target-methods.png

我们发现该类中其中有三个方法,包含我们的查找关键字,它们分别为Jailbroken,jailbreakTest1Tapped: jailbreakTest2Tapped:

在我们的案例中,isjailbroken 是最有可能被用于检测是否越狱,并发送返回值的函数。

使用Frida修改DVIA越狱检测类中方法的返回值

所以让我们继续看看,Jailbroken都发送了什么类型的返回值。

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[-] Return Value: " + retval);
          }
        });
    }
    catch(err)
    {
        console.log("[!] Exception2: " + err.message);
    }
}
else
{
    console.log("Objective-C Runtime is not available!");
}

运行此脚本后,请在iOS应用程序中按 Jailbreak Test 1,你将看到Frida控制台中显示的返回值。

finding-return-value-of-target-method.png

由于我们的设备已经越狱,所以它的返回值为0×1。

接下来我们需要做的就是覆盖此返回值并修补该方法,以便每次在应用程序中按下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!");
}

运行该脚本后,我们可以看到返回值已经被修改,如下所示。

modifying-the-return-value.png

此时当你再次查看你的iOS应用程序时你会发现,应用程序将提示你的设备还未越狱(如下所示)。

IMG_0004-576x1024.png

总结

通过本案例,我们已经学会了Frida的基本使用方法。在后续的文章中我将带大家更深入的了解Frida脚本以及如何利用Frida的API和其它工具,来执行iOS和Android应用程序的安全性评估工作。

*参考来源:attify,FB小编 secist 编译

未经允许不得转载:安全路透社 » 如何在iOS应用程序中用Frida来绕过“越狱检测”?

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册