<!-- [if !mso]> <mce:style><!-- v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!-- [endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if !mso]> < classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui> </object> <mce:style><!-- st1\:*{behavior:url(#ieooui) } --> <!-- [endif]--> <!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --> <!-- [endif]-->
JAVA 反编译工具
JAVA 语言是 1995 年 5 月由 SUN 公司发布的,由于其安全性高、代码优化、跨平台等特性,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位。
不过, JAVA 最突出的跨平台优势使得它不能被编译成本地代码,而要以中间代码的形式运行在虚拟机环境中,这使得 JAVA 的反编译要比别的高级语言容易实现,并且反编译的代码经过优化后几乎可以与源代码相媲美。
为了更好地保护知识产权,避免本公司的智力成果轻易被人窃取,开发者有必要对反编译工具深入了解,以便有针对性地采取保护措施。
目前,比较流行的 JAVA 反编译工具超过 30 种,其中有三款堪称精品:
一、 应用广泛的 JAD
在众多的 JAVA 反编译工具中,有几种非常著名的工具使用了相同的核心引擎—— JAD ,其中主要包括: Front End Plus 、 mDeJava 、 Decafe Pro 、 Cavaj Java Decompiler 、 DJ Java Decompiler 、 NMI’s Java Class Viewer 和国产的 JAVA 源代码反编译专家等等。
JAD 本身是一个命令行工具,没有图形界面,上述的这些工具大多是在 JAD 内核的基础之上加了一个图形界面而已。这么多种产品的共同选择,足可证明 JAD 在 JAVA 反编译领域中的尊贵地位。
笔者用来测试的 JAD 版本是 1.5.8 f 。
<!-- [if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" alt="" style='width:24pt;height:24pt'/><![endif]--><!-- [if !vml]--><!-- [endif]-->
JAD 是使用 Microsoft Visual C++ 开发的,运行速度非常快,可以处理很复杂的 JAVA 编译文件。众多的参数使 JAD 可以灵活应付多种加密手段,令反编译的代码更加优化和易读。由于 JAD 参数太多,没必要一一解释,其中有几个最常用的如下:
-d
- 用于指定输出文件的目录
-s - 输出文件扩展名 ( 默认为 : .jad) ,通常都会把输出文件扩展名直接指定为 .java ,以方便修改的重新编译。
-8 - 将 Unicode 字符转换为 ANSI 字符串,如果输出字符串是中文的话一定要加上这个参数才能正确显示。
最常用的反编译指令如下所示:
Jad –d c:\javasource –s .java -8 javatest.class
这条指令将当前目录下的 javatest.class 反编译为 javatest.java 并保存在 c:\javasource 目录里,其中的提示输出为中文,而不是 Unicode 代码。
二、 源码开放的 JODE
JODE 是全球最大的开源项目网站 Sourceforge.net 的成员,不要以为源码开放就小瞧它,在所有的 JAVA 反编译器中, JODE 的反编译效果是最好的,尤其是对付一些常见的加密手段,例如混淆技术等,更是出类拔粹。
JODE 本身也是纯 JAVA 开发的,最近越来越多的 JAVA 反编译软件也选择 JODE 来做它们的核心引擎,例如 JCavaj Java Decompiler 、 BTJ (Back To Java) 、 jEdit's JavaInsight plugin 等。
JODE 是一个可运行的 JAR 文件,在 windows 环境下双击即可运行。
<!-- [if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" alt="" style='width:24pt;height:24pt'/><![endif]--><!-- [if !vml]--><!-- [endif]-->
需要特别说明的是, JODE 不是通过常规的 Open->File 的方式来加载 JAVA 编译后的类文件( *.class )或是类包( *.jar )的,而是通过在 Options 菜单中的 Set Classpath 来实现的,单独的类文件可以将它的上一级目录作为 Classpath 输入,然后再选择 Reload Classpath 即可。
<!-- [if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75" alt="" style='width:24pt;height:24pt'/><![endif]--><!-- [if !vml]--><!-- [endif]--><!-- [if gte vml 1]><v:shape id="_x0000_i1030" type="#_x0000_t75" alt="" style='width:24pt;height:24pt'/><![endif]--><!-- [if !vml]--><!-- [endif]-->
新加入的类包或是类的名字会在左侧窗口出现,双击类包名可以展开目录树结构,双击需要反编译的类名则在右上角的窗口中直接显示反编译后的源代码。
三、 独树一帜的 DAVA
DAVA 不是一个独立的 JAVA 反编译器,而是 JAVA 代码优化工具 Soot 的一部分。 Soot 和 JODE 一样是纯 JAVA 开发的,也是一个独立的 JAR 包,但却不能通过双击直接运行,而是象 JAD 一样在命令行状态运行。
<!-- [if gte vml 1]><v:shape id="_x0000_i1031" type="#_x0000_t75" alt="" style='width:24pt;height:24pt'/><![endif]--><!-- [if !vml]--><!-- [endif]-->
Soot 对环境变量的配置要求非常严格,通常情况下要对 CLASSPATH 做如下设置:
Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-2.1.0.jar;.;
其中的 c:\sootdir\ 是下载的 soot 类包放置的路径, CLASSPATH 末尾的 .; 代表了当前目录,如果不加上这个的话 Soot 经常会报一个找不到类的错误。
DAVA 是作为 Soot 的一个参数使用的,通常的用法如下:
Java soot.Main –f dava –d c:\javasource javatest
注意最后的类名不用带 .class 后缀,因为它默认是处理 class 文件,这个操作与前述的 JAD 的参数效果相同。
DAVA 采取了流程优化的方式进行反编译,与传统反编译思路不尽相同,但却对改变流程类的加密方法有独特的反编译效果。
推荐一款Java 反编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下。
这款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov 开发,目前最新版本为0.2.5 .
它由 C++ 开发,并且官方可以下载 windows 、linux 和苹果Mac Os 三个平台的可执行程序。
本人之所以认为它还不错,是其有下面几个功能:
1. 支持对整个Jar 文件进行反编译,并本源代码可直接点击进行相关代码的跳转
2. 支持众多Java 编译器的反编译( 支持泛型, Annotation 和enum 枚举类型)
图示:
<!-- [if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:495.75pt; height:423pt'> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:href="http://www.blogjava.net/images/blogjava_net/xmatthew/screenshot1.png"/> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]-->
3. 快速查找源文件功能(Ctrl+Shift+T)
<!-- [if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt="" style='width:340.5pt;height:219.75pt'> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.jpg" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.jpg" o:href="http://www.blogjava.net/images/blogjava_net/xmatthew/OpenType.JPG"/> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]-->
4. 安装方便. 只有600K, 直接运行即可。
5. 支持文件的拖放功能,源代码高亮显示
当然对于反编译的效果,感觉还可以。当然在本人使用过程也出现过,编译效果不佳的情况。但从总体上来看已经让我挺满意了,呵呵。
上述的三种工具各有千秋,但效果都非常不错。经测试,它们基本上都可以把 JDK 自带的一些例程完全反编译,然后不加任何修改可再编译成功,并能正常运行!
(文中工具均经过本人亲手测试,当时用的是jdk1.4.2_03 ,现在离写文章的时候过了一年多了,jdk 都出到1.5 了,怕是有些程序也不太好反编了)