如何使用Frida绕过iOS应用程序中的越狱检测!!!

注意  注意  请注意:

一、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,可以看到设备显示未越狱

未完待续  且加QQ群讨论~.~

(机会永远是留给那些有准备的人)      

谢谢大家支持 !!!

↓↓↓

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容