Cydia Substrate hook框架初探

发表于:2016-10-24 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:搜狗测试 臧亚敬    来源:51Testing软件测试网原创

  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提供了一个方法用来检测用户感兴趣的类何时被加载。
  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);
  参数描述
  (一)
 
 (二)
  建议开发者使用第二种方式,这种方式使用起来简单并且很少出错,不需要一个单独的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);
}
}
  安装运行,重启系统后发现很多字体颜色都变了。如下图所示:
版权声明:本文出自《51测试天地》原创测试文章系列(四十三)投稿。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号