|
|
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<title>Java Optimize and Decompile Environment (JODE)</title>
|
|
|
|
<meta name="description" content="The home page of jode, my Java decompiler.">
|
|
|
|
<meta name="author" content="Jochen Hoenicke">
|
|
|
|
<meta name="keywords" content="jode, java, decompile, decompiler,
|
|
|
|
java-decompiler, reverse engineering, free, GPL">
|
|
|
|
<meta name="robots" content="index">
|
|
|
|
<meta name="robots" content="nofollow">
|
|
|
|
<meta name="date" content="1999-10-24">
|
|
|
|
</head>
|
|
|
|
|
|
|
|
<body>
|
|
|
|
<table cellpadding=4 cellspacing=1 width=100%>
|
|
|
|
<tr>
|
|
|
|
<td></td>
|
|
|
|
<td> <img src="jode-logo.gif" alt="JODE" width=286 height=110></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td valign="top">
|
|
|
|
<B><a href="http://www.informatik.uni-oldenburg.de/~delwi">Homepage</a></B>
|
|
|
|
<br><br>
|
|
|
|
<a
|
|
|
|
href="http://www.informatik.uni-oldenburg.de/~delwi/jode/jode.html">
|
|
|
|
<B>Jode</B></a>
|
|
|
|
<ul>
|
|
|
|
<li><a href="applet.html">Test It Online</a></li>
|
|
|
|
<li><a href="download.html">Download</a></li>
|
|
|
|
<li><a href="usage.html">Usage</a></li>
|
|
|
|
<li><a href="license.html">License</a></li>
|
|
|
|
<li><a href="history.html">History</a></li>
|
|
|
|
<li><a href="bluesky.html">Blue Sky</a></li>
|
|
|
|
</ul>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<P><i>JODE</i> is a java package containing a decompiler and an
|
|
|
|
optimizer (aka obfuscator ;-) for java. This package was totally
|
|
|
|
written in my spare time and is available for free (see <a
|
|
|
|
href="license.html">license</a>).<p>
|
|
|
|
|
|
|
|
<P>The decompiler takes <tt>class</tt> files as input and produces
|
|
|
|
something similar to the original <tt>java</tt> file. Of course this
|
|
|
|
can't be perfect: There is no way to produce the comments or the names
|
|
|
|
of local variables (except when compiled with debuging) and there are
|
|
|
|
often more ways to write the same thing. But <i>JODE</i> does its job
|
|
|
|
quite well, so you should give it a try: <a href="applet.html">start
|
|
|
|
the applet</a>.</P>
|
|
|
|
|
|
|
|
<P>The optimizer transforms <tt>class</tt> files in various ways with
|
|
|
|
can be controlled by a script file. It supports the following
|
|
|
|
operations:</p>
|
|
|
|
<ul>
|
|
|
|
<li>Renaming class, method, field and local names to shorter or unique
|
|
|
|
names or according to a given translation table</li>
|
|
|
|
<li>Removing debugging information</li>
|
|
|
|
<li>Removing dead code (classes, fields, methods) and constant
|
|
|
|
fields</li>
|
|
|
|
<li>Optimizing local variable allocation</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<h2>News</h2>
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
<li>I can now decompile <b>inner and anonymous</b> classes.</li>
|
|
|
|
<li>The optimizer (aka obfuscator) can now be customized via a small
|
|
|
|
config file</li>
|
|
|
|
<li>Jode is now <tt>autoconf</tt>igured.</li>
|
|
|
|
<li>I use the <a href="http://www.urbanophile.com/arenn/hacking/download.html#getopt">getopt</a> package</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<h3>Older News</h3>
|
|
|
|
<ul>
|
|
|
|
<li>There is a <a href="usage.html#swing">swing</a> interface</li>
|
|
|
|
<li>Jode handles zip and jar archives as both input and output.</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<h2>Known Bugs</h2>
|
|
|
|
|
|
|
|
<p>Small bugs, that should be fixed in the next release:</p>
|
|
|
|
<ul>
|
|
|
|
<li>If there is more than one assignment to a final local variable
|
|
|
|
(they can be conditionally, so that only one is actually excuted),
|
|
|
|
jode refuses to mark it as final. This can make decompilation of
|
|
|
|
method scoped classes wrong. </li>
|
|
|
|
<li>There's a bug in ConstantAnalyzer (part of the obfuscator). It is
|
|
|
|
triggered very seldom, and produces incorrect code. Use it with
|
|
|
|
care.</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<p>Now follows a list of oddities, that will probably never get
|
|
|
|
completely fixed.</p>
|
|
|
|
|
|
|
|
<p>If not all dependent classes can be found, the verifier (which is
|
|
|
|
run before decompilation starts) may exit with a type error. You
|
|
|
|
can decompile it with <tt>--verify=off</tt>, but take the warning
|
|
|
|
serious, that the types may be incorrect. There's sometimes no way
|
|
|
|
to guess the right type, if you don't have access the full class
|
|
|
|
hierarchie.<br>
|
|
|
|
|
|
|
|
This is not a bug in the verifier: java will complain the same way,
|
|
|
|
if it is run with bytecode verification turned on. And if you don't
|
|
|
|
have the dependent classes, you can't compile the code again.</p>
|
|
|
|
|
|
|
|
<p>There may be situations, where the code doesn't understand complex
|
|
|
|
expressions. In this case many ugly temporary variables are used, but
|
|
|
|
the code should still be compileable. This does especially happen
|
|
|
|
when you compile with <tt>`-O'</tt> flag and javac has inlined some
|
|
|
|
methods. </p>
|
|
|
|
|
|
|
|
<p>Sometimes this program may exit with an <code>Exception</code> or
|
|
|
|
produce incorrect code. Most time the code can't be compiled, so that
|
|
|
|
it can be easily spotted. If you have one of these problems (except
|
|
|
|
those that occur on some of the <code>jode.test</code> files, I would
|
|
|
|
be very interested in a bug report (including the <code>class</code>
|
|
|
|
file, if possible).</p>
|
|
|
|
|
|
|
|
<p>Sometimes <i>JODE</i> generates some GOTO expression and labels. This
|
|
|
|
shouldn't happen any more with code produced by javac or jikes.
|
|
|
|
But some flow obfuscator likes Zelix Klassmaster may provoke this.
|
|
|
|
In that case you can run the Obfuscator first (to optimize away the
|
|
|
|
flow obfuscation ;-).</p>
|
|
|
|
</td>
|
|
|
|
</table>
|
|
|
|
|
|
|
|
<hr>
|
|
|
|
|
|
|
|
<p><A HREF="mailto:Jochen.Hoenicke@Informatik.Uni-Oldenburg.DE">
|
|
|
|
http://www.informatik.uni-oldenburg.de/~delwi/jode/jode.html</A>, last
|
|
|
|
updated on <em>24-Okt-1999</em>.</p>
|
|
|
|
|
|
|
|
</body>
|
|
|
|
</html>
|