【问题标题】:jar doesn't run after obfustication with ProGuard使用 ProGuard 混淆后 jar 不运行
【发布时间】:2016-11-11 19:56:58
【问题描述】:

我在 jar 文件中有应用程序。我尝试用 ProGuard 来混淆它。在我的 ProGuard 配置文件中,我添加了:

-keep public class forms.Login{
    public static void main(java.lang.String[]);
}

混淆后映射文件显示:forms.Login -> forms.Login:...void main(java.lang.String[]) -> main...

我运行我的应用程序 java -cp pathToObfusticatedJar.jar forms.Login,但出现错误:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 52
Exception Details:
  Location:
    forms/Login.main([Ljava/lang/String;)V @0: invokestatic
  Reason:
    Expected stackmap frame at this location.
  Bytecode:
    0x0000000: b800 904c 2bbe 3d03 3e1d 1ca2 0026 2b1d
    0x0000010: 323a 0412 0619 04b6 0093 b600 6499 000e
    0x0000020: 1904 b600 92b8 0091 a700 0984 0301 a7ff
    0x0000030: dba7 0050 4c12 0db6 0061 b800 68b2 003f
    0x0000040: 012b b600 69a7 003c 4c12 0db6 0061 b800
    0x0000050: 68b2 003f 012b b600 69a7 0028 4c12 0db6
    0x0000060: 0061 b800 68b2 003f 012b b600 69a7 0014
    0x0000070: 4c12 0db6 0061 b800 68b2 003f 012b b600
    0x0000080: 69bb 0013 59b7 005a b800 5fb1
  Exception Handler Table:
    bci [0, 49] => handler: 52
    bci [0, 49] => handler: 72
    bci [0, 49] => handler: 92
    bci [0, 49] => handler: 112

        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

有人能解释一下我做错了什么吗?我是否必须更改 proguard 配置或以某种方式在 cmd 中设置 main 方法? 另外,我相信我已经设置保留我的 public static void main 方法,但 Proguard 将它变为现实。为什么?如何让它保持不变?

【问题讨论】:

  • 别这样。即使是财富 100 强公司也不会混淆他们的 JAR。
  • 我想以某种方式保护我的应用程序,因为我的远程数据库中有登录名和密码。我使用休眠配置,应用中有 hibernate.connection.username 和 hibernate.connection.password。
  • 如果您需要在代码中存储用户名和密码,那么您做错了。让您的应用程序用户在网页上进行身份验证并生成某种令牌供用户使用,而不是用户名和密码。通过一些 Web API 而非直接将数据汇集到数据库中。

标签: java proguard


【解决方案1】:

您似乎禁用了preverification,这是在 Java 7+ 上运行 Java 应用程序时所必需的。

检查您的配置并删除-dontpreverify

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多