zoukankan      html  css  js  c++  java
  • 使用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。

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

    将对应平台的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")
    是告诉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.cpp
    LOCAL_LDLIBS := -llog
    LOCAL_LDLIBS += -L$(LOCAL_PATH) -lsubstrate-dvm -lsubstrate
    
    include $(BUILD_SHARED_LIBRARY)

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

    image

    二、编译代码

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

    image

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

    三、代码效果

    image

    四、相关下载

    代码

  • 相关阅读:
    可变参数的宏
    解决Visio复制绘图时虚框变实框的问题
    CSS选择器:伪类(图文详解)
    CSS属性:背景属性(图文详解)
    CSS样式----浮动(图文详解)
    CSS盒模型详解(图文教程)
    CSS样式----CSS样式表的继承性和层叠性(图文详解)
    Android UI组件----AppWidget控件入门详解
    Android UI控件----ExpandableListView的基本用法
    ListView中动态显示和隐藏Header&Footer
  • 原文地址:https://www.cnblogs.com/Reyzal/p/5441093.html
Copyright © 2011-2022 走看看