程序在编译之前对文件进行模糊处理?

时间:2015-03-10 17:49:19

标签: java obfuscation

我正在使用ForgeGradle(Minecraft Forge改装平台)。

我想在发布之前混淆我的mod,但Forge平台的本质不允许我通过在编译后运行像ProGuard这样的程序(使用已定义的库)来实现它。

为什么呢? 结构如下: Mod - >锻造 - >的Minecraft

由于Minecraft使用自己的混淆类并且ForgeGradle编译器没有直接混淆Mod的代码以适应Minecraft的编码,因此在使用ProGuard时不可能将MC.jar用作库。 Compiled Forge Mod实际上是由Forge在运行时使用SRG名称解码的。这背后的逻辑不容易解释,所以我要注意:我不能以适合库的方式混淆.jar。

所以我虽然 - 我可以只使用我的mod的代码(.java文件)并在Forge编译之前重命名所有MINE的字段/方法/类。 是否有一个软件允许我选择.java文件的数量并以一种不重新命名不属于它们的引用的方式“混淆”它们?

编辑(更多解释):

Mod的代码有3种状态:开发,编译,运行。

我会试着举个例子: 假设在Minecraft.jar中有一个反编译方法ItemSword.onHit() 它的编译(混淆)版本看起来像这样:bca.aa(),所有包都丢失了(展平)。

在mod的开发状态代码(.java)中引用它我们只需:ItemSword.onHit()

当我们编译mod时,调用将看起来像这样(.class):ItemSword.func_ab4234() - 这是我正在谈论的SRG。

现在当mod加载到游戏中时,forge会将“ItemSword”翻译为“bca”,将“func_ab4234()”翻译为“aa()”

因此,我甚至无法添加适当的库 - 没有。我将永远得到(在ProGuard中)NoClassDefFound警告,我不能忽略它(它会崩溃编译)。

因此在编辑之后 - 是否仍然可以使用ProGuard进行模糊处理(考虑到我不能分配“好”库)?

2 个答案:

答案 0 :(得分:0)

您是否尝试过proguard选项? http://proguard.sourceforge.net/manual/usage.html

e.g。对于Serializable类和其他东西把它放到你的proguard配置中(如果你愿意,你也可以保留完整的类):

<!-- With this code serializable classes will be backward compatible -->
<keepnames implements="java.io.Serializable"/>

<!-- or for native access:-->
<keepclasseswithmembernames>
 <method access="native"/>
</keepclasseswithmembernames>

<!--Preserve all public classes, and their public and protected fields and methods.--> 
<keep access="public">
 <field access="public protected"/>
 <method access="public protected"/>
</keep>

答案 1 :(得分:0)

如果我收到你的问题,你想要混淆你自己的代码,而不是那些东西。这就是ProGuard实际上非常擅长的。我们假设您已在包com.foocom.bar中创建了类。您可以使用这个简单的ProGuard命令来模糊您自己的类:

-keep class !com.foo.**,!com.bar.** { *; }

它告诉ProGuard不要混淆不属于com.foocom.bar的任何类成员。

如果您收到NoClassDef错误,则添加了错误的库。我猜你正在使用某种IDE(也许是eclipse)。查看项目引用的库以查找正确的库类路径(例如jar文件)。你基本上需要找到用于编译代码的类路径,ProGuard也会采用它,一切都应该有效。