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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   51Testing软件测试网正在收集测试行业问卷结果,如果你也想为测试行业的前景助力,就点击下方的链接提交答案吧,还有精美礼品等你拿(测试课程五选二)。链接:http://vote.51testing.com/  本人在今年互联网大环境如此严峻的情况下,作为一个刚毕业不到一年的初级测试,赶在“金九银十”依然拿到了一些面试机会,并且成功拿下4家公司的offer,其中不乏互联网大厂,而且最高总包给到了接近double(无炫耀的意思 〒▽〒)~  确定好要签的offer后,我决定来复盘一下这波求职的成功原因,也给身处迷茫期的测试朋友提供一个参考,同时抛砖引玉~  其实我认为最根本的原因是我迅速完...
            0 0 321
            分享
          •   去年下半年,公司空降了一位总监,他提出了一个观点:提高交付质量和交付速率!顿时茅塞顿开,对呀,我们工作的目的不就是提高交付的软件系统质量,以及提高效率!  昨晚听同行分享后,思考总结了一下,针对如何提高交付的软件应用质量和速率这个问题,发现自己还有一些细节的地方没考虑到,果然还是经验不足,学习成长的道路,任重而道远!!!  下面的内容,重新整理了大佬分享的几个观点,结合自己的一些想法,算是做一个参考吧。。。  一、需求  1、需求评审  为什么要需求评审?原因有下面几点:  ①、熟悉业务,由产品或者业务讲解需求,好做到心中有数,不至于到开发测试阶段暴露出由于业务不熟悉导致的问题;  ②、多...
            0 0 313
            分享
          • 测试用例(Test Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。 测试用例(Test Case)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。 不同类别的软件,测试用例是不同的。不同于诸如系统、工具、控制、游戏软件,管理软件的用户需求更加不统一,变化更大、更快。笔者主要从事企业管理软件的测试。因此我们的做法是把测试数据和测试脚本从测试用例中划分出来。测试用...
            12 12 1191
            分享
          • 游戏测试是测试的一种,逃不开软件测试的魔爪。所以——游戏测试的目的:发现游戏中存在的缺陷。游戏测试分两种:大型网络游戏和手游。大型网络游戏网游一般大型的网络游戏中测试都分很多个阶段:前期测试:内部测试 内部封测 综合版本不对外测试 限量玩家内测中期测试:公开测试 不删号测试 不删号测试2期 免费公测后期测试:新版本公测 全面公测 正式公测 完全上线在测试中,主要是对以下方面进行测试。压力测试:包括服务器的承载能力、网络运行环境、数据库细分、并发量、最大负载等等。内容测试:一是游戏本身剧情、副本内容、交易系统等等;二是玩家交互,BUG的调整。手游手游的测试阶段相对来说简单一些,进行如下测试:安装...
            0 0 1514
            分享
          • 在提交bug的模板当中,有一项必填项是该bug的发现阶段。如果是当前测试的迭代版本发现的问题,我们可以认定是新引入的,或许是开发修改其他问题把这块改坏了,或许是环境有所变化导致;如果这个问题在上一个迭代就已经存在,但是上一个迭代没有提交这个问题,那么就认定为遗留问题。新引入问题和遗留问题的判断大抵如此,但是,并不是所有遗留问题都是测试原因,很有可能上个版本因为某些问题阻塞,导致部分模块不能测试,这种遗留问题就不是人为能决定的了。版本测试或者系统测试期间,对于测试人员的最终考核有一项重要指标,就是bug遗留率。有时为了确认bug是否遗留,甚至会安排版本回退,安装上一个迭代版本的包来验证这个问题。...
            1 0 3752
            分享
      • 51testing软件测试圈微信