当前位置: 首页 > 知识库问答 >
问题:

JavaFX Proguard混淆

时仰岳
2023-03-14

我正在努力解决JavaFX应用程序的模糊问题。以本项目为基础:

java.io.IOException: Can't write [Path\infile.jar] (Can't read [Path\outfile.jar] (Duplicate jar entry [a.class]))

Proguard配置文件:-dontoptimized-dontshrink

-libraryjars 'E:\Prog\jdk-11.0.2\jmods'
-libraryjars 'E:\Prog\javafx-sdk\lib'

# Save meta-data for stack traces
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

# Rename FXML files together with related views
-adaptresourcefilenames **.fxml,**.png,**.css
-adaptresourcefilecontents **.fxml
-adaptclassstrings

# Keep all annotations and meta-data
-keepattributes *Annotation*,Signature,EnclosingMethod

# Keep entry-point class
-keep classpackage.App {
    public static void main(java.lang.String[]);
}

# Keep all classes inside application
-keep,allowobfuscation class package.** {
}

# Keep names of fields marked with @FXML attribute
-keepclassmembers class * {
    @javafx.fxml.FXML *;
}

有人有JavaFX模糊处理的经验吗?

共有1个答案

公西季
2023-03-14

要使Proguard与Java11一起工作,我们需要:

>

  • 最新的Proguard测试版,本例中为Gradle。

    修改构建分级文件以包含proguard任务。

    // 1. Include proguard dependency
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
        }
    }
    
    plugins {
      id 'application'
      id 'org.openjfx.javafxplugin' version '0.0.7'
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
    }
    
    javafx {
        modules = [ 'javafx.controls', 'javafx.fxml' ]
    }
    
    mainClassName = 'org.openjfx.MainApp'
    

    不只是添加proguard任务,我将添加更多的任务,用proguarded任务替换默认的build/类。这有助于检查结果。

    // 2. Add tasks
    
    // 2.1 Clean buildDir before running proguard
    task cleanClasses(type: Delete) {
        delete "${buildDir}/classes/java/main"
        delete "${buildDir}/resources/java/main"
    }
    
    classes.dependsOn(cleanClasses)
    
    // 2.2 Add proguard task
    task proguard(type: proguard.gradle.ProGuardTask, dependsOn: classes) {
        injars project.sourceSets.main.output
        outjars "${buildDir}/proguard/output.jar"
    
        libraryjars project.sourceSets.main.compileClasspath
    
        configuration 'proguard.conf'
    }
    
    // 2.3 Clean after proguard task
    task cleanAfterProguard(type: Delete, dependsOn: proguard) {
        delete "${buildDir}/classes/java/main"
        delete "${buildDir}/resources/java/main"
    }
    
    // 2.4 Extract output jar to buildDir 
    task unpackProguardOutput (type: Copy, dependsOn: cleanAfterProguard) {
        from zipTree("${buildDir}/proguard/output.jar")
        into file("${buildDir}/classes/java/main")
    }
    

    最后,添加一个任务,以使用prograded类运行应用程序。

    // 3. Create a task to run the app with the proguarded buildDir
    task runProguard(type: JavaExec, dependsOn: unpackProguardOutput) {
        classpath = sourceSets.main.runtimeClasspath
        jvmArgs = ['--module-path', classpath.asPath,
                   '--add-modules', 'javafx.controls,javafx.fxml' ]
        main = 'a.a.b' // <-- this name will depend on the proguard result
    }
    

    proguard.conf

    # Before Java 9, the runtime classes were packaged in a single jar file.
    #-libraryjars <java.home>/lib/rt.jar
    
    # As of Java 9, the runtime classes are packaged in modular jmod files.
    -libraryjars <java.home>/jmods/java.base.jmod(!**.jar;!module-info.class)
    

    这是我在HelloFX示例中使用的配置文件(当然,它可以通过其他许多选项进行扩展):

    -dontoptimize
    -dontshrink
    
    #Java 9+
    -libraryjars <java.home>/jmods/java.base.jmod(!**.jar;!module-info.class)
    
    # Save meta-data for stack traces
    -printmapping out.map
    -renamesourcefileattribute SourceFile
    -keepattributes SourceFile,LineNumberTable
    
    # Rename FXML files together with related views
    -adaptresourcefilenames **.fxml,**.png,**.css,**.properties
    -adaptresourcefilecontents **.fxml
    -adaptclassstrings
    
    # Keep all annotations and meta-data
    -keepattributes *Annotation*,Signature,EnclosingMethod
    
    # Keep entry-point class
    -keep class org.openfjx.MainApp {
      public static void main(java.lang.String[]);
    }
    
    # Keep names of fields marked with @FXML, @Inject and @PostConstruct attributes
    -keepclassmembers class * {
      @javafx.fxml.FXML *;
      @javax.inject.Inject *;
      @javax.annotation.PostConstruct *;
    }
    

    结果

    如果运行./gradlew proguard,将得到output.jar

    main
    |____a
    | |____a
    | | |____styles.css
    | | |____scene.fxml
    | | |____b.class
    | | |____a.class
    

    此外,您还可以查看out.map

    org.openjfx.FXMLController -> a.a.a:
        javafx.scene.control.Label label -> label
        10:10:void <init>() -> <init>
        17:20:void initialize(java.net.URL,java.util.ResourceBundle) -> initialize
    org.openjfx.MainApp -> a.a.b:
        11:11:void <init>() -> <init>
        15:23:void start(javafx.stage.Stage) -> start
        26:27:void main(java.lang.String[]) -> a
    

    最后,./gradlew runproguard将成功运行应用程序。

  •  类似资料:
    • 我一直在摆弄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