在iOS应用程序中使用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/

更多移动安全类知识干货,请持续关注阿里聚安全的博客

相关文章
|
8月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
795 4
|
9月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
9月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
170 1
|
4月前
|
iOS开发 开发者 Windows
uniapp云打包ios应用证书的获取方法,生成指南
打包用到的一共两个文件,一个是p12格式的私钥证书,一个是证书profile文件。其中生成p12证书的时候,按照官网的教程,是需要MAC电脑来协助做的,主要是生成一些csr文件和导出p12证书等。其实这些步骤也可以借助一些其他的工具来实现,不一定使用mac电脑,用windows电脑也可以创建。
497 0
|
8月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
191 2
|
8月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
8月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
160 1
|
9月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
136 5
|
10月前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
157 32
|
9月前
|
移动开发 前端开发 Swift
iOS 最好的应用程序开发编程语言竟然是这7种
iOS 最好的应用程序开发编程语言竟然是这7种
287 8