• 12
  • 12
分享
  • 被你放弃N次的Android框架,可以捡起来了——软件测试圈
  • 曼倩诙谐 2020-12-11 14:40:20 字数 3899 阅读 1625 收藏 12

  Xposed(也被称作Xposed框架、XP框架、Xposed framework),是运行于Android操作系统的一个著名的免费开源Hook框架。其通过替换Android系统的关键文件,可以拦截几乎所有Java函数的调用,并允许通过模块扩展方式来实现各种功能,模块中的自定义代码可以更改调用函数时的行为,常被用来修改Android系统和应用程序的功能。用户可以在一些应用商店或其自带的下载库来下载安装各种模块,相比于重新安装系统来获得新功能,Xposed提供了一种更便捷的方式[1][2]。Xposed模块可以很容易的开启和关闭。你只需要激活或者禁用Xposed模块,然后重启手机即可。

1.png


Xposed框架的标志

  但如今,随着Android系统的不断更新,Xposed框架逐渐无法在新设备上运行。此时,EdXposed团队成为了后续版本研发的继任者。2019年1月,ElderDrivers完成了EdXposed的开发。EdXposed是一个Magisk模块,依赖于riru框架,成功将Xposed移植到了Android Pie上,成为最接近原版Xposed的框架。2019年9月,EdXposed正式支持Android Q。2020年1月,EdXposed与Xposed原开发团队达成共识,成为Xposed停止更新后的官方接任者[3]。

  EdXposed有如下几个特点:

  1. 完全支持Android Pie和Q,甚至也可以支持R。

  2.EdXposed具有“应用列表”模式。可以选择要应用Xposed模块进行hook的的应用程序,而系统中的其他应用程序在完全干净的环境中运行。

  3. EdXposed使用Riru注入,不修改libart和app_process。

  安装和使用

  对于Xposed,Xposed Installer是Xposed框架的官方安装器,可以在拥有root权限的设备上安装Xposed框架。Xposed Installer也提供模块的下载、管理、日志显示等功能[4]。鉴于Xposed已经不再适用于新的Android系统,并且网上已经有非常多的教程,在此就不再赘述了。下面着重介绍一下EdXposed的安装方法。

  由于框架的核心点是系统进程注入技术,需要拥有设备的root权限,而且针对不同型号的设备和系统版本需要选择正确的框架版本,满足条件才能安装。

  首先,我们需要解除手机的BL锁,对于不同品牌的手机,解锁方式有所不同。以小米手机为例,可以在官方网站进行申请,步骤较为简单[5]。

  其次,需要在手机上安装第三方Recovery,此处以TWRP为例。

  2.1. 下载并安装ADB/FASTBOOT支持,安装完成后启动手机进入fastboot模式,连接电脑。在命令行中输入fastboot devices并执行,如果显示当前的连接手机,则安装成功。

  2.2. 打开TWRP官网[6],在Devices页面选择自己的机型对应的TWRP安装包,例如小米6,进入后点击对应的下载链接:

2.png

3.png

4.png




  点击想要下载的版本,如twrp-3.4.0-0-sagit.img进行下载:

5.png


  下载完成后,在命令行中输入“fastboot flash recovery D:\twrp-3.4.0-0-sagit.img”(刚刚下载的twrp路径)并执行。

  提示刷入成功后,重启进入twrp Recovery页面,如小米是同时按开机键和音量上键进入。

  2.3. 下载Magisk的zip卡刷包和apk安装文件https://www.download-magisk.com),并使用数据线导入到手机中。在twrp首页,点击“安装”,选择刚刚下载的Magisk的zip包进行安装。

6.png


  安装成功后,重启系统,安装Magisk的apk管理软件。

  打开Manager应该可以看到安装成功的页面。

7.png


  2.4. 参考EdXposed的官方文档的Install步骤[7],安装EdXposed:

  2.4.1. 在Magisk Manager的“下载”中安装 Riru(Riru - Core)和 Riru - EdXposed 后重启手机。

  2.4.2. 下载安装EdXposed Manager[8],安装完成后打开可以看到EdXposed框架已激活。

