我对混淆有问题。为了获得更好的想象力:
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");
...有没有办法动态设置方法名?
JNI支持两种绑定本机方法的方法。简单的一种是按名称完成的,不能用于混淆的类和方法名称。
另一种方法是从库中的JNI\u OnLoad()调用RegisterNatives。必须为此技术的每个类准备一个本机方法表:
Java:
package a.b;
public class C {
public native int nativeMethod();
}
C:
static jint cnm(JavaEnv*, jobject) {
return 42;
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env;
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
return JNI_FALSE;
}
std::string className = "a/b/C"; // may be changed by ProGuard
std::string methodName = "nativeMethod"; // may be changed by ProGuard
jclass cls = env->FindClass(className.c_str());
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
return JNI_ERR;
}
assert(cls);
JNINativeMethod C_methods[] = {
{ methodName.c_str(), "()I", reinterpret_cast<void*>(&cnm) }
};
env->RegisterNatives(cls, C_methods, sizeof(C_methods)/sizeof(C_methods[0]);
return JNI_VERSION_1_6;
}
这个小片段表明,您实际上可以用ProGuard生成的实际模糊名称替换这些名称。简单的方法是相信ProGuard混淆是确定性的,并在发布Java构建完成后手动从映射文件中复制名称。自动化可能需要调整gradle构建,因为通常C是在Java之前编译的,但这是可能的。
如果经过模糊处理的方法也引用了一些经过模糊处理的类,那么任务将变得更具挑战性。
用于混淆的RealsterNative()的最大优势在于,它不仅允许您更改类和方法名称,而且本机方法实现在本机库之外也不可见。例如,在上面的示例中,cnm是静态
并且不容易被发现。
基于AndrewJC的回答,如果您的应用程序是静态编程语言,您还可以使用@JvmName
注释而不是使用包装器方法,例如:
object Native {
@JvmName("a")
private external fun rotateRGBA(rgb: Int, w: Int, h: Int): Int
}
// rotateRGBA
extern "C" int Java_mypackage_Native_a(JNIEnv *env, jclass, int rgb, int w, int h);
现在,您可以使用本机调用Kotlin中的JNI方法。rotateRGBA(0,200,400)但在编译时,Kotlin会自动将方法调用重命名为:本机。a
。
在研究这个完全相同的问题时,我遇到了一个我认为合理的解决方案。不幸的是,该解决方案不会按照要求自动混淆本机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客户端继续调用本机。rotateRGBA()与以前一样,完全不受重命名的影响。
有趣的是,新的Native.rotateRGBA方法不再是本机的,因此可以由ProGuard随意重命名。结果是,无论是在Dalvik还是本机方面,RotateRGBA这个名称都从混淆的代码中完全消失了。更重要的是,ProGuard优化了包装器方法,从而消除了包装本机调用对性能的(可以忽略不计的)影响。
结论:从混淆代码(Dalvik字节码和本机库)中消除了JNI方法名称,对易读性的影响最小,对性能没有影响。
来源:模糊JNI表层
我仍在寻找一种能够自动混淆本机Java代码和相关JNI的工具。
我一直在摆弄Proguard配置,我想测试只是为了优化 但我仍然会遇到这样的错误: java.lang.IllegalArgumentExc0019:找不到[org/apache/log/log4j/core/jackson/Log4jXmlMoules](有1个已知的超级类)和[org/apache/log/log4j/core/jackson/Log4jJsonMoules](有4个已知的超级
Powershell的混淆目前已经使用的越来越多,国内外也有了较多的研究,在今年的BH大会上也有对应的议题,关注点是反混淆,那么里面的一些姿势很值得我们学习,我们提供一些混淆实例,来让大家对于PS的混淆做到一个初步了解,也为防御混淆提供一些思路。 实例 在混淆之前,先看看powershell编码执行的方式。 -EC,-EncodedCommand,-EncodedComman,-EncodedCo
除了传统的面向对象继承方式,还流行一种通过可重用组件创建类的方式,就是联合另一个简单类的代码。 你可能在Scala等语言里对mixins及其特性已经很熟悉了,但它在JavaScript中也是很流行的。 下面的代码演示了如何在TypeScript里使用混入。 后面我们还会解释这段代码是怎么工作的。 // Disposable Mixin class Disposable { isDispos
OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。这也是混合这一名字的出处,我们混合(Blend)(不同物体的)多
除了传统的面向对象继承方式,还流行一种通过可重用组件创建类的方式,就是联合另一个简单类的代码。 你可能在Scala等语言里对mixins及其特性已经很熟悉了,但它在JavaScript中也是很流行的。 混入示例 下面的代码演示了如何在TypeScript里使用混入。 后面我们还会解释这段代码是怎么工作的。 // Disposable Mixin class Disposable { isD
问题内容: 我正在寻找一个好的Java混淆器。 我已经对以下Java混淆器进行了初步研究:proguard,yguard,retroguard,dasho,alatorari,jshrink,smokescreen,jobfuscate,marvin,jbco,jode,javaguard,jarg,joga,cafebabe,donquixote,mwobfu,bbmug,zelix klass