git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@1079 379699f6-c40d-0410-875b-85095c16579ebranch_1_1
parent
ec599fb69b
commit
ea7bac2872
@ -1,106 +1,105 @@ |
||||
takes class-files as input and produces something similar to the |
||||
original java-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 <code>-g</code>) and there are often more ways to write |
||||
the same thing. But it does its job quite well.</P> |
||||
|
||||
<h2>Quick Test</h2> |
||||
I have now an applet interface to the decompiler. |
||||
<a href="jode-applet.html">Check it out</a>. |
||||
|
||||
<h2>How to get it</h2> |
||||
<P>You can donwload the files in zip form. |
||||
The <a href="jode_src.zip">sources</a> contain only the |
||||
<code>java</code> files, the <a href="jode_cls.zip">classes</a> |
||||
contain only the <code>class</code> files. </p> |
||||
|
||||
<p>I also have a <a href="jode.tar.gz">tar.gz file</a> containing only |
||||
the <code>RCS</code> directories. This is the form I maintain the |
||||
project, but you probably need unix and a few tools to use them.</p> |
||||
|
||||
<p>There are also some <a href="snapshot/">snapshots</a> that have new |
||||
features like inner and anonymous classes. </p> |
||||
|
||||
<p><a href=".">Click here</a> to browse the files online. |
||||
</p> |
||||
|
||||
|
||||
|
||||
<h2>How to use it</h2> |
||||
|
||||
<p>I have some simple step by step pages. There are three |
||||
possibilities: |
||||
<ul> |
||||
<li> <a href="jode-useapplet.html"> Using the applet version</a>. |
||||
This can make problem due to java's security policy, but is the |
||||
simplest way and works on most platforms. |
||||
</li> |
||||
<li> If you use Windows, you should look on <a |
||||
href="jode-win.html">this page</a>.</li> |
||||
<li> Unix users should look on <a href="jode-unix.html">this page</a>. |
||||
</ul> |
||||
|
||||
<h2>Known bugs</h2> |
||||
|
||||
<p>There may be situations, where the code doesn't understand complex |
||||
expressions. In this many ugly temporary variables are used, but the |
||||
code should still be compileable. This does especially happen when |
||||
you compile with `-O' 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 it generates some <code>GOTO</code> expression and |
||||
labels. This can't be compiled, but shouldn't happen any more with |
||||
javac or jikes.</p> |
||||
|
||||
<p>It doesn't handle inner and anonymous classes, yet. You can |
||||
decompile them separately, though (use `<code>+$</code>' switch under |
||||
jikes), but there is a bug in javac, so that a final variable is twice |
||||
initialized. If you encounter this problem just remove the doubled |
||||
line by hand. </p> |
||||
|
||||
<p><b>New!</b> The latest <a href="snapshot">snapshot</a> can handle |
||||
inner and anonymous classes.</p> |
||||
|
||||
|
||||
<h2>Why did I wrote it?</h2> |
||||
|
||||
<p>Someday I found <code>guavad</code>, a disassembler for java byte |
||||
code (it does similar things like <code>javap -c</code>). I used |
||||
it on a class file, and found that it was possible to reconstruct the |
||||
original java code. First I did it by hand on some small routines, |
||||
but I soon realized that it was a rather stupid task, and that I could |
||||
write a <a href="../perl/dasm_to_java.perl"><code>perl</code> script</a> |
||||
that does the same. At the end of the next day I had a working |
||||
decompiler.</p> |
||||
|
||||
<p>Now while it was working, it was not easy to use. You had to |
||||
decompile the code first with a disassembler, cut the method, you |
||||
wanted to decompile and then run the perl script on it. So I decided |
||||
to get some information of the class files and do this all |
||||
automatically. I decided to write it in <code>java</code> now, |
||||
because it suited best.</p> |
||||
JODE (Java Obfuscator/DEcompiler) |
||||
|
||||
This is a decompiler and optimizer for java I have written in my spare |
||||
time. It takes class files as input and produces something similar to |
||||
the original java file. Of course this can't be perfect: There is no |
||||
way to produce the comments or the names of local variables (except |
||||
when the java files were compiled with `-g') and there are often more |
||||
ways to write the same thing. But jode does its job quite well. |
||||
|
||||
Please note that most software licenses forbid to decompile class |
||||
files. Use this decompiler only, if you have legal rights to |
||||
decompile the class (e.g. on your own code). |
||||
|
||||
The features of the decompilers are: |
||||
|
||||
* Systematic flow analysis, that can decompile almost every java code |
||||
without the need of goto (which doesn't exists in java). |
||||
* Type deduction, that can guess the type of local variables, even if |
||||
it is an interface type that doesn't occur in the bytecode. |
||||
* Handling of inner and anonymous classes. |
||||
* Different indentation styles available. |
||||
* It can decompile itself (194 classes) without a single error. |
||||
* It can decrypt strings on the fly, that were encrypted by an obfuscator. |
||||
|
||||
Known bugs of the decompiler: |
||||
|
||||
- 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 --verify=off, 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. |
||||
|
||||
But if you don't have the dependent classes, you can't compile the |
||||
code again, anyway. |
||||
|
||||
- There may be situations, where the code doesn't understand complex |
||||
expressions. In this many ugly temporary variables are used, but the |
||||
code should still be compileable. This does especially happen when |
||||
you compile with `-O' flag and javac has inlined some methods. |
||||
|
||||
- Sometimes this program may exit with an Exception or |
||||
produce incorrect code. If it produced incorrect code the |
||||
code probably can't be compiled, so that the error can be easily spotted. |
||||
If you have one of these problems (they are very rare now), I would |
||||
be very interested in a bug report (including the .class file, if |
||||
possible).</p> |
||||
|
||||
- Sometimes it generates some GOTO expression and labels. This |
||||
shouldn't happen any more with javac or jikes. But some flow |
||||
obfuscator likes Zelix Klassmaster may provoke this. In |
||||
that case you can run the Obfuscator first. |
||||
|
||||
<p>Just for the records: the java code is now more than 50 times |
||||
bigger than the original perl script and is still growing.</p> |
||||
The features of the obfuscator are: |
||||
* Modular design, you can swap whole classes via the script file. |
||||
* Strong analysis, that optimizes fields, expressions that are known |
||||
to be constant (and reverts the flow obfuscation of Zelix Klassmaster) |
||||
* Can also be used as Optimizer, without any obfuscation at all, it |
||||
will preserve the local variable table and line number table. |
||||
* Many different renaming options, you can also simply add your own. |
||||
|
||||
<h2>License</h2> |
||||
|
||||
<p>This code is under GNU GPL. That basically means, that you can copy |
||||
or modify this code, as long as you put all your modification under |
||||
the GPL again. <A HREF="http://www.gnu.org/copyleft/gpl.html"> Look |
||||
here for the complete license</a>.</p> |
||||
PRELIMINARIES: |
||||
|
||||
<hr> |
||||
You need java jdk1.2 or above, and the gnu getopt package. |
||||
|
||||
<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>17-Jun-1999</em>.</p> |
||||
You should also have the jode-x.x.xx.jar file. Read INSTALL how to |
||||
compile it yourself. |
||||
|
||||
</body> |
||||
</html> |
||||
Jode also works with jdk1.1, you need the sun collection classes and |
||||
swing in that case and you have to compile the jar-file yourself |
||||
|
||||
|
||||
USAGE: |
||||
|
||||
First set the classpath. It should contain the jar file |
||||
jode-x.x.xx.jar, the gnu getopt package and the sun collection package |
||||
for 1.1. For the swingui program you also need swing in you classpath. |
||||
|
||||
You can then decompile a class file with: |
||||
java jode.Decompiler --classpath jarfile1.jar,jarfile2.jar org.package.Class |
||||
|
||||
For a graphical user interface based on swing try: |
||||
java jode.swingui.Main --classpath jarfile1.jar |
||||
|
||||
The obfuscator/deobfuscator can be run with: |
||||
java jode.obfuscator.Main --script obfuscation.script |
||||
|
||||
See XXXX for more information about the script syntax. |
||||
|
||||
HISTORY: |
||||
|
||||
Someday I found guavad, a disassembler for java byte code (it does |
||||
similar things like `javap -c'). I used it on a class file, and found |
||||
that it was possible to reconstruct the original java code. First I |
||||
did it by hand on some small routines, but I soon realized that it was |
||||
a rather stupid task, and that I could write a perl script, that does |
||||
the same. At the end of the next day I had the first working |
||||
decompiler. |
||||
|
||||
Now while it was working, it was not easy to use. You had to |
||||
decompile the code first with a disassembler, cut the method, you |
||||
wanted to decompile and then run the perl script on it. So I decided |
||||
to get some information of the class files and do this all |
||||
automatically. I decided to write it in java now, because it suited |
||||
best. |
||||
|
Loading…
Reference in new issue