前言
我们以前介绍过Xposed,这个只可以Hook java层,如果要hook native层就要使用InlineHook了,以前的文章都有提到。今天介绍一个既可以Hook java层又可以Hook native层的框架,就是Cydia Substrate。
环境
安装Cydia Substrate apk
使用adb install安装后,进入到app
1、点击Link Substrate Files
2、获取root权限
3、重启设备
如下图说明安装成功了
image.png
java层Hook
创建项目后把so文件和jar文件拷贝到指定目录,jar添加进来
image.png
新建一个Hook的入口类HookTest.java
HookTest.java
package com.example.cydiasubstratehook;
import java.lang.reflect.Method;
import android.util.Log;
import com.saurik.substrate.MS;
public class HookTest {
public static final String SHARK = "Shark";
/**
* substrate 初始化后的入口
*/
static void initialize() {
// Hook System Color
//先hook 类加载时
//参数一是类名 参数二是实现MS.ClassLoadHook的类
//在classLoaded中完成业务逻辑
MS.hookClassLoad("android.content.res.Resources",
new MS.ClassLoadHook() {
@SuppressWarnings({ "unchecked", "rawtypes" })
public void classLoaded(Class> resources) {
Method getColor;
try {
//从这个类获取getColor方法对象
getColor = resources.getMethod("getColor",
Integer.TYPE);
} catch (NoSuchMethodException e) {
getColor = null;
}
if (getColor != null) {
//保存原来的方法
final MS.MethodPointer old = new MS.MethodPointer();
//hook方法
MS.hookMethod(resources, getColor,
new MS.MethodHook() {
//hook方法的业务逻辑
public Object invoked(Object resources,
Object... args) {
try {
//调用原来的方法
int color = (Integer) old