• 0
  • 0
分享

Cydia Substrate是一个基于Hook的代码修改框架,其可以在Android、iOS平台使用,并实现修改系统默认代码。这里学习了下Cydia Substrate  hook框架在安卓平台的使用。


  一、原理介绍

  当然Xposed也能实现了对应的功能,但两者实现的技术手段有些不一样,由于Xposed开源,也有不少相关文章分析了实现方式,其主要原理是替换了/system/bin/app_process这个程序,在机子启动时加载自身的XposedBridge.jar完成对虚拟机的劫持。而Cydiasubstratet并不开源但根据比对两者"installer",我猜测Cydiasubstrate应该是采用注入的方式完成hook的:Cydia Substrate是一个代码修改平台。它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的。

  Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具。

  官网地址:http://www.cydiasubstrate.com/

  Demo地址:https://github.com/zencodex/cydia-android-hook

  官方教程:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1

  SDK下载地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip


  二、Substrate几个重要API介绍


  MS.hookClassLoad


  函数原型:void hookClassLoad(String name, MS.ClassLoadHook hook);

  该方法实现在指定的类被加载的时候发出通知。因为一个类可以在任何时候被加载,所以Substrate提供了一个方法用来检测用户感兴趣的类何时被加载。

图1.jpg


  MS.hookMethod

  该API允许开发者提供一个回调函数替换原来的方法,这个回调函数是一个实现了MS.MethodHook接口的对象,是一个典型的匿名内部类。它包含一个invoked函数。


  函数原型:

  void hookMethod(Class _class,Member member, MS.MethodHook hook, MS.MethodPointer old);

  void hookMethod(Class _class,Member member,MS.MethodAlteration alteration);

  参数描述

  (一)

 图2.jpg

  (二)

图3.jpg


  建议开发者使用第二种方式,这种方式使用起来简单并且很少出错,不需要一个单独的MS.MethodPointer类实例。


  三、使用方法

  下面以官网的一个实例来说明cydia substrate的使用方法。该实例是实现将多个接口组件颜色修改为紫罗兰色。

  需要安装:http://www.cydiasubstrate.com/download/com.saurik.substrate.apk


  步骤一:创建一个空的Android工程。由于创建的工程将以插件的形式被加载,所以不需要activity。将SDK中的substrate-api.jar复制到project/libs文件夹中。


  步骤二:配置Manifest文件

  (1)需要指定权限:cydia.permission.SUBSTRATE

  (2)添加meta标签,name为cydia.permission.SUBSTRATE,value为下一步中创建的类名.Main


<manifest<span=""> xmlns:android="http://schemas.android.com/apk/res/android"> </manifest<>
<application>
<meta-data<span=""> android:name="com.saurik.substrate.main" </meta-data<>
android:value=".Main"/>
<uses-permission android:name="cydia.permission.SUBSTRATE"/>

 

  步骤三:创建一个类,类名为Main。类中包含一个static方法initialize,当插件被加载的时候,该方法中的代码就会运行,完成一些必要的初始化工作。

  1.  import com.saurik.substrate.MS;


public class Main {
static void initialize() {
// ... code to run when extension is loaded
}
}


  步骤四:为了实现HOOK,达到修改目标类中的代码的目的,我们需要得到目标类的一个实例,如示例中的resources。


public class Main {
static void initialize() {
MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() {
public void classLoaded(Class resources) {
// ... code to modify the class when loaded
}
});
}
}

   

  步骤五:通过MS.MethodHook实例实现原代码的修改。

  为了调用原来代码中的方法,我们需要创建一个MS.MethodPointer类的实例,它可以在任何时候运行原来的代码。

  在这里我们通过对原代码中resources对象原始代码的调用和修改,将所有绿色修改成了紫罗兰色。