8.png


  开发

  本节中将介绍如何在AndriodStudio 4.0.1开发环境下创建一个简单的EdXposed模块。其实,EdXposed模块也是一个 Android 程序。与普通程序不同的是,编写EdXposed模块时需要完成以下4个任务:

  1)让手机上的EdXposed框架知道我们安装的这个程序是个EdXposed模块。

  2)模块里要包含有EdXposed的API的jar包,以实现下一步的Hook操作。

  3)这个模块里面要有对目标程序进行Hook操作的方法。

  4)要让手机上的EdXposed框架知道,我们编写的EdXposed模块中,哪一个方法是实现Hook操作的。

  下面开始按步骤进行:

  3.1. 新建项目,可以选择Empty Activity,进入项目页面,在项目目录中找到AndroidManifest.xml文件,插入如下代码:

9.png


  本步骤主要对Xposed模块进行声明。

  3.2. 手机连接Android Studio,运行刚刚编写的代码,在手机里会安装一个app,同时,EdXposed框架中会显示出这个模块。

10.png


  3.3. 配置Xposed API的依赖。在AndroidStudio 4.0.1中,可以在项目目录中找到build.gradle,插入以下代码。完成之后,build.gradle会提示文件已经修改,点击 “sync now”进行同步。

11.png


  本步骤设置了jcenter作为代码仓库,直接从这个仓库里远程寻找de.robv.android.xposed:api:82 的API。

  3.4. 下面打开activity_main.xml,在界面上加入一个button,并在MainAcitiviy里插入以下代码:

12.png


  本步骤在MainActivity界面上加入了一个按钮,打开app后点击按钮后会弹出一个toast提示,该提示的内容由 toastMessage() 方法提供,而toastMessage()的返回值为“我在正常运行”。

  至此,我们已经搭建好一个app靶子,其中包含一个之后用来hook的按钮,在关闭和启动Xposed模块时会显示不同的toastMessage。

  3.5. 下面编写hook代码。在MainActivity的路径下新建一个类“HookTest.java”,插入以下代码:

13.png


  此处通过IXposedHookLoadPackage接口中的handleLoadPackage方法来实现Hook并篡改按钮的toastMessage。需要设置目标程序的包名,在XposedHelpers.findAndHookMethod中设置想要Hook的类和方法。在afterHookedMethod方法(用来定义Hook了目标方法之后的操作)中,修改了toastMessage()方法的返回值为“嘿嘿!你已被劫持!”,对应之前点击按钮后显示的文字提示。

  3.6. 下面设置Xposed模块入口。在main文件夹中新建assets文件夹,并在其中新建文件xposed_init,文件类型text,并在其中填写刚刚编写的hook类路径“com.example.test.HookTest”。此时,EdXposed框架就能够从这个 xposed_init 读取信息来找到模块的入口,然后进行Hook操作了。

  3.7. 在File -> Settings -> Build, Execution, Deployment ->Debugger找到hotSwap,把Enable hotswap的勾去掉。

  3.8. 点击“运行”!在EdXposed框架里找到自己写的模块,打上勾启动模块,重启手机。

  3.9. 打开app点击按钮显示劫持成功。

14.png


  总结

  本文介绍了EdXposed框架的前世今生,安装使用和模块编写,而EdXposed框架的强大不止于此,更多功能大家有兴趣可以自己体验。

  Reference:

  [1].https://www.xda-developers.com/xposed-framework-hub/

  [2].https://github.com/rovo89/XposedBridge/wiki/Development-tutorial#how-xposed-works

  [3].https://zh.wikipedia.org/zh-hans/Xposed_(%E6%A1%86%E6%9E%B6)

  [4].https://repo.xposed.info/module/de.robv.android.xposed.installer

  [5].http://www.miui.com/unlock/index.html 

  [6].https://twrp.me/

  [7].https://github.com/ElderDrivers/EdXposed 

  [8].https://github.com/ElderDrivers/EdXposedManager/releases 



