昨天老大要我搞个代码混淆器,发了yguard的官网我http://www.yworks.com/en/products_yguard_about.htm (主页)http://www.yworks.com/products/yguard/yguard_ant_howto.html#field (文档),一看全E文凉了半截,google一下还是出来了不少示例:http://blog.csdn.net/jiulong/archive/2006/02/07/593426.aspx (中文写的示例)写的很清楚,yguard要结合ant使用我从未用过ant 下载,安装,配置,调试搞了一上午 没劲 一整天也就把 网页上的教程调试成功....... 我太笨了 今天上午又研究他的脚本 终于把他搞定了
ant的使用请关注另一篇文章
你可以把yguard.jar放在ant的lib目录下,也可以放在build.xml文件同目录下,这样ant就能使用到yguard
第一种情况:当需要混淆的代码的包占少数的时候(意思是少量包下的对象需要深度混淆),用下面的脚本比较简单;
脚本如下:
yguard示例脚本:
<!--auth:zhaohanjiang
date:2009-04-16
-->
<?xml version="1.0" encoding="UTF-8"?>
<!--这里比较重要的定义了ant的缺省任务default="yguard"-->
<project name="project" default="yguard" basedir=".">
<target name="init">
<!--这里定义了要混淆的jar的名字--->
<property name="project_name" value="wherever"/>
<!-- 源码目录好像没什么用--->
<property name="srcDir" value="."/>
<!-- 这里是编译后的class文件文件夹位置但是我使用的是编译好的jar所以没用--->
<!--
<property name="classDir" value="classes"/>
<!-- 这里是新建一个文件夹如上理由无用--->
<mkdir dir="${classDir}"/>
-->
<!-- 这里是定义混淆jar-->
<property name="jar" value="${project_name}.jar"/>
<!--混淆完成jar-->
<property name="obfjar" value="${project_name}_obf.jar"/>
<!-- 重命名日志renamelog-->
<property name="renamelog" value="${project_name}_renamelog.xml"/>
<!-- 压缩日志shrinklog-->
<property name="shrinklog" value="${project_name}_shrinklog.xml"/>
<!-- 混淆jar的启动类,意思不能混淆-->
<property name="mainclass" value="wherever.sysframe.bootup.SicsControl"/>
<!-- 混淆任务--->
</target>
<!-- depends="init"意思是运行本任务时候要先运行init任务--->
<target name="yguard" depends="init">
<!-- 这里是启动yguard进行混淆--->
<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="yguard.jar"/>
<yguard>
<!-- 这里是定义要混淆的jar要用的类库--->
<externalclasses>
<pathelement location="lib/j2ee1.4.jar"/>
<pathelement location="lib/oracle9i12.zip"/>
<pathelement location="lib/sicsaux.jar"/>
<pathelement location="lib/tools.jar"/>
</externalclasses>
<!-- 定义混淆输入输出jar指向命名变量-->
<inoutpair in="${jar}" out="${obfjar}"/>
<!-- 压缩功能;定义日志-->
<shrink logfile="${shrinklog}">
<keep>
<!-- 压缩规则 表示所有的>=protected访问修饰符的class,method,field 不压缩-->
<class classes="protected"
methods="protected" fields="protected">
<patternset>
<!-- 这里一定要注意:在定义范围的时候 你用了include 就一定要用exclude 反之用了exclude 也一定要用include 意思包含和不包含一定要写的清清楚楚 否则会出现稀奇古怪的事情-->
<!-- 压缩范围 include="**.*"意思是不包含所有包下面的类-->
<include name="**.*"/>
<!-- exclude 意思是包含命名中的包下的类 在定义包范围时有很多种规则这里不一一列明-->
<exclude name="wherever.lightrpc.engine.*"/>
<exclude name="wherever.minihttp.engine.*"/>
<exclude name="wherever.postfile.engine.*"/>
<exclude name="wherever.proxydts.engine.*"/>
<exclude name="wherever.sysframe.engine.*"/>
<exclude name="wherever.xmessage.engine.*"/>
</patternset>
</class>
</keep>
</shrink>
<!-- 混淆功能;这里是说混淆jar的main类不需要重命名既混淆-->
<rename mainclass="${mainclass}" logfile="${renamelog}">
<rename logfile="${renamelog}">
<!-- 这个不知道什么意思 其他同上-->
<property name="error-checking" value="pedantic"/>
<keep>
<class classes="protected"
methods="protected" fields="protected">
<patternset>
<include name="**.*"/>
<exclude name="wherever.lightrpc.engine.*"/>
<exclude name="wherever.minihttp.engine.*"/>
<exclude name="wherever.postfile.engine.*"/>
<exclude name="wherever.proxydts.engine.*"/>
<exclude name="wherever.sysframe.engine.*"/>
<exclude name="wherever.xmessage.engine.*"/>
</patternset>
</class>
</keep>
</rename>
</yguard>
</target>
</project>
<!-- end file build.xml -->
第二种情况:当需要混淆的代码占大多数时候(意思是多数包下的对象需要深度混淆),用下面的脚本比较简单;
<?xml version="1.0" encoding="UTF-8"?>
<!-- file build.xml in your project root directory -->
<!-- Ant build script for yfiles -->
<!-- The java based Ant tool is available from -->
<!-- http://jakarta.apache.org/ant -->
<!-- This file demonstrates the use of the yGuard byte -->
<!-- code obfuscator from yWorks Gmbh -->
<!-- yGuard can be downloaded from -->
<!--- http://www.yworks.com/products/yguard -->
<project name="project" default="yguard" basedir=".">
<!-- edit the following lines to your needs -->
<target name="init">
<property name="project_name" value="wherever3.0"/>
<property name="srcDir" value="."/>
<!--
<property name="classDir" value="classes"/>
<mkdir dir="${classDir}"/>
-->
<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="wherever.sysframe.bootup.SicsControl"/>
</target>
<target name="yguard" depends="init">
<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="yguard.jar"/>
<yguard>
<externalclasses>
<pathelement location="lib/j2ee1.4.jar"/>
<pathelement location="lib/oracle9i12.zip"/>
<pathelement location="lib/sicsaux.jar"/>
<pathelement location="lib/tools.jar"/>
</externalclasses>
<inoutpair in="${jar}" out="${obfjar}"/>
<shrink logfile="${shrinklog}">
<keep>
<class classes="protected" methods="protected" fields="protected">
<patternset>
<include name="**.*"/>
</patternset>
</class>
</keep>
</shrink>
<!-- <rename mainclass="${mainclass}" logfile="${renamelog}"> -->
<rename logfile="${renamelog}" mainclass="${mainclass}">
<property name="error-checking" value="pedantic"/>
<keep>
<class classes="protected" methods="protected" fields="protected">
<patternset>
<include name="wherever.sysframe.concept.*"/>
<include name="wherever.sysframe.provider.*"/>
<include name="wherever.sysframe.system.*"/>
<include name="wherever.sysframe.bootup.SicsControl"/>
</patternset>
</class>
</keep>
</rename>
</yguard>
</target>
</project>
<!-- end file build.xml -->
yguard有一个特殊性,是针对jar进行混淆的jar包里的文件名是区分大小写的,所以当你把jar包解压的时候在window系统下会有文件覆盖的现象,所以最好是不要解压jar包。
脚本中带的注释应该够详细了,要说的就是自学真的很费劲,但是只要你够仔细,够毅力,可以无视之,呵呵
还有就是关于泛型 告诉你yguard是支持泛型的 也支持反射 但是我在测试的时候有点问题 官方文档也解决方法 要说的是yguard的混淆功能强大的很,混淆规则也很多能满足多种业务,这里完全是一时之需,希望哪位能把官方文档翻译过来,这样学习起来也轻松些。