• 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软件测试网原创

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 从当初的开发,到后来的功能加自动化测试,觉得自己需要去接触一些新的东西。从9月份开始,开始有个新的团队,专门负责网站的性能提高,于是,就跟老大申请了去支持这个team。首先,我这里说的性能测试,不是传统意义上的压测,所以我们tech lead一直在纠正我,不叫performance testing,而是叫site speed testing。国外的网站不会像淘宝会有那么大的流量,所以我们不是很看重压测,有监控就够了。做网站速度测试之前,首先我们要弄明白我们在意的metrics,那么有哪些关键的metrics呢?Metrics1.速度指标(SpeedIndex)速度指数是一个计算的指标,用来衡量...
            1 3 3103
            分享
          •   契约维护的难题  如今微服务凭借其灵活、易开发、易扩展等优势深入人心,不同服务之间的集成和交互日渐繁多且复杂。这些服务之间交互的方式是多样的,常见的有 HTTP 请求和消息队列。在它们交互的过程中,会有服务的版本演进,交互信息的格式或方式就会产生变化,前后版本的接口可能并不兼容,甚至开发环境经常会宕机更新,加之不同服务的开发进度有快有慢,各团队的优先级有高有低,在开发过程中,服务间交互方式的匹配性就成了一个问题。  这里,不同团队之间,对服务间如何进行发送和接受消息所能达成的共同理解,我们称之为契约 (contract)。如何采用一个合理的机制,维护服务间契约,使服务提供方和消费房能够在不...
            0 0 504
            分享
          •   印度《经济时报》报道称,富士康正在评估投资约 10 亿美元(备注:当前约 70.2 亿元人民币)在泰米尔纳德邦设立一个智能手机显示屏模块组装工厂,主要为苹果 iPhone 提供服务。  消息人士表示,富士康的模式将是即使其他合同制造商 —— 例如 Pegatron 或 Tata Electronics—— 也可以使用该工厂的组件,而无需采用中国进口的组装模块。  知情人士还提到,虽然没有固定的时间规划,但该公司希望该工厂“尽快”投入运营。作者:问舟原文链接:IT之家(ithome.com)
            0 0 289
            分享
          • 早就听过CPU火焰图的强大功能,也听过几个火焰图工具,今天终于开始尝试使用CPU火焰图生成工具。奈何由于各种原因,Intellij自带的火焰图插件并不能用,着实让人不快。故而找到一个async-profiler分析工具作为替代品。当时正在测试随机数性能的,所以就用了一个动态QPS模型的Case,学习了async-profiler的使用。很意外地发现了一个性能可以优化的地方。经过尝试,CPU使用率降低了0.24%,也算是第一个成果了。async-profiler这个工具安装和使用教程,可以网上搜一下,建议去Github仓库看看Wiki,这里我就不多说。Case code下面是Case的代码,用了...
            0 0 1096
            分享
          •   应用场景  测试用例一遍一遍的执行,没有新意了,没有Bug了。突然来了一位小白,同样的用例就“逮”着了一只Bug。一回放,原来手误,输入了不同的测试数据,误打误撞。  这也证明了测试数据在测试执行中起到的关键作用。输入的数据不同,得到的结果就不一样。Bug是与你擦肩而过,还是不期而遇呢?有时候还真的就在你手指轻弹、输入数据的一瞬间。  今天的强调无非是想给大家介绍一款好用的API Mock 服务器 工具,以便大家在测试中更加方便地配置自己的动态数据。  温馨提示  如果您要按着示例一起做,请务必配置如下工具。  结尾的用例主要是结合Rest-Assured来介绍Json Serv...
            14 14 1756
            分享
      • 51testing软件测试圈微信