【问题标题】:Injecting class into the JNIEnv in android jni在android jni中将类注入JNIEnv
【发布时间】:2022-01-21 23:52:52
【问题描述】:

C++ 代码:

extern "C" JNIEXPORT void JNICALL
Java_com_example_afl_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    
    // env->DefineClass(...)
}

我正在从 Java 端代码调用上述函数:

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        stringFromJNI();  // call cpp function


    }

    public native String stringFromJNI();
}

我的问题是关于 cpp 代码中的 env->DefineClass(...)
如您所见,android VM 将JNIEnv *env 传递给我的本机函数,因此通过使用env 指针,我可以访问我所有的java 类并且我可以使用它们(我可以访问我所有的java 端类并且我可以创建实例对象并做所有事情)。
但是如何访问另一个 apk 中的类并且它位于另一个包名中?
我想反编译目标 apk 并复制该类并使用 env->DefineClass 函数将该类注入我的 env 但我不知道如何完成此任务。
感谢您的任何回复:)

【问题讨论】:

    标签: java android c++ c apktool


    【解决方案1】:

    不可能。安卓does not implement DefineClass

    支持所有 JNI 1.6 功能,但以下例外:
    未实现 DefineClass。 Android 不使用 Java 字节码或类文件,因此传入二进制类数据不起作用。

    即使 有效,您应用的用户也很可能没有访问其他应用程序 .apk 的权限。

    【讨论】:

    • 让我们看的更轻松一些。我们有一个classes.dex 文件,其中包含很多类。我唯一需要的就是将这些类准确地添加到我的JNIEnv 中(甚至不是所有的类实际上我只需要添加 1 个类)。我想一定有办法。
    • 这对于普通的 JNI 是不可能的。或许你可以在Reverse Engineering得到答案...
    • (reverseengineering.stackexchange.com/questions/29745/…) 我在那里等待新的答案!
    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多