搜索此博客

2017年8月18日星期五

【技术分享】如何利用Frida实现原生Android函数的插桩

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【技术分享】如何利用Frida实现原生Android函数的插桩  阅读原文»

2017-08-18 14:07:58 阅读:2313次 收藏 来源: 安全客 作者:�d趣使然的小胃

http://p9.qhimg.com/t01864eb15b5011e2e2.png

译者:�d趣使然的小胃

预估稿费:150RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


一、前言


上一篇文章中,Rohit向我们介绍了如何使用Frida完成基本的运行时测试任务。简而言之,Frida可以动态改变Android应用的行为,比如可以绕过检测Android设备是否处于root状态的函数。对于在ART(Android Runtime,Android运行时)环境中运行的应用来说,我们可以使用Java.perform来hook函数。

然而,在某些情况下,开发者会使用Android NDK来执行各种操作,比如检测root状态等,这种情况下,开发者就可以使用C++或C语言来开发代码,也可以访问APK中的函数。

在本文中,我们介绍了如何实现使用Android NDK开发的代码的动态插桩,具体而言,我们会介绍如何利用Frida来hook使用C++或C开发的函数。


二、动机


Xposed之类的框架默认情况下没有提供hook原生函数(native function)的功能,而其他工具,如android eagle eye对初学者来说并不友好,学习曲线非常陡峭。然而,我们可以使用Frida来hook基于Android NDK框架构建的那些函数。接下来我们可以看看具体的操作流程。


三、目标:Rootinspector


在本文中,我们的测试对象为Rootinspector应用,这个应用可以检查设备的root状态,应用由纯C++语言编写的原生代码构建而成。我们的目标是hook这些函数,绕过root检测逻辑。

在Rootinspector中,与root状态检测逻辑有关的代码分为两个部分。APK中的一个封装函数会调用由C++编写的checkifstream()底层函数,这一过程所对应的java函数为checkRootMethodNative12(),如下图所示。

 http://p6.qhimg.com/t01dac1402bdc130987.png

checkRootMethodNative12()是Android APK中使用Java编写的函数,会调用底层的checkifstream()函数,后者使用C++编写。

这个Android APK中声明的所有原生函数如下所示。

 http://p7.qhimg.com/t01d7cc0fac0beecb75.png

检查原生函数的源代码后,我们发现这个函数的具体实现为JavacomdevadvancerootinspectorRootcheckifstream,这个字符串由包名及函数名构成,由""符隔开。

我们首先尝试hook checkRootMethodNative12()这个Java函数,所使用的代码如下所示:

 http://p2.qhimg.com/t01e3ea3d99188b7147.png

然而,上述代码没法实现hook任务,出现的错误如下所示。Frida无法获得Root类对应的"localRoot"对象的引用。

 http://p1.qhimg.com/t01bcb7686bbe9dc757.png

在这种情况下,我们无法hook使用C++编写的那些函数,因为这些函数没有运行在Java VM上下文环境中。因此,我们必须做些改变,才能hook到原生的C++代码。


四、Hook原生代码


我们可以使用Frida中的Interceptor函数,深入到设备的底层内存中,hook特定的库或者内存地址。

当APK被封装打包时,编译器会编译C++代码,将其存放在APK文件lib目录中的"libnative.so",如下所示。

【技术分享】如何通过恶意插件在Atom中植入后门  阅读原文»

2017-08-18 14:52:47 阅读:2624次 收藏 来源: thinkst.com 作者:nstlBlueSky


http://p5.qhimg.com/t01df330e093681e0e4.png

译者:nstlBlueSky

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


背景


在生活和工作中,我们往往都需要用到一些类型的编辑器,这样才能开展我们的工作。但是,当选择一个编辑器时,每个人都有自己的看法。有些人是新潮派,喜欢使用像Atom或者Sublime这一类型的现代编辑器,而另外一些人则是守旧派,更喜欢坚持使用像Vim或Emacs这一类型的编辑器。无论你选择什么,对于一款编辑器而言,你最想做的可能就是以某种方式对此工具进行自定义操作。

现代编辑器的插件和扩展功能都是非常强大的。除了外观上的一些自定义之外(字体,配色方案等),它们还提供了一系列功能,这些功能能够使您的生活和工作变得更轻松,您应该能够找到一个适合您需要的插件。如果没有,你可以创建和发布一个。

通常情况下,用户会下载新的插件以满足他们的需求,这样他们的插件列表就会变得越来越多(因为谁会有时间去删除那么旧的或者未使用的插件呢?)。这其中,许多编辑器是支持自动更新的,以确保及时的修复bug以及增添新功能等。

对于这篇文章,我将重点研究Atom这款编辑器工具Github上的"明星"编辑器。根据他们的网站介绍,这是一个"21世纪的黑客文本编辑器"。 Atom编辑器的用户群在不断增长,它包含了各种各样的软件包。您甚至可以通过一些小技巧在Chromebook上安装Atom,这些技巧是通过绕过ChromeOS上的基本安全模型,使得您可以在Chromebook上安装Atom。


目标


我的任务是探索恶意的Atom插件对该工具的影响程度到底有多大。我们不知道我们将要面临什么障碍,不知道Atom会不会有什么安全措施来阻止我们的恶意程序。但事实证明,没有任何的阻碍...在几个小时之内,我不仅发布了我的第一个应用程序,而且更新了它,在此应用程序中还包含有一点点的恶意代码。

计划很简单:

第一步:获取一个已经发布的简单的包或者插件

这个过程我们需要什么以及该过程是否有难度(我们是否需要我们的应用程序被审查)?

第二步:测试更新过程

如果你打算创建一个恶意软件包,那么你将首先需要创建一个非恶意软件包,这个非恶意的软件包需要拥有一个庞大的用户群,然后推送一个软件更新,该更新包中包含了一些恶意的代码

第三步:从Atom包中实际测试我们可以实现的功能

我们需要确定我们的恶意软件是否在沙箱中运行以及我们拥有访问哪些系统库的权限等。


创建简易插件


步骤1

网络上有很多指南可以用来指导如何创建和发布Atom的包,包括在Atom官方网站上就有一个很详细的指南。生成一个新的包需要的步骤是:

1.创建一个新的包:

cmd + shift + p

Package Generator: Generate Package 

2.步骤1将为我们生成一个简单的包,这个包只包含了一个toggle方法,这个方法我们将在稍后会使用到:

toggle: ->

console.log 'touch-type-teacher was toggled!'

没有评论: