• 1
  • 1
分享

    2019年末的一个偶然机会,听到了“frida”这个词语,作为刚入行的安全小白,我对这个此产生浓厚的兴起,一步步走上了frida框架的学习之路。frida是一款基于python和java 的hook框架,可运行在Android、IOS、Linux和Widows等多个平台。期初,感觉这个框架真是有点意思,接触久了发现简直太有意思了,面对移动APP的时候,一旦拥有了Frida,也就拥有一切。本篇文章中,我们将重点介绍Frida方面的知识。

  1、Hook是个什么鬼?

  Hook翻译过来就是“钩子”的意思,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。Hook技术无论对安全软件还是恶意软件都是十分关键的一项技术,其本质就是劫持函数调用。

  2、Frida框架的那些事

  frida是一款基于python和java 的hook框架,是一种动态插桩工具,可以插入代码到原生App的内存空间中,动态的监视和修改其行行为,可运行在Android、iOS、Linux和windows等多个平台。

  插桩技术是指将额外的代码注入程序中以收集运行时的信息,可分为两种:一是源代码插桩【Source Code Instrumentation(SCI)】:额外代码注入到程序源代码中;二是二进制插桩【Binary Instrumentation】:额外代码注入到二进制可执行文件中,其又可分为两种:

图1.png

  图1 插桩技术分类

  上面把Frida框架说的天花烂坠的,神乎其神,利用它到底能做什么呢?我们使用Frida框架可以:可以访问进程的内存,提取我们感兴趣的信息或敏感信息;可以在应用程序运行时覆盖一些功能,改变其程序运行逻辑;可以调用相关类中函数;可以在堆上查找对象实例并使用这些对象实例;可以动态跟踪、拦截变量和函数等等。

  瞧,它能做的事情已经够多的了吧!现在让我们开启Frida框架之路吧!

  3、如何让Frida奔跑起来?

  今天我们用到的frida框架分为两部分: 一部分是“客户端”即:用于连接远程设备,提交要注入的 JS 代码到服务端,并接受服务端发来的消息; 另一部分是“服务器端”即:注入JS代码到目标进程,操作内存数据,并将相关信息发送至给客户端。

  3.1如何获得frida CLI

  3.1.1环境要求

  系统环境 – Windows、macOS、Linux

  Python – 最新的3.x版本

  Adb环境 – 请自行下载adb工具或安装android studio工具

  环境准备好了,让我们来安装frida CLI吧!安装frida CLI有很多种方法,这里只介绍两种,即:pip和npm:

  3.1.2 pip 安装frida

  Python 2.7.9+或Python3.4+以上版本都自带 pip 工具,请自行安装

  执行pip install frida

  执行pip install frida-tools

  执行frida –version

  3.1.3 npm安装frida

  自行安装NodeJS

  执行npm install frida

  执行npm install frida-tools

  执行frida –version

  3.2如何获得frida-server

  3.2.1环境要求

  手机一部,本文主要讲述Android系统

  手机必须被Root,具体Root方法请自行查询

  3.2.2 安装方法

  下载frida-server,地址:https://github.com/frida/frida/releases

  执行以下命令

图2.png

  图2 列出安卓设备

图3.png

  图3 放置frida-server到设备

  3.2.3如何运行frida

图4.png

  图4 启动frida

  4、掀开Frida的神秘面纱

  4.1 Frida CLI交互工具

  frida-ps命令能够列出客户端进程的命令行工具

图5.png

  图5 frida CLI交互命令(一)

  frida命令是一个交互式解释器,用于实现Hook代码的动态注入。

图6.png

  图6 frida CLI交互命令(二)

  备注:这里的com.android.chrome就是通过frida-ps命令查询到的远程客户端进程。

  另外还有四个命令分别是:

图7.png

  图7 frida CLI交互命令(三)

  由于并不常用这里就不详细介绍了,感兴趣的同学可以去frida的官网查看详细介绍和用法。

  4.2常用Java API

  由于frida的注入脚本是Java,因此在开始frida初探之前,有必要对Java注入相关的API做一个简单介绍, 后面我们都将通过js脚本来操作设备上的Java代码。

图8.png

  图8 frida的Java API(一)

  当我们使用Java.use()获取Java类之后,我们就可以通过class.method.implementations = function() {}的形式hook某类的某方法,不管是实例方法还是静态方法都可以。

  另外,由于js代码注入时可能会出现超时的错误, 为了防止这个问题,我们通常还需要在最外面包装一层setImmediate(function(){})的代码,如下所示:

图9.png

  图9 frida的Java API(二)

  5、初探Frida即:Hello World程序

  通过上面的介绍,现在终于可以来真格的了。而这里所说的Hello World程序,和我们日常看编程书籍所说的有所不同,我们上网找了一个OWASP Uncrackable Crackme Level 1的APP,并对其“防Root检测”功能进行了Hook。

  首先,我们下载OWASP Uncrackable Crackme Level 1的APK文件,并将其扩展名修改为.zip,然后找到classes.dex文件将其编译为classes.jar文件。

  dex2jar classes.dex -o classes.jar

  之后,使用JD-GUI打开classes.jar文件,查找关键字,这里的关键字是“Root detected”。

