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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   背景介绍  一直以来,性能测试是被一部分人遗忘,又让另一部分人无可奈何的东西。在绝大部分的创业公司,性能测试基本上都是被遗忘的,他们认为功能测试和稳定性测试才是重点,而在中等规模的公司中一部分测试人员考虑进行性能测试,却无从下手。  这个系列,从 baidu 测试工程师的工作实践出发,介绍移动端性能测试的通用方法和结合产品特点的不同侧重。  随着流量费用的降低,越来越多的人开始在公交地铁等移动场景使用视频应用。视频类的应用会更多关注播放流畅度、下载等性能指标,下面介绍的是百度视频的性能测试方法。  百度视频是第三方视频资源聚合类产品,主要提供用户在线播放、离线下载各种视频服务,提供 PC ...
            15 15 2002
            分享
          •   前言  最近双11活动,发现阿里云有服务器活动,就买了一个,今天主要给大家介绍下,如何通过通过客户端进行连接linux服务器后,进行简单的操作。  配置服务器信息  打开浏览器登录到阿里云服务器页面上,找到个人服务器实例页面,这里如果购买完服务器的小伙伴就会出现自己的服务器列表。  重置服务器密码  点击服务器列表名称进入服务器基本信息页面中,点击重置密码,进入到服务器重置密码页面中,在新密码中输入对应的密码,登录名输入root。  修改服务器名称  继续在服务器基本信息页面中,点击实例名称后的重命名进行修改服务器名称内容,修改完成后点击确认按钮。  登录服务器  通过上面操作进行配置完服...
            0 0 522
            分享
          •   随着科技时代的进步和智能手机的普及,现代人离不开手机已经是常态化,一旦手机不在身边便会失去安全感。提到安全一词,我们在使用手机app软件时,安全至关重要,软件里包含的个人信息、资料等等都和安全挂钩,那么在软件测试中移动app安全测试应该怎么做呢?  1、代码审计  通过代码走读的方式测试源代码的安全性,常用的代码检查方法有数据流、控制流、信息流等,通过这些测试方法与安全规则库进行匹配,进而发现潜在的安全漏洞。静态代码检查方法主要是在编码阶段进行测试,尽可能早地发现安全性问题。  2、动态渗透测试  需要借助工具或手工来模拟的输入方式,对应用软件进行安全性测试,进而发现系统中的安全性问题。该...
            0 0 228
            分享
          •        在俄罗斯入侵乌克兰后停止交易一年后,五家与俄罗斯有关的互联网公司将正式从美国证券交易所除名。这五家公司中最突出的是Yandex,一家有25年历史的科技公司,通常被称为"俄罗斯的Google",因为它的产品涵盖了搜索、电子商务、广告、地图、交通等等。       2011年5月,Yandex首次在纳斯达克上市,其母公司是在荷兰注册的Yandex N.V.公司。此后,三年后在莫斯科交易所进行了二次上市。作为一家上市公司,Yandex一直表现良好,在2021年11月达到历史最高点,市值3...
            0 0 2455
            分享
          •   摘 要  喂,你那个刚测好的页面怎么又出现了bug?这里怎么交互几次页面重绘就出了问题?你到底对前端测试用例的覆盖率有几分把握,真的没有测试遗漏嘛?对于这些疑问,正在看文章的你如果能够轻松应对,那么请关掉屏幕,本文与你关系不大,出去运动一下吧。但如果你也有类似的困惑,并且正在寻找衡量js代码测试完整度的方法,那么请继续阅读,文中介绍的js覆盖率工具会让你在完善前端测试用例的征途上,走的轻松一些。  正 文  众所周知,前端测试需求多、改动大,业务逻辑复杂又紧密,往往首轮设计的测试用例并不能完全覆盖所有的功能点和diff代码。这时,就需要代码覆盖率工具帮助我们发现测试未能覆盖到的代码分支和逻...
            1 0 1785
            分享
      • 51testing软件测试圈微信