JNI proguard obfuscation(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防范混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:JNI防范混淆
基础教程推荐
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01