图10.png

  图10 代码片段(一)

  另外,在 MainActivity 类中看到,函数 a 打开了一个对话设置了一个 onClickListener监听,当我们按ok按钮时,onClick事件函数就会被触发。

图11.png

  图11 代码片段(二)

图12.png

  图12 代码片段(三)

  由以上代码可知,onClick事件函数只是简单的使用 system.exit ( 0 ) 来退出app。因此我们只需要不调用system.exit ( 0 ) 阻止App退出即可。

图13.png

  图13 frida代码

  现在让我们运行此App程序,它依然弹出了Root检测的对话框。

图14.png

  图14 App运行界面

  现在让我们来运行frida注入程序,然后点击OK按钮,神奇的事情发生了,App并没有退出,我们正常的进入了App界面。

图15.png

  图15 frida注入界面

图16.png

  图16 frida注入后的App界面

  至此,我们以一个实例展示了frida框架的强大和神奇之处,这个Hook功能虽然简单,但是同样体现了整个的Hook过程,所谓麻雀虽小,但五脏俱全。


作者:范斌、孙颖嘉、卫斯赜   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 登录的测试用例设计点功能性用例设计点:输入已注册的用户名和正确的密码,验证是否成功登录输入已注册的用户名和不正确的密码,验证是否成功失败,且提示信息正确输入未注册的用户名和任意密码,验证是否登录失败,且提示信息正确使用未激活账户登录,验证是否登录失败使用被停用用户登录,验证是否登录失败用户名和密码两者都为空,验证是否登录失败,且提示信息正确用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确如果登录功能启用了验证码功能,在用户名和密码正确的情况下,输入正确的验证码,验证是否登录成功如果登录功能启用了验证码功能,在用户名和密码正确的情况下,输入错误的验证码,验证是否登录失败,且提示信息正...
            0 1 2867
            分享
          • 摘要:记录开发过程中遇到的问题,希望对诸君有所帮助,快速解决开发中遇到的类似问题。最近再开发过程中,因为公司增加了小程序业务,需在公众号中增加小程序的跳转,故将公众号跳转小程序的方法整理如下,供诸位使用,避免采坑。重点:只能跳转与公众号关联的小程序。1、公众号自定义菜单跳转到小程序http请求方式:POST(请使用https协议)接口:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN;自定义菜单格式如下:2、开放标签跳转小程序:1. 引入JS文件在需要调用JS接口的页面引入如下JS文件:http://...
            0 0 742
            分享
          • 接《“我现阶段最在乎的是如何提升自己”(上)》,原文可在本人主页查看~通过什么提升?理论+实践。理论更多解决知识、态度问题,实践更多解决技能、经验问题。理论怎么提升?要读原著、学原文、悟原理,要学经典理论,要学榜样。学什么理论?经典理论,常识理论,就是千百年来大家公认的理论。哲学理论需要有,唯物辩证法需要有,公司的基本法需要有,部门的历史需要有,部门大事记需要了解,公司大事记需要了解,并列部门大事记需要了解。这些,应该能提升我们的理论认识水平。实践怎么提升?事上磨,事上练。领导交办的每一件事情,都拿出120分的热情来办,都拿出全力以赴来办,都拿出满怀的热忱来办。都遵循“凡事预则立不预则废”,都...
            1 1 761
            分享
          • 让我们看一下最简单形式的语法:START TRANSACTION; {sql statement 1} {sql statement 2} ... ... COMMIT;MySQL 事务包含指示事务开始和结束的命令以及允许 MySQL 引擎执行必要的提交或回滚操作的其他选项。START TRANSACTION:它指的是事务的开始/发起。此时内部自动提交已关闭,即除非明确提交,否则不会提交语句。MySQL 语句:事务中可以有多个相关语句,这些语句将全部执行或不执行。COMMIT:这是指事务的最终语句,它指示 MySQL 引擎将所做的更改写入。让我...
            0 0 1551
            分享
          • 7 月 22 日晚,Dify 主创团队和用户们临时性地组织了一场高质量的线上交流活动。交流会主要围绕 Dify 的产品规划、用户对于 LLM 的探索和理解、用户使用 Dify 过程中遇到的问题和困惑等方面展开讨论。相信对所有基于 LLM 或 Dify 创造应用的小伙伴们都能提供很好的思路和借鉴。错过的小伙伴看这里,我们整理总结了相关的问题和讨论要点,供大家阅读参考(Question 部分为不同用户提出的问题,Answer 部分为 Dify 团队的理解和答疑)。关于 Dify 产品规划Dify 产品上线以来受到很多开发者朋友的关注和喜爱,在平台上已经创建了 3 万多个应用(仅云端版),我们希望能...
            0 0 2225
            分享
      • 51testing软件测试圈微信