我们使用我们的签名分发使用批处理文件(java -jar ..)运行的商业jar。使用JNLP触发 NOT 。它还包含其他第三方库。如果任何恶意的人替换任何java类,jar会因为签名不匹配而停止运行。但如果他从jar中删除了 MANIFEST 文件,则不再进行检查。当更换任何类时,我们如何防止程序运行?一个选项可能是检查java源中的清单文件,如Verifying Jar Signature和How to verify a jar signed with jarsigner programmatically所述,例如
jarFile jar = new JarFile(new File("path/to/your/jar-file"));
// This call will throw a java.lang.SecurityException if someone has tampered
// with the signature of _any_ element of the JAR file.
// Alas, it will proceed without a problem if the JAR file is not signed at all
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF"));
Manifest manifest = new Manifest(is);
并检查CodeSigners等。
manifest.getCodeSigners();
但是当试图破坏jar的人执行反编译(例如使用jad)时会发生什么?为了防止反编译,我们应用了一些混淆器,但在反编译时,即使方法名称已被更改,我们也可以看到逻辑。所以混淆是不够的。
你的建议是什么?编写复杂的符号检查代码是一种很好的方法,例如使用反射api,添加乱码数据,使用goto添加一些spagetti代码,还是可以建议不同的程序来防止显式篡改以及使反编译器失败?我检查了混淆器中的选项,但是我们可以在代码编写阶段做些什么来改进和加强混淆步骤?
答案 0 :(得分:1)
只要我知道,直到现在还没有解决这个问题的完美解决方案。你可以阅读this,问题是相似的。到目前为止,混淆可能是最好的+轻松的努力。我的意思是,不仅通过使用代码混淆器,而且您编写了这样的奇怪逻辑来隐藏您的算法,因此破解者无法轻松跟踪逻辑和方法调用。