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

时间:2022-04-24 09:51:16
 

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

相关文章内容:

利用FRIDA攻击Android应用程序(一)

利用FRIDA攻击Android应用程序(二)

利用FRIDA攻击Android应用程序(三)

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

一、Frida介绍

Frida是一个可以hook App的动态代码工具包,可以向Windows、macOS、Linux、iOS、Android和QNX的本机应用程序中注入JavaScript或自己的库代码。最开始的时候,它是基于谷歌的V8 Javascript运行,但是从版本9开始,Frida已经开始使用其内部的Duktape运行。

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

列举一些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

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

3、打开Source或搜索Frida,点击Modify,然后安装。

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

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中分析越狱检测操作,当前设备已显示越狱。

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

首先查看目标设备的所有运行进程列表

frida-ps –U

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

从上面的截图可以看到所有在iOS设备上运行的进程。

输入frida –U process-name即可附加到任一进程,在Frida控制台获取目标进程的属性,内存和函数。

在iOS应用程序中使用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的帮助下绕过越狱检测。

进程示意图如下:

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

1、在DVIA中使用Frida寻找越狱检测的类

先来看看应用程序中所有的class文件

for (var className in ObjC.classes)

{

if (ObjC.classes.hasOwnProperty(className))

{

console.log(className);

}

}

运行脚本,我们就会看到Frida附加到目标进程,一旦加载完成,它将在目标进程中显示出许多class文件。

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

使用grep命令来找到相关的class文件是比较好的办法。当我们运行grep Jailbreak的命令时,我们就会看到一个名为JailbreakDetectionVC的类,如下图所示

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

在找到所有实例之后,会看到一个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的字符串,如下图所示

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

我们找到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控制台看到返回值

在iOS应用程序中使用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应用程序中使用Frida绕过越狱检测

查看iOS的APP,可以看到设备显示未越狱

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

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

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

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

在iOS应用程序中使用Frida绕过越狱检测的更多相关文章

  1. iOS安全攻防之使用 Frida 绕过越狱设备检测

    Frida 是 一款有趣的手机应用安全分析工具. 文章参考:Bypass Jailbreak Detection with Frida in iOS applications 在 Mac Termin ...

  2. Delphi for iOS开发指南&lpar;8&rpar;&colon;在iOS应用程序中使用Tab组件来显示分页

    Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页 在FireMonkey iOS应用程序中的Tab Tab由FMX.TabControl.TTabControl定 ...

  3. Delphi for iOS开发指南&lpar;7&rpar;&colon;在iOS应用程序中使用WebBrowser组件

    Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件 在FireMonkey iOS应用程序中使用WebBrowser 在iOS平台上,FireMonkey使用T ...

  4. Delphi for iOS开发指南&lpar;6&rpar;&colon;在iOS应用程序中使用ComboBox组件来从列表中选择某一项

    http://blog.csdn.net/delphiteacher/article/details/8924110 Delphi for iOS开发指南(6):在iOS应用程序中使用ComboBox ...

  5. Delphi for iOS开发指南&lpar;5&rpar;&colon;在iOS应用程序中使用Calendar组件来选择日期

    http://blog.csdn.net/delphiteacher/article/details/8923519 在FireMonkey iOS应用程序中的Calendar FireMonkey使 ...

  6. Delphi for iOS开发指南&lpar;4&rpar;&colon;在iOS应用程序中使用不同风格的Button组件

    http://blog.csdn.net/DelphiTeacher/article/details/8923481 在FireMonkey iOS应用程序中的按钮 FireMoneky定义了不同类型 ...

  7. IOS在一个程序中启动另一个程序

    尽管iPhone不允许同时运行两个应用程序,我们可以从自己的应用程序中启动另一个应用程序,并且可以在应用程序之间共享数据.我们可以使用UIApplication类的openURL:方法从一个应用程序来 ...

  8. Xcode中iOS模拟器程序中的plist路径

    Xcode6.4里写了个简单的iOS程序在模拟器中跑. 其中用到了NSUserDefaults来保存属性文件plist,那么这个文件实际路径在哪里呢?在网上搜了一下,发现几种说法(*表示当前用户名): ...

  9. ios 在程序中使用iCloud

    注意,这里说的使用icould不是用icloud进行系统备份,那个功能不需要我们写代码,备份到icloud的东西我们也不能操作.我们指的是以下这3种icloud使用方法: 这里有3中使用方法, Key ...

随机推荐

  1. Monty Hall Problem的一个图解,感觉不错

    从Coursera.org上的台大概率课讨论组里拿来的 如果不转换,选中汽车的概率是1/3,非常显然. 但转换后选中汽车的概率变成2/3就有点反直觉了,并不是太容易想明白. 因为转换其实有4种:汽车- ...

  2. ASP&period;NET MVC 在控制器中接收视图表单POST过来的数据方法

    方法一:通过Request.Form [HttpPost]        public ActionResult Test()        {            string id=Reques ...

  3. thinkphp自动验证方法的使用

    建一个表单: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  4. influxdb和boltDB简介——底层本质类似LMDB,MVCC&plus;B&plus;树

    influxdb influxdb是最新的一个时间序列数据库,最新一两年才产生,但已经拥有极高的人气.influxdb 是用Go写的,0.9版本的influxdb对于之前会有很大的改变,后端存储有Le ...

  5. 理论制作 Windows 开机动画

    第一次接触 Windows 开机动画是 2012 年,那时候魔方的版本号还是 3.12,魔方里面有个很酷炫狂霸拽的功能就是替换 Windows 7 的开机动画.一开始我是在IT之家论坛里下载开机动画, ...

  6. hadoop 2&period;0--YARN

    从2012年8月开始Apache Hadoop YARN(YARN = Yet Another Resource Negotiator)成了Apache Hadoop的一项子工程.自此Apache H ...

  7. 使用Windbg来检查内存

    Windbg是一款微软开发的调试windows代码的工具,水很深,不过使用windbg来进行clr的调试则比较简单,windbg使用之前需要进行配置. File->Symbol path-&gt ...

  8. theano中的concolutional&lowbar;mlp&period;py学习

    (1) evaluate _lenet5中的导入数据部分 # 导入数据集,该函数定义在logistic_sgd中,返回的是一个list datasets = load_data(dataset) # ...

  9. 2015年十大热门Android开源新项目

    2015年十大热门Android开源新项目 2015 即将结束,又到了大家喜闻乐见的年终盘点时刻啦,今天给大家盘点一下 2015 年 Android 开发领域新出现的 10 大热门开源项目.数据来自于 ...

  10. 如何搭建易企秀H5平台?

    导读 易企秀如何开启伪静态支持? 一秀如何开启伪静态? 下载易企秀源码 oschina: http://git.oschina.net/jsper/html5Editor Windows下搭建环境 安 ...