资讯专栏INFORMATION COLUMN

在iOS应用程序中使用Frida绕过越狱检测

niceforbear / 3169人阅读

摘要:在中使用修改越狱检测方法的返回值查看发送的返回值运行脚本,在应用中按下按钮,我们可以在控制台看到返回值因为设备已经越狱,显示的返回值为,意味着返回函数。

阿里聚安全在之前的三篇博客中介绍了利用Frida攻击Android应用程序,整个过程仿佛让开发者开启上帝视角,在本篇博客中,我们将会介绍在iOS应用程序中使用Frida绕过越狱检测。即使你从来没有使用过Frida,这篇文章也将会作为进入移动安全开发和分析的入门指南。


一、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/ne...

AppMon是监测和修改本地macOS、iOS、Android系统API的自动化框架,并能通过web接口显示和操作
地址:https://github.com/dpnishant/...

二、在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/interferen...

我们将从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("	[-] Type of return value: " + typeof retval);
        console.log("	[-] 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("	[-] Type of return value: " + typeof retval);
        console.log("	[-] Original Return Value: " + retval);
        newretval = ptr("0x0")
        retval.replace(newretval)
        console.log("	[-] 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/0...
更多移动安全类知识干货,请持续关注阿里聚安全的博客
相关文章内容:
利用FRIDA攻击Android应用程序(一)
利用FRIDA攻击Android应用程序(二)
利用FRIDA攻击Android应用程序(三)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16752.html

相关文章

  • 【腾讯Bugly干货分享】iOS 黑客技术大揭秘

    摘要:本文来自于腾讯开发者社区,非经作者同意,请勿转载,原文地址小时内拼工作,小时外拼成长这是大家共同的理想。每周都会举行嘉宾分享,话题讨论等活动。本期,我们邀请了腾讯开发工程师何兆林为大家分享黑客技术大揭秘。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5791d... 8小时内拼工作,8小时外拼成长这是大家共同的理...

    weknow619 评论0 收藏0
  • 独家探寻阿里安全潘多拉实验室,完美越狱苹果iOS11.2.1

    摘要:以阿里安全潘多拉实验室为例,在对移动系统安全研究的过程中,把研究过程中发现的问题上报给厂商,促进系统安全性的提升。 知道如何从攻击的视角去发现漏洞,才能建立更安全的体系,促进了整个生态的良性发展。以阿里安全潘多拉实验室为例,在对移动系统安全研究的过程中,把研究过程中发现的问题上报给厂商,促进系统安全性的提升。 小编第一时间深度探访阿里安全潘多拉实验室,采访了此次攻破苹果iOS11.2....

    joyqi 评论0 收藏0
  • 最简单企业证书部署应用!In-House改进版!免HTTPS!

    摘要:因为新浪服务器升级,限制目录和文件名的长度,所以更换实现方式简介平台发布应用,想绕过,最好的方式就是发布了由于越狱用户覆盖不全,一般不考虑越狱方式。 ⚠️因为新浪服务器升级,限制目录和文件名的长度,所以更换实现方式 简介 iOS平台发布应用,想绕过AppStore,最好的方式就是In-House发布了(由于越狱用户覆盖不全,一般不考虑越狱方式)。网上搜索In-House的教程也很多,怎...

    ZoomQuiet 评论0 收藏0
  • 使用友盟统计分析常见问题100篇(索引-持续更新)

    摘要:友盟统计使用流程常见的疑难杂症汇总如下与版本常见问题友盟统计认为,是每个应用的唯一标识,同一应用的不同平台请使用不同,建议您在友盟后台命名为应用名平台友盟统计客户端是指您发布的市场和推广渠道标识,平台上,如代码中没有填写则记为,平 友盟统计使用流程http://bbs.umeng.com/thread-55-1-1.html 常见的疑难杂症汇总如下: 1、appkey、channe...

    Honwhy 评论0 收藏0
  • 使用友盟统计分析常见问题100篇(索引-持续更新)

    摘要:友盟统计使用流程常见的疑难杂症汇总如下与版本常见问题友盟统计认为,是每个应用的唯一标识,同一应用的不同平台请使用不同,建议您在友盟后台命名为应用名平台友盟统计客户端是指您发布的市场和推广渠道标识,平台上,如代码中没有填写则记为,平 友盟统计使用流程http://bbs.umeng.com/thread-55-1-1.html 常见的疑难杂症汇总如下: 1、appkey、channe...

    DandJ 评论0 收藏0

发表评论

0条评论

niceforbear

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<