作者:高宇   

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


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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 需求:读取本地存放图片的地址,实现随机选取图片转化为base64图片流问题出现的环境背景:工作中模型接口的传入为图片base64,在使用jmeter进行相关接口测试时需要有该功能函数。开发步骤:1、创建java项目,新建的包名称必须时org.apache.jmeter.functions,在该包下创建名为ImageToBase64的class2、导入jmeter安装目录下的lib\ext下的ApacheJMeter_functions.jar包3、继承AbstractFunction类,并重写其中的方法package org.apache.jmeter.functions; imp...
            2 0 2732
            分享
          •   科兴园,周一。  “张霖,你那个新功能测完了吗?”  刘毅没有选择企业微信私信,而是直接走到张霖面前。  “刘哥,已经测完了。”张霖放下手头的工作,补充道:“这个功能上周五就已经测完了,没来得及跟你说。”  “嗯,bug多吗?”  “emm...还挺多的, 有大概200多个bug。”  “200多...现在bug都修完了吗?”  “对,今天上午都回归完了,也没有剩余bug。”  “好,那你把这个功能的测试报告写一下,然后发个邮件。”刘毅解释道:“在我们项目组,每个版本比较重要的功能,测试完成后都需要写份测试报告,然后走邮件。”  “主要目的是让项目组知道功能的测试情况,特别是上面领导比较关...
            0 0 554
            分享
          •   通用的测试管理过程主要可以分为三个部分:测试计划、测试监控和控制、测试完成。  从研发项目角度出发,测试管理过程可以用于不同级别的项目测试管理。  从测试阶段出发,测试管理过程可以用于不同测试阶段的测试管理,如集成测试、系统测试、验收测试等。  从测试类型出发,测试管理过程可以用于不同类型的测试管理,如功能测试、性能测试。  测试计划过程  测试计划过程用于制定测试计划。根据测试计划过程在项目中所处的位置不同,可以分为整体的测试计划(如系统测试计划),或某个类型的测试计划(如性能测试计划)。  创建一个测试计划,可以参考如下图1所示的过程。图1 测试计划过程  上图中箭头文字表示的是每一个...
            0 0 818
            分享
          • 翻译文章在你开始为任何提供工作机会的自由职业网站工作之前,这里有一些建议工作机会:1)初步申请投标最低的小项目。这是你开始的必要条件至少有一个积极的反馈。你可以在以后的任何时候提高你的小时工资。2)你可以对项目进行的免费投标数量有限制。利用这句话有效地确保申请相关的工作,你是最适合的。同时申请至少一份日常相关工作。这将保持你的档案活跃,这将帮助你获得稳定的工作流程。甚至考虑到10%的成功率,你必须申请至少10份工作才能获得第一份合同。3)寻找在软件测试项目中工作的其他测试人员/ qa的资料。研究他们的资料看看他们如何展示自己的技能并申请新项目。准备你的详细资料与你的专业知识、经验和其他软技能。...
            0 0 1247
            分享
          • 一、前言应用程序访问与操作数据库,需要与数据库建立一条连接。但建立数据库连接是一个比较消耗时间和资源的过程。尤其在多并发访问时,会造成数据库连接频繁的创建与关闭,导致程序性能急剧下降,严重时可以造成应用程序崩溃。目前最常用的解决方案是使用数据库连接池管理数据库连接。数据库连接池是数据库连接对象的缓存技术,负责分配、管理、释放数据库连接。应用程序在启动时创建指定数量的数据库连接组成数据库连接池,由应用程序动态的对池中的连接进行复用、增加和释放。连接池技术避免了重复创建和关闭数据库连接带来的消耗,极大的复用了内存资源,从而提高了程序的运行效率。二、数据库连接池测试1、测试背景我司因数据库连接池的选...
            0 1 1750
            分享
      • 51testing软件测试圈微信