public void classLoaded(Class resources) {
Method getColor;
try {
getColor = resources.getMethod("getColor", Integer.TYPE);
} catch (NoSuchMethodException e) {
getColor = null;
}
if (getColor != null) {
final MS.MethodPointer old = new MS.MethodPointer();
MS.hookMethod(resources, getColor, new MS.MethodHook() {
public Object invoked(Object resources, Object... args)
throws Throwable
{
int color = (Integer) old.invoke(resources, args);
return color & ~0x0000ff00 | 0x00ff0000;
}
}, old);
}
}

   

  安装运行,重启系统后发现很多字体颜色都变了。如下图所示:


最后一张图.jpg



作者:搜狗测试 臧亚敬  

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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   IEEE Spectrum 出炉了 2022 年度最受欢迎编程语言排名。该排名最初由数据记者 Nick Diakopoulos 于 2013 年创建,今年是第九届。当前版本由 IEEE Spectrum 高级编辑 Stephen Cass 维护,并得到 Prachi Patel 和 Michael Novakovic 的开发支持。  作为业内比较权威的交互语言排行榜,本次排名结合了包括谷歌搜索、推特、Stack Overflow、Reddit、IEEE、GitHub 等 8 个来源的 9 项指标,共上榜了 57 种语言。关于指标,例如在 Stack Overflow 中,程序员可以在其中询...
            0 0 496
            分享
          • 工作中遇到了这样的场景,一名测试人员需要对多台移动设备进行回归测试,如何提高测试效率呢?那肯定离不开自动化啦,那有没有现成的开源工具可以支持移动端的自动化呢?有,sonic!下面阿常就来和大家分享一下 Sonic 云真机测试平台部署经验——由阿常同事整理:首先是环境准备,请看如下列表,供参考~环境准备设备:Macbook ProSonic:1.4.0-releaseMySql:5.7.27Docker:20.10.12Java:16.0.1Appium:1.22.2ADB:1.0.41Node.js:v17.4.0ChromeWebdriver:98.0.4758.102tidevice:0....
            0 0 960
            分享
          •   在日常测试工程中,不管是功能测试、接口测试、UI测试等,其实本质都是对应用程序的数据进行增删改查操作。开发人员设计好数据库模型后,各个业务功能都依赖于对该模型进行操作,从而展现出不同的数据给用户。  在面试或者是写简历时,对数据库只能一句话概括“掌握数据库的增删改查”。今天来给大家带大家了解下web应用程序的数据库设计和相关操作,也就是学习下数据库是如何设计和生成的。  在开始之前,首先要知道常用的web应用框架有django和flash框架,两者的区别可以简单形容为django像是精装房,大而全,功能极其强大,是Python web框架的先驱,用户多,第三方库极其丰富,适合企业...
            15 15 2065
            分享
          •   受博为峰邀请,我简单分享下,从大学毕业设计实习起至今的个人职业发展历程、工作经验和主要面试经历,希望能给大家带来一些启迪和帮助。  职业发展规划  考虑清楚自己想要什么?  如同很多刚进入职场的新人,我在一开始也没有特别清晰的个人职业规划。如果你在校有很好的课题研究机会,好好把握,大都能通过专业领域的导师或教授们,拿到一份名企的实习机会。  就在临近毕业前夕,我仍然不知道,或者说不敢去主动寻找企业、公司,选择向往的地方去实习。万幸的是,我大专毕业后进入了国有单位实习,最后有幸能够留下来开展职业生涯的第一份工作,对于当时的条件和市场来说绝对是香饽饽,至今也是很多人梦寐以求的。  当时设定好的...
            0 0 1280
            分享
          •   假如你刚到公司参加实习,学习使用Jmeter进行网页端接口压力测试,那这篇文章一定要看。  软件介绍  可以直接从网上下载相关压缩包,解压后在bin目录下找到jmeter.bat文件打开使用。  打开后界面:  可在Options/ChooseLanguages里切换语言,方便使用。  使用流程  1、创建线程组  右键TestPlans选择添加/线程(用户)/线程组:  已创建好好线程组,进入线程组设置页面:  各参数意义:  1.线程数:并发数。如图设置50为模拟50个用户进行压力测试。  2.Ramp-Up Period (in seconds):并发用户加载时间。图中设置为1表示一...
            0 0 736
            分享
      • 51testing软件测试圈微信