1

yGuard を使用して、Gradle で Java コードを難読化したいと考えています。これまでのところ、以下を使用して難読化を機能させることができました。

dependencies {
    compile 'com.yworks:yguard:2.9.2'
}

task yGuardObfuscate {
    group 'yGuard'
    description 'Obfuscates existing archives.'
    dependsOn "installDist"

    doLast {
        ant.taskdef(
            name: 'yguard',
            classname: 'com.yworks.yguard.YGuardTask',
                classpath: sourceSets.main.runtimeClasspath.asPath
            )

        ant.yguard {
            inoutpairs {
                fileset(dir: "./build/install/module") {
                    include(name: "module*.jar")
                    exclude(name: "*_obf.jar")
                }
            }

            rename(logFile: "./build/install/module/rename.log") {
                property(name: "naming-scheme", value: "mix")
            }
        }
    }
}

ただし、これには関数が不明瞭になるという問題があり、(難読化されていない jar で動作します)mainを使用して実行できなくなります。java -jar module_obf.jar

main関数を難読化から除外する方法をいくつか試しました。

最初に、ドキュメント ( https://yworks.github.io/yGuard/task_documentation/#controlling-obfuscation-exclusion-with-annotations ) で説明されているように、次のように @Obfuscate アノテーションを使用してみました。

  @com.yworks.util.annotation.Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    try {
      new Start();
    } catch (SQLException e) {
      LOGGER.error(e, e);
    }
  }

私の IDE (Eclipse 2019-14) では、この行は有効であると表示されました。ただし、作成したgradleタスクでコンパイルしようとすると、次のエラーが発生しました。

...\Start.java:22: error: package com.yworks.util.annotation does not exist
  @com.yworks.util.annotation.Obfuscation( exclude = true, applyToMembers = false)
                             ^

これを機能させるために多くのことを試みましたが、機能するソリューションに到達できませんでした。

次に、次のように、yGuardObfuscateタスクで keep > method 要素を使用して、クラスのmain関数を明示的に保持しようとしました。Start

task yGuardObfuscate {
    group 'yGuard'
    description 'Obfuscates existing archives.'
    dependsOn "installDist"

    doLast {
        ant.taskdef(
            name: 'yguard',
            classname: 'com.yworks.yguard.YGuardTask',
                classpath: sourceSets.main.runtimeClasspath.asPath
            )

        ant.yguard {
            inoutpairs {
                fileset(dir: "./build/install/module") {
                    include(name: "module*.jar")
                    exclude(name: "*_obf.jar")
                }
            }

            rename(logFile: "./build/install/module/rename.log") {
                property(name: "naming-scheme", value: "mix")
                keep {
                    method("class": "com.company.project.module.Start", name: "public static void main(String[] args)")
                }
            }
        }
    }
}

これにより、Gradle ビルドが次の例外で失敗しました。

: java.lang.IllegalArgumentException: '(' expected but found void
[...]
Caused by: java.lang.IllegalArgumentException: '(' expected but found void
    at com.yworks.yguard.ObfuscatorTask.toNativeMethod(ObfuscatorTask.java:188)
    at com.yworks.yguard.ant.MethodSection.addEntries(MethodSection.java:35)
    at com.yworks.yguard.ant.ExposeSection.createEntries(ExposeSection.java:170)
    at com.yworks.yguard.ObfuscatorTask.execute(ObfuscatorTask.java:745)
    at com.yworks.yguard.YGuardTask.execute(YGuardTask.java:116)
[...]
Root cause: java.lang.IllegalArgumentException: '(' expected but found void
    at com.yworks.yguard.ObfuscatorTask.toNativeMethod(ObfuscatorTask.java:188)
    at com.yworks.yguard.ant.MethodSection.addEntries(MethodSection.java:35)
    at com.yworks.yguard.ant.ExposeSection.createEntries(ExposeSection.java:170)
    at com.yworks.yguard.ObfuscatorTask.execute(ObfuscatorTask.java:745)
    at com.yworks.yguard.YGuardTask.execute(YGuardTask.java:116)

繰り返しますが、「」なしで「クラス」を記述したり、余分な {} を追加したりするなど、ここでいくつかのことを試しましたが、何も役に立ちませんでした。

ここでの質問は次のとおりです。私は何を間違っていますか? また、yGuard がmain機能を難読化するのを防ぐにはどうすればよいですか?

4

1 に答える 1