【问题标题】:Using yGuard to obfuscate library in Eclipse在 Eclipse 中使用 yGuard 混淆库
【发布时间】:2013-11-15 16:30:43
【问题描述】:

我目前正在开发自己的 Java 库,以便在我办公室的其他应用程序中使用,并且我正在探索混淆库本身的方法。

我正在使用 Eclipse Indigo,并且正在使用 yGuard v2.3.0.1。

首先,我的 Java 代码:

package com.test.ObfuscateTest;

public class MainClass {

    private String secretClassVariable;

    public static void main(String[] args) {

    }

    protected void SecretMethod(String secretParameter) {

        secretClassVariable = secretParameter;
    }
}

将 yGuard 与以下 ANT 脚本一起使用,会得到一个空的 JAR 文件:

<?xml version="1.0" encoding="UTF-8"?>

<project name="project" default="yguard" basedir=".">

    <target name="init">
        <property name="project_name" value="ObfuscateTest"/>
        <property name="srcDir" value="."/>
        <property name="classDir" value="classes"/>
        <property name="jar" value="${project_name}.jar"/>
        <property name="obfjar" value="${project_name}_obf.jar"/>
        <property name="renamelog" value="${project_name}_renamelog.xml"/>
        <property name="shrinklog" value="${project_name}_shrinklog.xml"/>
        <property name="mainclass" value="com.test.ObfuscateTest"/>
        <mkdir dir="${classDir}" />
    </target>


    <target depends="jar" name="yguard">
        <taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="/Users/foo/Desktop/yguard-2.3.0.1/lib/yguard.jar"/>
        <!-- the following can be adjusted to your needs -->
        <yguard>

            <inoutpair in="${jar}" out="${obfjar}"/>

            <!-- don't let the obfuscator remove the "Deprecated" -->
            <!-- attributes from the .class file entries -->
            <attribute name="Deprecated"/>

            <shrink logfile="${shrinklog}">
                <keep>
                    <class classes="none" methods="protected" fields="none">
                            <patternset>
                              <include name="com.test.ObfuscateTest.*"/>
                            </patternset>
                          </class>
                </keep>
            </shrink>

            <rename mainclass="${mainclass}" logfile="${renamelog}">
                <keep>
                    <class classes="none" methods="protected" fields="none">
                            <patternset>
                              <include name="com.test.ObfuscateTest.*"/>
                            </patternset>
                          </class>
                </keep>
            </rename>

        </yguard>

    </target>

    <!-- compile -->
    <target name="compile" depends="init">
        <javac srcdir="${srcDir}" includes="com/test/ObfuscateTest/*.java" destdir="${classDir}">
        </javac>
    </target>

    <!-- create .jar -->
    <target name="jar" depends="compile">
        <jar jarfile="${jar}" basedir="${classDir}" includes="com/test/ObfuscateTest/*"/>
    </target>

    <!-- run project -->
    <target name="run" depends="yguard">
        <java classname="${mainclass}" fork="true">
            <classpath>
                <pathelement location="${obfjar}"/>
            </classpath>
        </java>
    </target>

    <!-- removes all that has been built -->
    <target name="clean" depends="init">
        <delete dir="${classDir}" includeEmptyDirs="true" />
    </target>
</project>

我可以就我做错的地方寻求一些建议吗?

提前非常感谢!

【问题讨论】:

  • 为什么要混淆将在办公室使用的代码?
  • 该库可能会发布给第三方开发者,因此需要进行混淆处理。
  • 好吧,我已经让 ProGuard 很好地混淆了我的代码,所以这是一个失败,但我很想知道是否有任何方法可以让 yGuard 工作。

标签: java eclipse ant obfuscation yguard


【解决方案1】:

收缩元素的使用方式不同。它指定 yguard 开始查找依赖类的入口点。所有无法到达的类都将被删除。通常你只需要像这样提供 main 方法:

<shrink logfile="${shrinklog}">
  <keep>
    <method name="void main(java.lang.String[])" class="${mainclass}" />
  </keep>
</shrink>

【讨论】:

  • 最终结果还是一样的——一个 350 字节的 jar 文件,里面没有类。 (只是 Meta-INF)文件夹。错误输出是:Failed to load Main-Class manifest attribute from C:\Users\foo\Java\ObsfucateTest\src\ObsfuscateTest.jar 非常感谢您的帮助。
  • 在 xml 中完全没有收缩线的情况下也会发生这种情况。
  • 我刚试过这个,我认为我的答案是正确的。使用您的原始收缩配置,MainClass 被删除并且 JAR 文件为空。使用我的收缩配置,该类被保留。请查看 ObfuscateTest.jar 是否为空,因为这是 yguard 的输入。也许你的目录布局有问题。
  • 我检查并修复了目录布局的一些问题。 jar 文件现在包含所有必需的文件,但 Manifest 文件由于某种原因没有指向主类。清单文件只包含: Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.2 Created-By: 1.6.0_26-b03 (Sun Microsystems Inc.)(不是 Class-Path 和 Main-Class)。因此,如果我使用 java -jar myJarFile.jar: Failed to load Main-Class attribute...,我仍然会遇到同样的错误
  • 好的,但这是一个完全不同的问题。 JAR 文件不再为空。要在清单中设置主类,请将 添加到您的 任务中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2021-04-16
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多