使用yGuard在Gradle中混淆Java ~如何排除方法



我想使用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")
}
}
}
}

然而,这有一个问题,即main函数被模糊了,我不能再使用java -jar module_obf.jar(它与未模糊的jar一起工作(来运行它了。

我已经尝试了几种将main函数排除在模糊处理之外的方法。

首先,我尝试使用文档中描述的@Obfuscate注释(https://yworks.github.io/yGuard/task_documentation/#controlling-带注释的模糊排除(,如下所示:

@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>方法元素来显式地保留Start类的main函数,如下所示:

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)

我再次尝试了一些方法,比如在不使用"的情况下编写"class",添加额外的{},但没有任何帮助。

所以这里的问题是:我做错了什么?如何防止yGuard混淆main函数?

我现在找到了一种让它发挥作用的方法,尽管它在某种程度上更像是一种变通方法,而不是一种适当的解决方案,所以如果有人知道我在"官方"解决方案上做错了什么,请告诉我。

为此,我使用了Annotation方法,并没有使用默认的注释,而是创建了一个自定义注释,它在我的项目中几乎是一个精确的副本。

注释类如下所示:

package com.company.project.module.annotations;
public @interface Obfuscation {
boolean exclude() default true;
boolean applyToMembers() default true;
}

我在我的入门课上使用它,如下所示:

import com.company.project.module.annotations.*;
[...]
@Obfuscation( exclude = true, applyToMembers = false)
public static void main(String[] args) {
[...]
}

最后,我将这个自定义注释类添加到任务的rename元素中,如下所示:

rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
property(name: "naming-scheme", value: "mix")
}

所以整个gradle任务现在看起来是这样的:

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", annotationClass: "com.company.project.module.annotations.Obfuscation") {
property(name: "naming-scheme", value: "mix")
}
}
}
}

这样,构建就可以工作了,我可以使用java -jar module_obf.jar成功地运行我的程序。

最新更新