Cydia Substrate hook框架初探

 

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

1、原理介绍android

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

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

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

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

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

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

2、Substrate几个重要API介绍函数

MS.hookClassLoad 工具

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

该方法实如今指定的类被加载的时候发出通知。由于一个类能够在任什么时候候被加载,因此Substrate提供了一个方法用来检测用户感兴趣的类什么时候被加载。

     

  

参数

  

  

描述

  

name

包名+类名,使用java.符号

hook

MS.ClassLoadHook的一个实例,当这个类被加载的时候,它的 classLoaded 方法会被执行。

 

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);

参数描述

(一)

参数

描述

_class

加载的目标类,为classLoaded传下来的类参数

member

经过反射获得的须要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测).

hook

MS.MethodHook的一个实例,其包含的invoked方法会被调用,用以代替member中的代码

(二)     

  

参数

  

  

描述

  

_class

加载的目标类,为classLoaded传下来的类参数

member

经过反射获得的须要hook的方法(或构造函数). 注意:不能HOOK字段 (在编译的时候会进行检测).

alteration

An instance  of MS.MethodAlteration whose boxedinvoked method   will be called instead of member. This instance will also be  filled in  using information from   the original  implementation, allowing  you to use invoke to call the  original method implementation.

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

3、使用方法

下面以官网的一个实例来讲明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标签,namecydia.permission.SUBSTRATEvalue为下一步中建立的类名.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); 

    } 

 

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



 

 

 

 

 

 

 

 

 

 


本文分享自微信公众号 - 搜狗测试(SogouQA)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索