使用Cydia Substrate 从Native Hook Android Java世界
这里介绍了如何使用Cydia Substrate Hook安卓Java世界。这篇文章介绍如何从Native中Hook 安卓Java世界。
手机端配置见之前文章。
一、建立工程
建立一个Android工程。不需要创建默认的Activity。修改AndroidManifest.xml如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.cydia_native_hook_java" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <application android:hasCode="false"> </application> <uses-permission android:name="cydia.permission.SUBSTRATE"/> </manifest>
uses-permission必须添加。这告诉Cydia_Substrate核心层,当前工程为Cydia_Substrate HOOK工程(大概就这意思)。
新建jni文件夹,用于编写so文件代码,NDK开发包建议下载版本较高的(低版本的需要cydia),我这里用的是R10。
将对应平台的libsubstrate-dvm.so和libsubstrate.so文件复制到jni目录。
将substrate.h文件复制到jni目录。
创建一个cpp文件,我这里创建Main.cy.cpp,参考代码如下:
#include <substrate.h> 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")
_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.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.cpp LOCAL_LDLIBS := -llog LOCAL_LDLIBS += -L$(LOCAL_PATH) -lsubstrate-dvm -lsubstrate include $(BUILD_SHARED_LIBRARY)
最终jni文件夹内的文件如下:
二、编译代码
ndk环境配置好后,在cmd下进入jni目录。然后输入ndk-build。如果环境配置成功会有如下输出:
工程libs目录下会有对应平台的lib文件。