JNI防范混淆 [英] JNI proguard obfuscation

查看:25
本文介绍了JNI防范混淆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有混淆方面的问题。更好的想象力:

Java代码

class JniTest...

public void test()
{
    //some code
}

public void runJniCode()
{
    //here I call native code
}

本机代码

JNIEXPORT void JNICALL
Java_path_to_class_test(JNIEnv* env, jobject  obj)
{
    //here I call test method from Java

}

一切正常,直到我想发布一个模糊版本。此类中的Java类(例如JniTest)和方法test的名称通过proGuard重命名为"a"和"a()"(这可能不总是相同的),但在本机代码中方法和类的原始名称保持不变,因为它被硬编码为字符串,如:

jmethodID mid = env->GetMethodID(cls, "test", "someSignature");

.有没有办法动态设置方法名称?

推荐答案

在研究这个完全相同的问题时,我遇到了一个我认为合理的解决方案。不幸的是,该解决方案并没有按照要求自动混淆原生Java代码和JNI方法,但我仍然认为它值得共享。

引用来源:

我在这里介绍一个简单的技巧,它允许混淆JNI层,在Java和本机端将方法名称重命名为无意义的名称,同时保持源代码的相对可读性和可维护性,并且不影响性能。

让我们考虑一个例子,初始情况:

class Native {
    native static int rotateRGBA(int rgb, int w, int h);
}

extern "C" int Java_pakage_Native_rotateRGBA(JNIEnv *env, jclass, int rgb, int w, int h);

在上面的示例中,ProGuard无法混淆方法名称rotateRGBA,该名称在Java端和本机端仍然可见。

解决方案是在源代码中直接使用无意义的方法名称,同时注意最大限度地降低代码的可读性和可维护性。

class Native {
    private native static int a(int rgb, int w, int h); //rotateRGBA

    static int rotateRGBA(int rgb, int w, int h) {
        return a(rgb, w, h);
    }
}

// rotateRGBA
extern "C" int Java_pakage_Native_a(JNIEnv *env, jclass, int rgb, int w, int h);

JNI方法被重命名为无意义的a。但Java端的调用被有意义地命名为rotateRGBA的方法包装。Java客户端继续像以前一样调用Native.rotateRGBA(),完全不受重命名的影响。

有趣的是,新的Native.rotateRGBA方法不再是本机的,因此ProGuard可以随意重命名。其结果是,在Dalvik和本机端的混淆代码中,名称rotateRGBA完全消失。此外,ProGuard还优化了包装器方法,从而消除了包装本机调用对性能的影响(可以忽略不计)。

结论:从混淆代码(Dalvik字节码和本机库)中删除了JNI方法名称,对可读性的影响最小,对性能的影响也不大。

来源:Obfuscating the JNI surface layer

我仍在寻找能够自动混淆本机Java代码和相关JNI的工具。

这篇关于JNI防范混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