cydia java_使用Cydia Substrate 从Native Hook Android Java世界

手机端配置见之前文章。

一、建立工程

建立一个Android工程。不需要创建默认的Activity。修改AndroidManifest.xml如下:

uses-permission必须添加。这告诉Cydia_Substrate核心层,当前工程为Cydia_Substrate HOOK工程(大概就这意思)。

新建jni文件夹,用于编写so文件代码,NDK开发包建议下载版本较高的(低版本的需要cydia),我这里用的是R10。

从官网或者从这里下载cydia_substrate开发包。

将对应平台的libsubstrate-dvm.so和libsubstrate.so文件复制到jni目录。

将substrate.h文件复制到jni目录。

创建一个cpp文件,我这里创建Main.cy.cpp,参考代码如下:

#include MSConfig(MSFilterExecutable,"/system/bin/app_process")static jint (*_Resources$getColor)(JNIEnv *jni, jobject _this, ...);static jint $Resources$getColor(JNIEnv *jni, jobject _this, jint rid) {

jint color=_Resources$getColor(jni, _this, rid);return color & ~0x0000ff00 | 0x00ff0000;

}static void OnResources(JNIEnv *jni, jclass resources, void *data) {

jmethodID method= jni->GetMethodID(resources, "getColor", "(I)I");if (method !=NULL)

MSJavaHookMethod(jni, resources, method,&$Resources$getColor, &_Resources$getColor);

}

MSInitialize {

MSJavaHookClassLoad(NULL,"android/content/res/Resources", &OnResources);

}

简单解释一下:

MSConfig(MSFilterExecutable, "/system/bin/app_process")是告诉cydia_substrate需要HOOK哪个模块

_Resources$getColor是存旧函数地址。

$Resources$getColor是自定义的新的函数地址。HOOK后不会执行旧函数了,而直接进入自定义的新函数。

为了保证功能正确,自定义函数一般会调用旧函数。

jint color =_Resources$getColor(jni, _this, rid);return color & ~0x0000ff00 | 0x00ff0000;

这两句就是先调用旧函数,然后处理函数返回值。

MSInitialize是最初执行处。

MSJavaHookClassLoad(NULL, "android/content/res/Resources", &OnResources);

这句的意思是当加载android/content/res/Resources类时调用OnResources函数。

static void OnResources(JNIEnv *jni, jclass resources, void *data) {

jmethodID method= jni->GetMethodID(resources, "getColor", "(I)I");if (method !=NULL)

MSJavaHookMethod(jni, resources, method,&$Resources$getColor, &_Resources$getColor);

}这里就是当加载android/content/res/Resources时查找getColor函数。然后对其HOOK。

Android.mk文件配置如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:= substrate-dvm

LOCAL_SRC_FILES := libsubstrate-dvm.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:=substrate

LOCAL_SRC_FILES :=libsubstrate.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE :=Main.cy

LOCAL_SRC_FILES := Main.cy.cppLOCAL_LDLIBS := -llog

LOCAL_LDLIBS+= -L$(LOCAL_PATH) -lsubstrate-dvm -lsubstrate

include $(BUILD_SHARED_LIBRARY)

最终jni文件夹内的文件如下:

44f945800c9a54d2019567626eabf05b.png

二、编译代码

ndk环境配置好后,在cmd下进入jni目录。然后输入ndk-build。如果环境配置成功会有如下输出:

a78a62807df898399554b72fae7a9328.png

工程libs目录下会有对应平台的lib文件。

三、代码效果

7814128f1a23bd72303e5af46bce3b41.png

四、相关下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值