昨天老大要我搞个代码混淆器,发了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的混淆功能强大的很,混淆规则也很多能满足多种业务,这里完全是一时之需,希望哪位能把官方文档翻译过来,这样学习起来也轻松些。