git-svn-id: https://svn.code.sf.net/p/jode/code/tags/jode_1_1_1@1345 379699f6-c40d-0410-875b-85095c16579ejode_1_1_1
parent
edc69e287a
commit
02c10bf9bb
@ -1,13 +0,0 @@ |
|||||||
# The "checkoutlist" file is used to support additional version controlled |
|
||||||
# administrative files in $CVSROOT/CVSROOT, such as template files. |
|
||||||
# |
|
||||||
# The first entry on a line is a filename which will be checked out from |
|
||||||
# the corresponding RCS file in the $CVSROOT/CVSROOT directory. |
|
||||||
# The remainder of the line is an error message to use if the file cannot |
|
||||||
# be checked out. |
|
||||||
# |
|
||||||
# File format: |
|
||||||
# |
|
||||||
# [<whitespace>]<filename><whitespace><error message><end-of-line> |
|
||||||
# |
|
||||||
# comment lines begin with '#' |
|
@ -1,15 +0,0 @@ |
|||||||
# The "commitinfo" file is used to control pre-commit checks. |
|
||||||
# The filter on the right is invoked with the repository and a list |
|
||||||
# of files to check. A non-zero exit of the filter program will |
|
||||||
# cause the commit to be aborted. |
|
||||||
# |
|
||||||
# The first entry on a line is a regular expression which is tested |
|
||||||
# against the directory that the change is being committed to, relative |
|
||||||
# to the $CVSROOT. For the first match that is found, then the remainder |
|
||||||
# of the line is the name of the filter to run. |
|
||||||
# |
|
||||||
# If the repository name does not match any of the regular expressions in this |
|
||||||
# file, the "DEFAULT" line is used, if it is specified. |
|
||||||
# |
|
||||||
# If the name "ALL" appears as a regular expression it is always used |
|
||||||
# in addition to the first matching regex or "DEFAULT". |
|
@ -1,11 +0,0 @@ |
|||||||
# Set this to "no" if pserver shouldn't check system users/passwords |
|
||||||
#SystemAuth=no |
|
||||||
|
|
||||||
# Set `PreservePermissions' to `yes' to save file status information |
|
||||||
# in the repository. |
|
||||||
#PreservePermissions=no |
|
||||||
|
|
||||||
# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top |
|
||||||
# level of the new working directory when using the `cvs checkout' |
|
||||||
# command. |
|
||||||
#TopLevelAdmin=no |
|
@ -1 +0,0 @@ |
|||||||
*.class |
|
@ -1,23 +0,0 @@ |
|||||||
# This file affects handling of files based on their names. |
|
||||||
# |
|
||||||
# The -t/-f options allow one to treat directories of files |
|
||||||
# as a single file, or to transform a file in other ways on |
|
||||||
# its way in and out of CVS. |
|
||||||
# |
|
||||||
# The -m option specifies whether CVS attempts to merge files. |
|
||||||
# |
|
||||||
# The -k option specifies keyword expansion (e.g. -kb for binary). |
|
||||||
# |
|
||||||
# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) |
|
||||||
# |
|
||||||
# wildcard [option value][option value]... |
|
||||||
# |
|
||||||
# where option is one of |
|
||||||
# -f from cvs filter value: path to filter |
|
||||||
# -t to cvs filter value: path to filter |
|
||||||
# -m update methodology value: MERGE or COPY |
|
||||||
# -k expansion mode value: b, o, kkv, &c |
|
||||||
# |
|
||||||
# and value is a single-quote delimited value. |
|
||||||
# For example: |
|
||||||
#*.gif -k 'b' |
|
@ -1,21 +0,0 @@ |
|||||||
# The "editinfo" file is used to allow verification of logging |
|
||||||
# information. It works best when a template (as specified in the |
|
||||||
# rcsinfo file) is provided for the logging procedure. Given a |
|
||||||
# template with locations for, a bug-id number, a list of people who |
|
||||||
# reviewed the code before it can be checked in, and an external |
|
||||||
# process to catalog the differences that were code reviewed, the |
|
||||||
# following test can be applied to the code: |
|
||||||
# |
|
||||||
# Making sure that the entered bug-id number is correct. |
|
||||||
# Validating that the code that was reviewed is indeed the code being |
|
||||||
# checked in (using the bug-id number or a seperate review |
|
||||||
# number to identify this particular code set.). |
|
||||||
# |
|
||||||
# If any of the above test failed, then the commit would be aborted. |
|
||||||
# |
|
||||||
# Actions such as mailing a copy of the report to each reviewer are |
|
||||||
# better handled by an entry in the loginfo file. |
|
||||||
# |
|
||||||
# One thing that should be noted is the the ALL keyword is not |
|
||||||
# supported. There can be only one entry that matches a given |
|
||||||
# repository. |
|
@ -1,26 +0,0 @@ |
|||||||
# The "loginfo" file controls where "cvs commit" log information |
|
||||||
# is sent. The first entry on a line is a regular expression which must match |
|
||||||
# the directory that the change is being made to, relative to the |
|
||||||
# $CVSROOT. If a match is found, then the remainder of the line is a filter |
|
||||||
# program that should expect log information on its standard input. |
|
||||||
# |
|
||||||
# If the repository name does not match any of the regular expressions in this |
|
||||||
# file, the "DEFAULT" line is used, if it is specified. |
|
||||||
# |
|
||||||
# If the name ALL appears as a regular expression it is always used |
|
||||||
# in addition to the first matching regex or DEFAULT. |
|
||||||
# |
|
||||||
# You may specify a format string as part of the |
|
||||||
# filter. The string is composed of a `%' followed |
|
||||||
# by a single format character, or followed by a set of format |
|
||||||
# characters surrounded by `{' and `}' as separators. The format |
|
||||||
# characters are: |
|
||||||
# |
|
||||||
# s = file name |
|
||||||
# V = old version number (pre-checkin) |
|
||||||
# v = new version number (post-checkin) |
|
||||||
# |
|
||||||
# For example: |
|
||||||
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog |
|
||||||
# or |
|
||||||
#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog |
|
@ -1 +0,0 @@ |
|||||||
jode jode |
|
@ -1,12 +0,0 @@ |
|||||||
# The "notify" file controls where notifications from watches set by |
|
||||||
# "cvs watch add" or "cvs edit" are sent. The first entry on a line is |
|
||||||
# a regular expression which is tested against the directory that the |
|
||||||
# change is being made to, relative to the $CVSROOT. If it matches, |
|
||||||
# then the remainder of the line is a filter program that should contain |
|
||||||
# one occurrence of %s for the user to notify, and information on its |
|
||||||
# standard input. |
|
||||||
# |
|
||||||
# "ALL" or "DEFAULT" can be used in place of the regular expression. |
|
||||||
# |
|
||||||
# For example: |
|
||||||
#ALL mail %s -s "CVS notification" |
|
@ -1,13 +0,0 @@ |
|||||||
# The "rcsinfo" file is used to control templates with which the editor |
|
||||||
# is invoked on commit and import. |
|
||||||
# |
|
||||||
# The first entry on a line is a regular expression which is tested |
|
||||||
# against the directory that the change is being made to, relative to the |
|
||||||
# $CVSROOT. For the first match that is found, then the remainder of the |
|
||||||
# line is the name of the file that contains the template. |
|
||||||
# |
|
||||||
# If the repository name does not match any of the regular expressions in this |
|
||||||
# file, the "DEFAULT" line is used, if it is specified. |
|
||||||
# |
|
||||||
# If the name "ALL" appears as a regular expression it is always used |
|
||||||
# in addition to the first matching regex or "DEFAULT". |
|
@ -1,20 +0,0 @@ |
|||||||
# The "taginfo" file is used to control pre-tag checks. |
|
||||||
# The filter on the right is invoked with the following arguments: |
|
||||||
# |
|
||||||
# $1 -- tagname |
|
||||||
# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d |
|
||||||
# $3 -- repository |
|
||||||
# $4-> file revision [file revision ...] |
|
||||||
# |
|
||||||
# A non-zero exit of the filter program will cause the tag to be aborted. |
|
||||||
# |
|
||||||
# The first entry on a line is a regular expression which is tested |
|
||||||
# against the directory that the change is being committed to, relative |
|
||||||
# to the $CVSROOT. For the first match that is found, then the remainder |
|
||||||
# of the line is the name of the filter to run. |
|
||||||
# |
|
||||||
# If the repository name does not match any of the regular expressions in this |
|
||||||
# file, the "DEFAULT" line is used, if it is specified. |
|
||||||
# |
|
||||||
# If the name "ALL" appears as a regular expression it is always used |
|
||||||
# in addition to the first matching regex or "DEFAULT". |
|
@ -1,21 +0,0 @@ |
|||||||
# The "verifymsg" file is used to allow verification of logging |
|
||||||
# information. It works best when a template (as specified in the |
|
||||||
# rcsinfo file) is provided for the logging procedure. Given a |
|
||||||
# template with locations for, a bug-id number, a list of people who |
|
||||||
# reviewed the code before it can be checked in, and an external |
|
||||||
# process to catalog the differences that were code reviewed, the |
|
||||||
# following test can be applied to the code: |
|
||||||
# |
|
||||||
# Making sure that the entered bug-id number is correct. |
|
||||||
# Validating that the code that was reviewed is indeed the code being |
|
||||||
# checked in (using the bug-id number or a seperate review |
|
||||||
# number to identify this particular code set.). |
|
||||||
# |
|
||||||
# If any of the above test failed, then the commit would be aborted. |
|
||||||
# |
|
||||||
# Actions such as mailing a copy of the report to each reviewer are |
|
||||||
# better handled by an entry in the loginfo file. |
|
||||||
# |
|
||||||
# One thing that should be noted is the the ALL keyword is not |
|
||||||
# supported. There can be only one entry that matches a given |
|
||||||
# repository. |
|
@ -0,0 +1,415 @@ |
|||||||
|
2001-08-12 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* configure.in: Set version number to 1.1.1. |
||||||
|
|
||||||
|
2001-08-12 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/obfuscator/Identifier.java.in (writeTable): New boolean |
||||||
|
parameter specifying if reversed or not. |
||||||
|
* jode/obfuscator/ClassBundle.java.in: Renamed the table file |
||||||
|
variables, added outTableFile. |
||||||
|
(setOption): Support outtable, intable and outrevtable. |
||||||
|
Support verbose. |
||||||
|
(writeTable): Writes table unreversed. |
||||||
|
(writeRevTable): New method, Writes table reversed. |
||||||
|
* jode/obfuscator/Main.java.in: (rand): New variable. |
||||||
|
* jode/obfuscator/PackageIdentifier.java.in: Use Main.rand instead |
||||||
|
of definining its own random. |
||||||
|
* jode/obfuscator/ClassIdentifier.java.in: likewise. |
||||||
|
|
||||||
|
* jode/flow/FlowBlock.java.in: |
||||||
|
(checkConsistent): Allow lastModified in a finally block. |
||||||
|
|
||||||
|
* jode/flow/TransformExceptionHandlers.java.in: Reworked exception |
||||||
|
handlers again. This time checked with javac 1.3, javac 1.1 and |
||||||
|
jikes. |
||||||
|
(checkTryCatchOrder): New method that was previously part of |
||||||
|
analyze. |
||||||
|
(analyze): Use checkTryCatchOrder. Don't merge try and catch flow |
||||||
|
blocks anymore, leave it to the analyzeXXX methods. |
||||||
|
(mergeTryCatch): New method. |
||||||
|
(analyzeCatchBlock): Get catchFlow as parameter. Call |
||||||
|
mergeTryCatch. |
||||||
|
(transformSubroutine): Handle POP-only subroutines. |
||||||
|
(removeJSR): Don't do special case for catchBlock any more. This |
||||||
|
is because catchFlow isn't yet merged when this method is called. |
||||||
|
(checkAndRemoveJSR): Likewise. |
||||||
|
(checkAndRemoveMonitorExit): Likewise. Merge subroutine only if |
||||||
|
we are the only predecessor. |
||||||
|
(analyzeSynchronized): Get catchFlow as parameter. Call |
||||||
|
mergeTryCatch. |
||||||
|
(mergeFinallyBlocks): New method, calls mergeTryCatch and does the |
||||||
|
common part of mergeFinally and mergeSpecialFinally. |
||||||
|
(analyzeFinally): Simplified, after checking and removing JSR, it |
||||||
|
does immediately analyze and transform subroutine to get the |
||||||
|
finallyBlock. Then it throws away the catchFlow and calls |
||||||
|
mergeFinallyBlocks. |
||||||
|
(analyzeSpecialFinally): Simplified, after checking it only handles |
||||||
|
the jumps in the try part and then call mergeFinallyBlocks. |
||||||
|
|
||||||
|
2001-08-10 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* configure.in: Changed bash syntax to more compatible (but |
||||||
|
slower) syntax. Fixes bug #448909. |
||||||
|
|
||||||
|
2001-08-09 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/expr/InvokeOperator.java.in (dumpExpression): Fixed the |
||||||
|
check for null outerExpr. |
||||||
|
|
||||||
|
2001-07-27 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/obfuscator/Main.java.in (stripping): Initialize to 0 which |
||||||
|
means strip nothing. This is necessary because there is no way |
||||||
|
to turn off stripping. |
||||||
|
|
||||||
|
2001-07-11 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/flow/CatchBlock.java.in (combineLocal): Added more checks |
||||||
|
if LocalStoreOperator is of the right form. |
||||||
|
|
||||||
|
2001-07-10 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/obfuscator/modules/SimpleAnalyzer.java.in: |
||||||
|
Ported fix from ConstantAnalyzer: |
||||||
|
(canonizeReference): for interfaces call canonizeIfaceReference. |
||||||
|
(canonizeIfaceReference): new method. |
||||||
|
* jode/obfuscator/modules/ConstantAnalyzer.java.in: |
||||||
|
made sub class of SimpleAnalyzer. |
||||||
|
(canonizeReference): Removed, since its inherited. |
||||||
|
(canonizeIfaceReference): dito. |
||||||
|
|
||||||
|
2001-07-08 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/bytecode/BytecodeInfo.java.in (calculateMaxStack): Handle special case for empty method. Previous code would just crash. |
||||||
|
|
||||||
|
2001-06-15 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/jvm/SyntheticAnalyzer.java.in: |
||||||
|
(checkGetClass): Ignore nop opcodes. |
||||||
|
(checkStaticAccess): Likewise. |
||||||
|
(checkAccess): Likewise. |
||||||
|
(checkConstructorAccess): Likewise. |
||||||
|
|
||||||
|
* jode/flow/TransformConstructors.java (Constructor): Ignore |
||||||
|
OuterValues for static constructor. |
||||||
|
|
||||||
|
* jode/expr/NewArrayOperator.java (dumpExpression): Added |
||||||
|
a missing breakOp. |
||||||
|
* jode/expr/CompareToIntOperator.java (dumpExpression): Likewise. |
||||||
|
|
||||||
|
2001-06-01 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/obfuscator/modules/ConstantAnalyzer.java.in: |
||||||
|
(analyzeCode): set field listener of RuntimeEnvironment. |
||||||
|
(replaceWith): Fixed the invoke_xxx case. |
||||||
|
|
||||||
|
* jode/obfuscator/ConstantRuntimeEnvironment.java.in: |
||||||
|
(getField): add current field listener to field if constant value |
||||||
|
was used. |
||||||
|
(currentFieldAnalyzer): New field. |
||||||
|
(setFieldAnalyzer): New method. |
||||||
|
|
||||||
|
2001-05-27 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* configure.in: Set version to 1.1. |
||||||
|
|
||||||
|
* jode/decompiler/Main.java (main): Also use bootclasspath if no |
||||||
|
classpath given. |
||||||
|
* jode/swingui/Main.java (main): Likewise. |
||||||
|
|
||||||
|
* jode/decompiler/MethodAnalyzer.java.in (skipWriting): Don't skip |
||||||
|
empty constructor that have a throws clause. |
||||||
|
|
||||||
|
* configure.in: Determine whether jdk1.1 resp. jdk1.2. Call jcpp |
||||||
|
in config.status. |
||||||
|
|
||||||
|
* jode/expr/Expression.java.in (makeInitializer): Now takes the |
||||||
|
type of the initialization. Changed all callers. |
||||||
|
* jode/expr/ConstantArrayOperator.java (makeInitializer): Check |
||||||
|
that type is our array type, otherwise we can't omit new Array[]. |
||||||
|
|
||||||
|
* jode/decompiler/LocalInfo.java (markFinal): Don't check that |
||||||
|
only one write is present. If two writes are in an then and an |
||||||
|
else branch of an if, the local can still be final. |
||||||
|
|
||||||
|
* jode/type/ArrayType.java (getSubType): Handle array of integer |
||||||
|
types correctly: byte[] is something completely different than |
||||||
|
int[]. |
||||||
|
(getSuperType): Likewise. |
||||||
|
|
||||||
|
* jode/expr/FieldOperator.java.in (getFieldInfo): New function. |
||||||
|
(needsCast): A cast is also needed if the field is private or |
||||||
|
package scope and the current type can't access the field. |
||||||
|
|
||||||
|
* jode/expr/InvokeOperator.java.in (getMethodInfo): New function. |
||||||
|
(needsCast): A cast is also needed if the method is private or |
||||||
|
package scope and the current type can't access the method. |
||||||
|
|
||||||
|
* jode/expr/ArrayStoreOperator.java (dumpExpression): Check if a |
||||||
|
cast of the array expression is needed. |
||||||
|
|
||||||
|
* jode/expr/TransformConstructors.java |
||||||
|
(transformFieldInitializers): Don't allow moving method invocations |
||||||
|
that throw a checked exception. |
||||||
|
|
||||||
|
* jode/bytecode/MethodInfo.java (readAttribute): Read Exceptions |
||||||
|
attribute even when not all attributes should be read. They are |
||||||
|
needed by TransformConstructors, see above. |
||||||
|
|
||||||
|
2001-05-26 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/decompiler/TabbedPrintWriter.java (saveOps): Don't allow |
||||||
|
line breaks in not completed expressions since implicit parentheses |
||||||
|
would destroy the syntax. No need to put line break option on stack. |
||||||
|
(restoreOps): Adapted Stack format. |
||||||
|
|
||||||
|
* jode/decompiler/ClassAnalyzer.java.in (dumpDeclaration): Moved |
||||||
|
Code from dumpSource here. Don't put a line break after closing |
||||||
|
brace. |
||||||
|
(dumpSource): call dumpDeclaration and add a line break. |
||||||
|
(dumpBlock): Moved dropInfo(ATTRIBS) here. |
||||||
|
|
||||||
|
* jode/decompiler/ClassAnalyzer.java.in (STRICTFP): New Constant. |
||||||
|
(isStrictFP): New function. |
||||||
|
(initialize): Set strictfp modifier if a constructor has it set. |
||||||
|
(dumpSource): Handle strictfp modifier. |
||||||
|
|
||||||
|
* jode/decompiler/MethodAnalyzer.java.in (STRICTFP): New Constant. |
||||||
|
(isStrictFP): New function. |
||||||
|
(dumpSource): Handle strictfp modifier. |
||||||
|
|
||||||
|
* jode/jvm/SyntheticAnalyzer.java.in (checkAccess): Check for a |
||||||
|
special putfield access, where the set value is returned. Allow |
||||||
|
the modifier of field/method to be protected and the class to be |
||||||
|
a superclass. |
||||||
|
(checkStaticAccess): Likewise. |
||||||
|
(ACCESSDUPPUTFIELD): New Constant. |
||||||
|
(ACCESSDUPPUTSTATIC): New Constant. |
||||||
|
|
||||||
|
* jode/expr/InvokeOperator.java.in (simplifyAccess): Handle new |
||||||
|
synthetics. |
||||||
|
|
||||||
|
* jode/flow/SpecialBlock.java (removePop): Remove pop also for |
||||||
|
non void store instructions. |
||||||
|
|
||||||
|
* jode/decompiler/MethodAnalyzer.java.in (skipWriting): Also skip |
||||||
|
the new synthetics. |
||||||
|
|
||||||
|
* jode/decompiler/Main.java (main): Call System.exit() after |
||||||
|
everything was compiled. |
||||||
|
|
||||||
|
* jode/flow/TransformExceptionHandlers.java.in (removeJSR): |
||||||
|
Renamed back from removeBadJSR (see patch from 2001-02-04). The |
||||||
|
checkAndRemove* functions mustn't change the successors while they |
||||||
|
iterate over them. Instead of removing good jsr they mark them as |
||||||
|
good and removeJSR will finally remove them. |
||||||
|
(checkAndRemoveJSR): See above. |
||||||
|
(checkAndRemoveMonitorExit): See above. |
||||||
|
|
||||||
|
* jode/flow/JsrBlock.java (good): New variable, see above. |
||||||
|
(setGood): New method. |
||||||
|
(isGood): New method. |
||||||
|
|
||||||
|
2001-05-08 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/jvm/CodeVerifier.java.in (doVerify): Don't check for |
||||||
|
uninitialized objects in local or stack slots on backwards jump or |
||||||
|
exception blocks. Sun's jdk also doesn't check it, and I never |
||||||
|
understood why it is necessary. But see JVM Spec 4.9.4. |
||||||
|
|
||||||
|
2001-05-02 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/obfuscator/modules/ConstantAnalyzer.java.in (handleOpcode): |
||||||
|
Added divide by zero checks for opc_irem and opc_lrem. |
||||||
|
|
||||||
|
2001-04-11 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/type/ClassInterfacesType.java (keywords): Reworked keyword |
||||||
|
list. |
||||||
|
|
||||||
|
* jode/decompiler/OuterValues.java (implicitOuterClass): New field. |
||||||
|
(isImplicitOuterClass): new Method. |
||||||
|
(setImplicitOuterClass): new Method. |
||||||
|
|
||||||
|
* jode/flow/TransformConstructors.java (checkAnonymousConstructor): |
||||||
|
Check for implicitOuterClass, a new javac 1.3 construct. |
||||||
|
|
||||||
|
* jode/expr/FieldOperator.java.in (dumpSource): Removed this |
||||||
|
simplification nonesense. Now Outer.this is never printed as |
||||||
|
this. |
||||||
|
|
||||||
|
* jode/expr/InvokeOperator.java.in (dumpSource): Removed this |
||||||
|
simplification nonesense. Now Outer.this is never printed as |
||||||
|
this. |
||||||
|
Handle implicitOuterClass. |
||||||
|
|
||||||
|
2001-04-10 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/decompiler/Main.java (usage): Reworked usage message. |
||||||
|
|
||||||
|
2001-04-09 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/bytecode/SearchPath.java: Bug fixes from Joe Bronkema: |
||||||
|
(exists): Don't replace '/' with fileSeparator in original |
||||||
|
filename; make a copy instead. |
||||||
|
(getFile): likewise. |
||||||
|
(isDirectory): likewise. |
||||||
|
(listFiles): Reset fileNr when a new directory is read. |
||||||
|
|
||||||
|
2001-02-28 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* acinclude.m4 (JODE_CHECK_CLASS): Changed "test -e" to "-f" since |
||||||
|
-e is not supported on all architectures (Solaris) and -f is more |
||||||
|
correct anyway. |
||||||
|
Reported by Erik Modén. |
||||||
|
|
||||||
|
2001-02-27 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/swingui/Main.java.in (AreaWriter): Convert all kinds of |
||||||
|
line breaks (CR+LF, CR, LF) to a LF character, which a JTextArea |
||||||
|
understands. |
||||||
|
|
||||||
|
2001-02-08 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/expr/StoreInstruction.java (dumpExpression): Java doesn't |
||||||
|
allow parenthesis around left hand side, so use NO_PAREN and don't |
||||||
|
call lhs.dumpExpression() with priority. |
||||||
|
* jode/expr/PrePostFixOperator.java (dumpExpression): likewise. |
||||||
|
* jode/expr/IIncOperator.java (dumpExpression): likewise. |
||||||
|
* jode/flow/TransformConstructors.java (jikesAnonInner): Removed, |
||||||
|
since it wasn't used: This information is stored in OuterValues |
||||||
|
now. |
||||||
|
* jode/decompiler/LocalInfo.java (isConstant): Always return true |
||||||
|
so that inner classes that access final locals work, even if we |
||||||
|
can't decide that the local can be final. |
||||||
|
|
||||||
|
2001-02-05 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/expr/InvokeOperator.java.in (Environment.invokeMethod): |
||||||
|
Fixed the call to ClassInfo.forName: it expects a class name, while |
||||||
|
ref.getClazz() gives a type signature. |
||||||
|
* jode/flow/TransformExceptionHandlers.java.in: |
||||||
|
(checkAndRemoveJSR): Only invoke removeBadJSR, if there are |
||||||
|
successors left. |
||||||
|
(checkAndRemoveMonitorExit): likewise. |
||||||
|
|
||||||
|
2001-02-04 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/expr/IfThenElseOperator.java (simplify): Allow in the class$ |
||||||
|
simplification the then and else part to be swapped. |
||||||
|
* jode/bytecode/ClassInfo.java.in (read): Accept class version |
||||||
|
1.3. |
||||||
|
* jode/type/ClassInterfacesType.java (keywords): Added the package |
||||||
|
and import keywords. |
||||||
|
* jode/flow/TransformExceptionHandlers.java.in: |
||||||
|
(getPredecessor): New function. |
||||||
|
(getMonitorExitSlot): New function. |
||||||
|
(skipFinExitChain): New function. |
||||||
|
(removeJSR): Replaced by ... |
||||||
|
(removeBadJSR): ... this. |
||||||
|
(checkAndRemoveJSR): Use the new functions. Much simpler and |
||||||
|
handles nested synchronized blocks. It now traces the whole JSR |
||||||
|
and monitorexit chain before a jump to the first entry via |
||||||
|
skipFinExitChain, then checks and remove the first JSR |
||||||
|
resp. monitorexit. JSR jumps are simply ignored now. |
||||||
|
(checkAndRemoveMonitorExit): likewise. |
||||||
|
* jode/flow/StructuredBlock.java.in (prependBlock): New function. |
||||||
|
* jode/flow/CatchBlock.java.in (makeDeclaration): Generate name |
||||||
|
of dummyLocal, since nobody else will generate it. |
||||||
|
|
||||||
|
2001-02-03 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/bytecode/BytecodeInfo.java.in (read): Remove bogus |
||||||
|
exceptionHandlers, whose catchers just throw the exception again. |
||||||
|
This kind of entries are inserted by an obfuscator and would break |
||||||
|
JODE. |
||||||
|
* jode/util/UnifyHash.java.in (iterateHashCode): Call cleanUp, |
||||||
|
to clean unneeded references. |
||||||
|
* jode/flow/TransformConstructors.java (transformOneField): |
||||||
|
Changed to private. Take field number as parameter. Check that |
||||||
|
expression doesn't contain a FieldOperator for a later field of |
||||||
|
the same class or a PutFieldOperator. Changed all callers. |
||||||
|
|
||||||
|
2001-02-01 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/jvm/CodeVerifier.java.in (Type.mergeType): If array elem |
||||||
|
types can't be merged, return tObject as common super type. |
||||||
|
* jode/type/ArrayType.java (getGeneralizedType): If array elem |
||||||
|
type can't be intersected, return tObject as common super type. |
||||||
|
* jode/flow/TransformExceptionHandlers.java.in: Merged patch from |
||||||
|
the 1.2 tree to support javac 1.3 synchronized blocks. Doesn't |
||||||
|
handle nested synchronized blocks yet. |
||||||
|
* jode/expr/Expression.java.in (dumpExpression): Show runtime |
||||||
|
exception when it occurs. |
||||||
|
|
||||||
|
2001-01-31 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/expr/Expression.java.in (updateParentTypes): Call setType, |
||||||
|
instead of merging the types. Other childs want to know about the |
||||||
|
type change as well. |
||||||
|
* jode/decompiler/LocalInfo.java (combineWith): Reorganized a bit, |
||||||
|
but no changes. |
||||||
|
* jode/expr/InvokeOperator.java.in (dumpExpression): Always print |
||||||
|
the ThisOperator if a field is from a parent class of an outer |
||||||
|
class is used. And always qualify the this operator if not |
||||||
|
innermost. |
||||||
|
|
||||||
|
2001-01-30 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/jvm/SyntheticAnalyzer.java.in (checkConstructorAccess): |
||||||
|
Allow the special unifyParam to be the last parameter. |
||||||
|
|
||||||
|
2001-01-30 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/decompiler/TabbedPrintWriter.java: Better gnu style handling: |
||||||
|
(openBraceClass) (closeBraceClass) |
||||||
|
(openBraceNoIndent) (closeBraceNoIndent): new functions. |
||||||
|
(closeBraceNoSpace): Removed. |
||||||
|
* jode/decompiler/Options.java (GNU_SPACING): new constant. |
||||||
|
(GNU_STYLE): changed to include GNU_SPACING. |
||||||
|
* jode/decompiler/ClassAnalyzer.java.in (dumpSource): Use |
||||||
|
open/closeBraceClass. |
||||||
|
* jode/decompiler/MethodAnalyzer.java.in (dumpSource): Use |
||||||
|
open/closeBraceNoIndent. Insert a space for GNU_SPACING. |
||||||
|
* jode/decompiler/InvokeOperator.java.in (dumpExpression): Insert |
||||||
|
a space for GNU_SPACING, use open/closeBraceClass for inner |
||||||
|
classes. |
||||||
|
* jode/decompiler/UnaryOperator.java (dumpExpression): Insert |
||||||
|
a space for GNU_SPACING. |
||||||
|
|
||||||
|
2001-01-30 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
Added pascal style from Rolf Howarth <rolf@squarebox.co.uk> |
||||||
|
* jode/decompiler/Options.java (PASCAL_STYLE): new constant. |
||||||
|
(BRACE_FLUSH_LEFT): dito. |
||||||
|
* jode/decompiler/Decompiler.java (setOption): detect pascal option. |
||||||
|
* jode/decompiler/Main.java (main): dito. |
||||||
|
* jode/decompiler/TabbedPrintWriter.java (openBrace, |
||||||
|
openBraceContinue, closeBrace, closeBraceNoSpace, |
||||||
|
closeBraceContinue): handle flush left. |
||||||
|
|
||||||
|
2001-01-30 Jochen Hoenicke <jochen@gnu.org> |
||||||
|
|
||||||
|
* jode/type/NullType.java (intersection): Removed, since the |
||||||
|
version in ReferenceType is more correct. Before |
||||||
|
tNull.isOfType(tRange(X,tNull)) returned false, which lead to |
||||||
|
incorrect behaviour in InvokeOperator.needsCast. |
||||||
|
* jode/decompiler/FieldAnalyzer.java.in (dumpSource): Removed the |
||||||
|
"= null" hack for final fields; it was not correct, since the |
||||||
|
field could be initialized in a constructor. |
||||||
|
* jode/decompiler/TabbedPrintWriter.java (BreakPoint.endOp): |
||||||
|
Simplified the code, copy options always from child. |
||||||
|
* jode/jvm/SyntheticAnalyzer.java.in (unifyParam): new field. |
||||||
|
(checkConstructorAccess): Allow the special Parameter, whose |
||||||
|
purpose is to distinguish the wrapper from the real constructor |
||||||
|
and give him a "$" in the type signature, to appear at every |
||||||
|
position. It doesn't appear at position 1 for inner classes. |
||||||
|
Store the position in unifyParam. |
||||||
|
* jode/expr/InvokeOperator.java (isGetClass): Allow the method to |
||||||
|
be declared inside an outer class: We simply check if we can get |
||||||
|
the method analyzer. |
||||||
|
(simplify): handle unifyParam. |
||||||
|
* jode/expr/PopOperator.java (getBreakPenalty): return penalty of |
||||||
|
inner expression. (dumpExpression): Call dumpExpression of |
||||||
|
subexpression immediately without priority. |
@ -1,5 +1,5 @@ |
|||||||
## Input file for automake to generate the Makefile.in used by configure
|
## Input file for automake to generate the Makefile.in used by configure
|
||||||
|
|
||||||
SUBDIRS = jode bin doc test
|
SUBDIRS = bin doc jode test
|
||||||
|
|
||||||
EXTRA_DIST = TODO
|
EXTRA_DIST = jcpp
|
||||||
|
@ -0,0 +1,5 @@ |
|||||||
|
Joe Bronkema <joseph.d.bronkema at lmco.com> |
||||||
|
Rolf Howarth <rolf at squarebox.co.uk> for pascal indentaton style. |
||||||
|
Erik Modén <Erik.Moden at emw.ericsson.se> |
||||||
|
Martin Schmitz <m.schmitz at e-sign.com> for finding many bugs in the obfuscator. |
||||||
|
zzzeek <classic at io.com> |
@ -1,2 +1,3 @@ |
|||||||
Makefile |
Makefile |
||||||
Makefile.in |
Makefile.in |
||||||
|
*.html |
||||||
|
@ -1,14 +1,46 @@ |
|||||||
## Input file for automake to generate the Makefile.in used by configure
|
## Input file for automake to generate the Makefile.in used by configure
|
||||||
|
|
||||||
EXTRA_DIST = \
|
PHP_FILES = \
|
||||||
applet.html \ |
applet.php \ |
||||||
download.html.in \ |
bluesky.php \ |
||||||
history.html \ |
download.php \ |
||||||
jode.html \ |
faq.php \ |
||||||
license.html \ |
feedback.php \ |
||||||
links.html \ |
history.php \ |
||||||
usage.html \ |
index.php \ |
||||||
|
license.php \ |
||||||
|
links.php \ |
||||||
|
usage.php |
||||||
|
|
||||||
|
HTML_FILES = $(PHP_FILES:%.php=$(srcdir)/%.html)
|
||||||
|
# noinst_DATA = $(HTML_FILES)
|
||||||
|
|
||||||
|
EXTRA_DIST = $(PHP_FILES) $(notdir $(HTML_FILES)) \
|
||||||
|
header.inc \ |
||||||
|
menu.inc \ |
||||||
|
footer.inc \ |
||||||
|
a-logo.gif \ |
||||||
myproject.jos \ |
myproject.jos \ |
||||||
dasm_to_java.perl \ |
dasm_to_java.perl \ |
||||||
gimp/jode-logo.xcf \ |
gimp/jode-logo.xcf \ |
||||||
jode-logo.gif |
jode-logo.gif |
||||||
|
|
||||||
|
.PHONY: public_html_symlink |
||||||
|
|
||||||
|
# The following rules require that you have an apache with php on
|
||||||
|
# localhost with standard user public_html directories and
|
||||||
|
# FollowSymLink enabled.
|
||||||
|
|
||||||
|
PUBLIC_HTML=$(HOME)/public_html
|
||||||
|
JODE_PHP_DIR=jode_php
|
||||||
|
|
||||||
|
public_html_symlink: |
||||||
|
rm -f $(PUBLIC_HTML)/$(JODE_PHP_DIR)
|
||||||
|
@RELDIR=`pwd | sed s!^$(HOME)!..!`; \
|
||||||
|
ln -sf $$RELDIR/$(srcdir) $(PUBLIC_HTML)/$(JODE_PHP_DIR); \
|
||||||
|
echo Created symlink to $$RELDIR/$(srcdir).
|
||||||
|
|
||||||
|
footer.inc: public_html_symlink |
||||||
|
|
||||||
|
$(srcdir)/%.html: %.php footer.inc header.inc menu.inc |
||||||
|
lynx -source http://localhost/~$(LOGNAME)/$(JODE_PHP_DIR)/$(notdir $<)?extension=html > $@
|
||||||
|
After Width: | Height: | Size: 894 B |
@ -1,97 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
<h1>The <i>JODE</i> Applet</h1> |
|
||||||
|
|
||||||
Please be patience, loading the applet may take some time.<br><br> |
|
||||||
|
|
||||||
<center> |
|
||||||
<applet code="jode/Applet.class" archive="jode-applet.jar" width=540 height=400> |
|
||||||
<param name=pagecolor value="ffffff"> |
|
||||||
<param name=classpath value="http://jode.sourceforge.net/load.html/http%3a//www.informatik.uni-oldenburg.de/~mw/plasma.jar"> |
|
||||||
<param name=class value="PlasmaApplet"> |
|
||||||
<p>Sorry you need a java enabled browser to test a java applet ;-)</p> |
|
||||||
<p>Don't read the rest, it only contains information about the applet.</p> |
|
||||||
</applet> |
|
||||||
</center><br> |
|
||||||
|
|
||||||
Press the start button to decompile <a |
|
||||||
href="http://www.informatik.uni-oldenburg.de/~mw/plasma.html">Michael's |
|
||||||
Plasma applet</a> (and give the decompiler some time to download the |
|
||||||
jar file). <br><br> |
|
||||||
|
|
||||||
You may change the classpath to point to a zip or jar file of your |
|
||||||
choice, using a similar syntax. Use <code>%3a</code> instead of a |
|
||||||
colon `:' in the url. You can also point it to a directory containing |
|
||||||
the class-files (include a slash `/' at the end in this case), but |
|
||||||
this is not recommended, since it is <i>very</i> slow. You may give |
|
||||||
multiple entries in the class path field separated by a comma.<br><br> |
|
||||||
|
|
||||||
You can't use this applet for local files; the class files must be on |
|
||||||
a server that is accessible from sourceforge. You can try to give |
|
||||||
local filenames directly without the load.html wrapper, but that is |
|
||||||
probably forbidden by your browser. Most browser only allow loading |
|
||||||
files from the same server as the applet, and this is the reason why |
|
||||||
you have to use such a cryptic URL.<br><br> |
|
||||||
|
|
||||||
Save probably doesn't work, because it is forbidden by your browser.<br><br> |
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
@ -1,36 +1,38 @@ |
|||||||
<?php require("header.inc"); ?> |
<?php require("header.inc"); ?> |
||||||
<h1>The <i>JODE</i> Applet</h1> |
<h1>The <i>JODE</i> Applet</h1> |
||||||
|
|
||||||
Please be patience, loading the applet may take some time.<br><br> |
<p>Please be patience, loading the applet may take some time.</p> |
||||||
|
|
||||||
<center> |
<center> |
||||||
<applet code="jode/Applet.class" archive="jode-applet.jar" width=540 height=400> |
<applet code="jode/Applet.class" archive="jode-applet.jar" width=540 height=400> |
||||||
<param name=pagecolor value="ffffff"> |
<param name=pagecolor value="ffffff"> |
||||||
<param name=classpath value="http://jode.sourceforge.net/load.php/http%3a//www.informatik.uni-oldenburg.de/~mw/plasma.jar"> |
<param name=classpath value="http://jode.sourceforge.net/http/www.informatik.uni-oldenburg.de/~mw/plasma.jar"> |
||||||
<param name=class value="PlasmaApplet"> |
<param name=class value="PlasmaApplet"> |
||||||
<p>Sorry you need a java enabled browser to test a java applet ;-)</p> |
<p>Sorry you need a java enabled browser to test a java applet ;-)</p> |
||||||
<p>Don't read the rest, it only contains information about the applet.</p> |
<p>Don't read the rest, it only contains information about the applet.</p> |
||||||
</applet> |
</applet> |
||||||
</center><br> |
</center><br> |
||||||
|
|
||||||
Press the start button to decompile <a |
<p> Press the start button to decompile <a |
||||||
href="http://www.informatik.uni-oldenburg.de/~mw/plasma.html">Michael's |
href="http://www.informatik.uni-oldenburg.de/~mw/plasma.html">Michael's |
||||||
Plasma applet</a> (and give the decompiler some time to download the |
Plasma applet</a> (and give the decompiler some time to download the |
||||||
jar file). <br><br> |
jar file). </p> |
||||||
|
|
||||||
You may change the classpath to point to a zip or jar file of your |
You may change the classpath to point to a zip or jar file of your |
||||||
choice, using a similar syntax. Use <code>%3a</code> instead of a |
choice, using a similar syntax. Only http and ftp addresses are supported. |
||||||
colon `:' in the url. You can also point it to a directory containing |
The file must be available from the world wide web. In fact you download it |
||||||
|
from Sourceforge and Sourceforge gets it from the given address. This hack |
||||||
|
is necessary, because Java's security policy doesn't allow applets to contact |
||||||
|
a different server. You can also point the classpath to a directory containing |
||||||
the class-files (include a slash `/' at the end in this case), but |
the class-files (include a slash `/' at the end in this case), but |
||||||
this is not recommended, since it is <i>very</i> slow. You may give |
this is not recommended, since it is <i>very</i> slow. You may give |
||||||
multiple entries in the class path field separated by a comma.<br><br> |
multiple entries in the class path field separated by a comma.<br><br> |
||||||
|
|
||||||
You can't use this applet for local files; the class files must be on |
You can't use this applet for local files. You can try to give |
||||||
a server that is accessible from sourceforge. You can try to give |
local filenames directly without going through Sourceforge, but that is |
||||||
local filenames directly without the load.php wrapper, but that is |
|
||||||
probably forbidden by your browser. Most browser only allow loading |
probably forbidden by your browser. Most browser only allow loading |
||||||
files from the same server as the applet, and this is the reason why |
files from the same server as the applet, and this is the reason why |
||||||
you have to use such a cryptic URL.<br><br> |
you have to use such a weird URL.<br><br> |
||||||
|
|
||||||
Save probably doesn't work, because it is forbidden by your browser.<br><br> |
Save probably doesn't work, because it is forbidden by your browser.<br><br> |
||||||
<?php require("footer.inc"); ?> |
<?php require("footer.inc"); ?> |
||||||
|
@ -1,133 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
<h1>Blue Sky</h1> |
|
||||||
|
|
||||||
<p>This section contains features that I think would be great to have, |
|
||||||
but are also very hard to implement. The name of the section is |
|
||||||
inspired, by <a |
|
||||||
href="http://www.mozilla.org/blue-sky/">Mozilla</a>.</p> |
|
||||||
|
|
||||||
<p>Currently this are all my own ideas. But if you send me an idea |
|
||||||
for an interesting feature, I will add it to this list.</p> |
|
||||||
|
|
||||||
<h2><i>Out</i>line inlined methods</h2> |
|
||||||
|
|
||||||
<p>If java gets called with `<code>-O</code>' switch, it inlines methods, |
|
||||||
that are private, final, or static and contain no loops. When |
|
||||||
decompiling this it sometimes produces really ugly code. The right |
|
||||||
way to solve this would be to <i>out</i>line the code again. This is |
|
||||||
possible but requires to find the inlined method. </p> |
|
||||||
|
|
||||||
<p>The name `outline' was suggested by <a |
|
||||||
href="http://www.informatik.uni-oldenburg.de/~mw">Michael</a>. |
|
||||||
</p> |
|
||||||
|
|
||||||
<h2>Better names of local variables</h2> |
|
||||||
|
|
||||||
<p>The local variable naming is very stupid. Even with pretty it just |
|
||||||
names the variable after the type with a unifying number appended. A |
|
||||||
method containing very much objects of the same type looks very |
|
||||||
ugly. </p> |
|
||||||
|
|
||||||
<p>My plan is looking at the assignments. If we have locals in |
|
||||||
assignments |
|
||||||
<pre> |
|
||||||
int l_1 = array.length |
|
||||||
String l_2 = object.getName() |
|
||||||
</pre> |
|
||||||
we could name them "length" and "name". If we |
|
||||||
have assignments: |
|
||||||
<pre> |
|
||||||
MenuItem local_1 = new MenuItem("Open"); |
|
||||||
MenuItem local_2 = new MenuItem("Save"); |
|
||||||
</pre> |
|
||||||
good names would be <code>miOpen</code> and <code>miSave</code>. </p> |
|
||||||
|
|
||||||
<p>It is currently possible to assign a <i>(hint name,type)</i> pair |
|
||||||
to a local. If the type matches, the local will be named after |
|
||||||
<i>hint name</i>. This could be extended by giving them several |
|
||||||
weighted hints and constructing the name in an intelligent way. </p> |
|
||||||
|
|
||||||
<h2>Better deobfuscation features</h2> |
|
||||||
<p>First there should be a good Renamer: Methods that simply |
|
||||||
return a field value should be renamed to get<i>FieldName</i>. |
|
||||||
Fields should be named after their type, maybe also by assignments |
|
||||||
(see section about local variable names).</p> |
|
||||||
|
|
||||||
<p>The deobfuscator should detect inner and anonymous variables, |
|
||||||
synthetic methods and so on, and rename them accordingly.</p> |
|
||||||
|
|
||||||
<h2>Handling of Class.forName in obfuscator</h2> |
|
||||||
<p>The obfuscator should detect Class.forName constructs (and |
|
||||||
similarly for methods and fields) and if their parameters are constant |
|
||||||
it should change the parameter according to the rename function. </p> |
|
||||||
|
|
||||||
<h2>Merging javadoc comments</h2> |
|
||||||
<p>It would be nice if the decompiler could merge the javadoc comments |
|
||||||
into the class file. More and more people use javadoc to comment the |
|
||||||
public api of their java classes. It shouldn't be too difficult to |
|
||||||
copy them back into the java code. </p> |
|
||||||
|
|
||||||
<p>This doesn't need to be built into the decompiler. A script that takes |
|
||||||
the javadoc pages and the decompiled code can easily merge them.</p> |
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
@ -1,92 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
<h2>Download</h2> |
|
||||||
|
|
||||||
The latest source code of <i>JODE</i> is available at the <a href="http://sourceforge.net/project/?group_id=3790">project page</a>. |
|
||||||
You need several other packages to build <i>JODE</i>, check the <a href="./links.html">links page</a>. <br><br> |
|
||||||
|
|
||||||
The simplest way to get it, especially for non unix users, is in |
|
||||||
precompiled form, though. I have two jar archives at the <a |
|
||||||
href="ftp://jode.sourceforge.net/pub/jode">ftp server</a>. You may |
|
||||||
need to press shift while clicking on the link, depending on your |
|
||||||
browser. |
|
||||||
|
|
||||||
|
|
||||||
<ul> <li><a href="ftp://jode.sourceforge.net/pub/jode/jode-1.0.93-1.1.jar">jode-1.0.93-1.1.jar</a> is for JDK 1.1. It already |
|
||||||
contains Getopt and the collection classes from the GNU Classpath |
|
||||||
project. If you want to use the swing interface, you have to download |
|
||||||
swing separately. </li> |
|
||||||
|
|
||||||
<li> <a href="ftp://jode.sourceforge.net/pub/jode/jode-1.0.93-1.2.jar">jode-1.0.93-1.2.jar</a> is for JDK 1.2. It already |
|
||||||
contains Getopt, so you don't need any other package.</li> </ul> |
|
||||||
|
|
||||||
<h2>CVS Repository</h2> |
|
||||||
|
|
||||||
You can get the latest sources from the <a href="http://sourceforge.net/cvs/?group_id=3790">CVS repository</a>. |
|
||||||
Follow the instruction on that page; use <code>jode</code> as |
|
||||||
<i>modulename</i>. Then change to the directory jode and run |
|
||||||
|
|
||||||
<pre>aclocal && automake -a && autoconf</pre> |
|
||||||
|
|
||||||
Afterwards follow the instruction in the INSTALL file. |
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
@ -1,40 +1,40 @@ |
|||||||
<?php require("header.inc"); ?> |
<?php require("header.inc"); ?> |
||||||
<h2>Download</h2> |
<h1>Download</h1> |
||||||
|
|
||||||
The latest source code of <i>JODE</i> is available at the <?php |
<p>Jode is available in the <? |
||||||
sflink("project/") ?>project page</a>. |
sflink("project/showfiles.php")?>download area</a> in source or |
||||||
You need several other packages to build <i>JODE</i>, check the <?php |
binary form. For compiling the source code, you need several other |
||||||
selflink("links") ?>links page</a>. <br><br> |
packages, check the <?php selflink("links") ?>links page</a>. You
|
||||||
|
need a unix like environment for compilation.</p> |
||||||
|
|
||||||
The simplest way to get it, especially for non unix users, is in |
<p>The simplest way to get it, especially for non unix users, is in |
||||||
precompiled form, though. I have two jar archives at the <a |
precompiled form, though. There are two jar archives in the download |
||||||
href="ftp://jode.sourceforge.net/pub/jode">ftp server</a>. You may |
area:</P> |
||||||
need to press shift while clicking on the link, depending on your |
|
||||||
browser. |
|
||||||
|
|
||||||
<?php |
<ul> <li>jode-1.1-JDK1.1.jar is for JDK 1.1. If you want to use |
||||||
function jarlink($what) { |
the swing interface, you have to download swing separately, all other |
||||||
global $version; |
packages are already included in the archive. </li> |
||||||
echo "<a href=\"ftp://jode.sourceforge.net/pub/jode/jode-".$version.$what; |
|
||||||
echo ".jar\">jode-".$version.$what.".jar</a>"; |
|
||||||
} ?> |
|
||||||
|
|
||||||
<ul> <li><?php jarlink("-1.1") ?> is for JDK 1.1. It already
|
<li>jode-1.1.jar is for JDK 1.2 or better. It should run |
||||||
contains Getopt and the collection classes from the GNU Classpath |
without any other package.</li> </ul> </p> |
||||||
project. If you want to use the swing interface, you have to download |
|
||||||
swing separately. </li> |
|
||||||
|
|
||||||
<li> <?php jarlink("-1.2") ?> is for JDK 1.2. It already
|
<h1>CVS Repository</h1> |
||||||
contains Getopt, so you don't need any other package.</li> </ul> |
|
||||||
|
|
||||||
<h2>CVS Repository</h2> |
<p>You can get the latest sources from the <?php sflink("cvs/") ?> CVS
|
||||||
|
repository</a>. Follow the instruction on that page; use |
||||||
|
<code>jode</code> as <i>modulename</i>. If you want to checkout a |
||||||
|
specific version you can use the <code>-r</code> option:</p> |
||||||
|
|
||||||
You can get the latest sources from the <?php sflink("cvs/") ?> |
<ul> |
||||||
CVS repository</a>. |
<li><code>-r jode_1_0_93</code>: checks out the version 1.0.93</li> |
||||||
Follow the instruction on that page; use <code>jode</code> as |
<li><code>-r branch_1_1</code>: checks out the latest version in the |
||||||
<i>modulename</i>. Then change to the directory jode and run |
1.1 series.</li> </ul> |
||||||
|
|
||||||
|
<p>To build the sources from CVS change to the main directory where |
||||||
|
the <code>configure.in</code> file resides and run |
||||||
|
|
||||||
<pre>aclocal && automake -a && autoconf</pre> |
<pre>aclocal && automake -a && autoconf</pre> |
||||||
|
|
||||||
Afterwards follow the instruction in the INSTALL file. |
Afterwards follow the instruction in the INSTALL file. </p> |
||||||
<?php require("footer.inc"); ?> |
<?php require("footer.inc"); ?> |
||||||
|
|
||||||
|
@ -0,0 +1,72 @@ |
|||||||
|
<?php require("header.inc"); ?>
|
||||||
|
|
||||||
|
<h1>FAQ - Frequently Asked Questions</h1> |
||||||
|
|
||||||
|
This is a list of some questions that pop up from time to time. |
||||||
|
|
||||||
|
<h2>Decompiler issues</h2> |
||||||
|
|
||||||
|
<h3>The decompiler crashes with a VerifyException, what can I do?</h3> |
||||||
|
|
||||||
|
<p>The class isn't verifiable, probably because there is not enough |
||||||
|
information about used classes. See the question about the |
||||||
|
classpath.</p> |
||||||
|
|
||||||
|
<p>This could also be caused by malicious bytecode, or because there |
||||||
|
is a bug in Jode's verifier.</p> |
||||||
|
|
||||||
|
<h3>What should be included in the classpath?</h3> |
||||||
|
|
||||||
|
<p>Jode needs to know the full class hierarchie to guess the types. |
||||||
|
This includes not only the classes in the program, but also the |
||||||
|
libraries used by the java program, even the Java runtime library. |
||||||
|
You should set the classpath to include all these classes.</p> |
||||||
|
|
||||||
|
<p>If you don't specify the classpath on the command line, Jode uses |
||||||
|
the same as your Java Virtual Machine.</p> |
||||||
|
|
||||||
|
<p>As last resort, if Jode can't find a class in the classpath it uses |
||||||
|
reflection to ask the Virtual Machine. This works quite well, but |
||||||
|
loading classes can have side effects, e.g. when AWT classes are |
||||||
|
loaded, an AWT thread is created, even though Jode doesn't need |
||||||
|
it.</p> |
||||||
|
|
||||||
|
<h3>Why doesn't Jode decompile my inner class |
||||||
|
<code>MyClass$Inner.class</code>?</h3> |
||||||
|
|
||||||
|
<p>You should decompile the outermost class (<code>MyClass</code> in |
||||||
|
this case). The produced code contains the inner class. </p> |
||||||
|
|
||||||
|
<h2>Obfuscator issues</h2> |
||||||
|
|
||||||
|
<h3>What should be included in the classpath?</h3> |
||||||
|
|
||||||
|
<p>The program, all libraries, the Java runtime library. Don't omit a |
||||||
|
library even when you don't want to obfuscate it.</p> |
||||||
|
|
||||||
|
<h3>What should I preserve</h3> |
||||||
|
|
||||||
|
<p>The most common mistake is to preserve a class. In most cases this |
||||||
|
is not what you want. This only makes sure the class won't be |
||||||
|
renamed, it doesn't prevent it from being stripped. Instead you |
||||||
|
should preserve methods and constructors. The constructor is just a |
||||||
|
method with the special name <tt><init&rt;</tt>. </p> |
||||||
|
|
||||||
|
<p> Another common mistake is to omit the type |
||||||
|
signature, e.g. to preserve <tt>Class.main</tt> instead of |
||||||
|
<tt>Class.main.([Ljava/lang/String;)V</tt>. That doesn't work. If |
||||||
|
you don't want to care about the format of the type signature use a |
||||||
|
wildcard as in <tt>Class.main.*</tt>. </p> |
||||||
|
|
||||||
|
<h3>What is a type signature</h3> |
||||||
|
|
||||||
|
<p>The type signature is a machine readable representation of a java |
||||||
|
type that is used all over in java bytecode. The JDK ships a command |
||||||
|
named <tt>javap</tt>. With <tt>java -s</tt> you can lists the fields |
||||||
|
and methods of a class with their type signatures.</p> |
||||||
|
|
||||||
|
<p> If you are interested in the format of type signatures read the |
||||||
|
Java Virtual Machine Specification, Chapter 4.3 Descriptors</p> |
||||||
|
|
||||||
|
<?php require("footer.inc"); ?> |
||||||
|
|
@ -0,0 +1,14 @@ |
|||||||
|
<?php require("header.inc"); ?>
|
||||||
|
|
||||||
|
<h1>Feedback</h1> |
||||||
|
|
||||||
|
<p>You can report bugs to the <?php sflink("bugs/")?>bug forum</a>. </p>
|
||||||
|
|
||||||
|
<p>You can contact me by email via <a |
||||||
|
href="http://sourceforge.net/sendmessage.php?touser=18252">hoenicke at |
||||||
|
users.sourceforge.net</a>. Please mention <i>jode</i> in the |
||||||
|
subject.</p> |
||||||
|
|
||||||
|
<p>There is a mailing list. Check <a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">this page</a> for subscription informations.</p> |
||||||
|
|
||||||
|
<?php require("footer.inc"); ?>
|
@ -1,84 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
<h2>History</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. So I wrote a |
|
||||||
small <a href="dasm_to_java.perl"><code>perl</code> script</a> that |
|
||||||
did this process automatically. At the end of the next day I had my |
|
||||||
first working decompiler.</p> |
|
||||||
|
|
||||||
<p>Now while the <code>perl</code> script is working, it is not easy |
|
||||||
to use. You have to decompile the code first with a disassembler, cut |
|
||||||
out the code of a single method, and run the perl script on it. I |
|
||||||
decided to get the bytecode directly out of the class files and do |
|
||||||
this all automatically. I decided to write it in <code>java</code> |
|
||||||
now, because it suited best.</p> |
|
||||||
|
|
||||||
<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> |
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
||||||
|
|
@ -1,131 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
|
|
||||||
|
|
||||||
<P><i>JODE</i> is a java package containing a decompiler and an |
|
||||||
optimizer for java. This package is freely available under the GPL |
|
||||||
(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, |
|
||||||
obfuscated, 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>JODE</i> is now hosted by <a href="http://sourceforge.net/">SourceForge</a>.</li> |
|
||||||
<li>The latest <a href="http://sourceforge.net/cvs/?group_id=3790">CVS</a> version breaks long lines</li> |
|
||||||
<li>I can now decompile <b>inner and anonymous</b> classes.</li> |
|
||||||
<li>The optimizer (aka obfuscator) can be customized via a small |
|
||||||
config file</li> |
|
||||||
<li>Jode is <tt>autoconf</tt>igured.</li> |
|
||||||
</ul> |
|
||||||
|
|
||||||
<h2>Limitations</h2> |
|
||||||
|
|
||||||
<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 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 may provoke this. In that case you can run |
|
||||||
the Obfuscator first (to optimize away the flow obfuscation ;-).</p> |
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
@ -1,76 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
<p><i>JODE</i> is Copyright © 1998-2000 by Jochen Hoenicke. <br><br> |
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify |
|
||||||
it under the terms of the <a |
|
||||||
href="http://www.gnu.org/copyleft/gpl.html">GNU General Public |
|
||||||
License</a> as published by the Free Software Foundation; either |
|
||||||
version 2 of the License, or (at your option) any later version.<br><br> |
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
|
||||||
but <b>without any warranty</b>; without even the implied warranty of |
|
||||||
<b>merchantability</b> or <b>fitness for a particular purpose</b>. See the |
|
||||||
GNU General Public License for more details. |
|
||||||
|
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
@ -1,15 +1,16 @@ |
|||||||
<?php require("header.inc"); ?> |
<?php require("header.inc"); ?> |
||||||
|
<h1>License</h1> |
||||||
<p><i>JODE</i> is Copyright © 1998-2000 by Jochen Hoenicke. <br><br> |
<p><i>JODE</i> is Copyright © 1998-2000 by Jochen Hoenicke. <br><br> |
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify |
<p>This program is free software; you can redistribute it and/or modify |
||||||
it under the terms of the <a |
it under the terms of the <a |
||||||
href="http://www.gnu.org/copyleft/gpl.html">GNU General Public |
href="http://www.gnu.org/copyleft/gpl.html">GNU General Public |
||||||
License</a> as published by the Free Software Foundation; either |
License</a> as published by the Free Software Foundation; either |
||||||
version 2 of the License, or (at your option) any later version.<br><br> |
version 2 of the License, or (at your option) any later version.</p> |
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
<p>This program is distributed in the hope that it will be useful, |
||||||
but <b>without any warranty</b>; without even the implied warranty of |
but <b>without any warranty</b>; without even the implied warranty of |
||||||
<b>merchantability</b> or <b>fitness for a particular purpose</b>. See the |
<b>merchantability</b> or <b>fitness for a particular purpose</b>. See the |
||||||
GNU General Public License for more details. |
GNU General Public License for more details.</p> |
||||||
|
|
||||||
<?php require("footer.inc"); ?> |
<?php require("footer.inc"); ?> |
||||||
|
@ -1,123 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
<h1><i>JODE</i> Links</h1> |
|
||||||
<h3>Other decompilers</h3> |
|
||||||
<ul> |
|
||||||
<li><a href="http://dmoz.org/Computers/Programming/Languages/Java/Decompilers_and_Disassemblers/">The Open Directory list</a></li> |
|
||||||
<li>A list of decompilers can be found at <a href="http://www.meurrens.org/ip-Links/Java/CodeEngineering/#tocDecompilersToJava">Marc Meurren's list</a> |
|
||||||
</li> |
|
||||||
<li>A very fast decompiler is <a |
|
||||||
href="http://www.geocities.com/SiliconValley/Bridge/8617/jad.html">jad</a> |
|
||||||
written in C++. It doesn't come with source code though, and misses |
|
||||||
some features <i>JODE</i> has ;-)</li> <li><a |
|
||||||
href="http://www.javaworld.com/javaworld/jw-07-1997/jw-07-decompilers.html">A |
|
||||||
comparison of three decompilers</a> (but not <i>JODE</i>) was done by Dave |
|
||||||
Dyer. |
|
||||||
</ul> |
|
||||||
<h3>Other obfuscators</h3> |
|
||||||
<ul> |
|
||||||
<li><a href="http://dmoz.org/Computers/Programming/Languages/Java/Obfuscators/">The Open Directory list</a></li> |
|
||||||
<li><a href="http://www.sbktech.org/hashjava_old.html">Hashjava</a> is another free obfuscator. It is no longer maintained, though, since its successor was commercialized.</li> |
|
||||||
<li><a href="http://www.zelix.com/klassmaster/index.html">Zelix |
|
||||||
Klassmaster</a> does a very good flow optimization and also decrypts |
|
||||||
strings. But <i>JODE</i>'s deobfuscator can undo both.</li> |
|
||||||
<li><a href="http://www.cs.arizona.edu/~collberg/Research/">Christian S. Collberg</a> has some really interesting papers about non reversible obfuscations.</li> |
|
||||||
</ul> |
|
||||||
<h3>Graphical User Interface</h3> |
|
||||||
<ul> |
|
||||||
<li><i>JODE</i> is used by the <a |
|
||||||
href="http://jedit.standmed.com/plugins/JavaInsight">JavaInsight plugin</a> for |
|
||||||
<a href="http://jedit.sourceforge.net/">jEdit</a>.</li> |
|
||||||
</ul> |
|
||||||
<h3>Miscellanous packages needed to run JODE</h3> |
|
||||||
<dl> |
|
||||||
<dt>CYGWIN (unix tools for win95/NT)</dt> |
|
||||||
<dd> |
|
||||||
<a href="http://sourceware.cygnus.com/cygwin/">http://sourceware.cygnus.com/cygwin/</a> |
|
||||||
</dd> |
|
||||||
<dt>JDK 1.1:</dt> |
|
||||||
<dd> |
|
||||||
<a href="http://java.sun.com/products/jdk/1.1/">http://java.sun.com/products/jdk/1.1/</a> |
|
||||||
</dd> |
|
||||||
<dt><a name="swing">Swing for JDK 1.1:</a><dt> |
|
||||||
<dd> |
|
||||||
<a href="http://java.sun.com/products/jfc/index.html#download-swing">http://java.sun.com/products/jfc/index.html#download-swing</a> |
|
||||||
</dd> |
|
||||||
<dt>JDK 1.2:</dt> |
|
||||||
<dd> |
|
||||||
<a href="http://java.sun.com/products/jdk/1.2/">http://java.sun.com/products/jdk/1.2/</a> |
|
||||||
</dd> |
|
||||||
<dt><a name="getopt">Getopt</a>:</dt> |
|
||||||
<dd> |
|
||||||
<a href="http://www.urbanophile.com/arenn/hacking/download.html#getopt">http://www.urbanophile.com/arenn/hacking/download.html#getopt</a> |
|
||||||
</dd> |
|
||||||
<dt><a name="collections">Collection Classes</a>:</dt> |
|
||||||
<dd>I have written a small script that puts the collection classes |
|
||||||
from the <a href="http://www.classpath.org">GNU Classpath Project</a> into |
|
||||||
its own package (<code>org.gnu.java.util.collections</code>). You can |
|
||||||
download the <a href="http://www.informatik.uni-oldenburg.de/~delwi/jode/collections.tar.gz">source code</a> (including |
|
||||||
the script), or <a href="collections.jar">a precompiled jar file</a>. |
|
||||||
</dd> |
|
||||||
</dl> |
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
||||||
|
|
@ -1,115 +1,47 @@ |
|||||||
<?php |
<?php |
||||||
$menu = array( |
$menu = |
||||||
"Jode", |
array("<B>Home</B>" , "selflink", "index", |
||||||
array("<B>Home</B>" , "selflink", "jode", |
|
||||||
"Project page" , "sflink", "project/", |
"Project page" , "sflink", "project/", |
||||||
"-", "-", "-", |
|
||||||
"Applet" , "selflink", "applet", |
"Applet" , "selflink", "applet", |
||||||
"Download" , "selflink", "download", |
"Download" , "selflink", "download", |
||||||
|
"FAQ" , "selflink", "faq", |
||||||
|
"Feedback" , "selflink", "feedback", |
||||||
"Documentation", "selflink", "usage", |
"Documentation", "selflink", "usage", |
||||||
"License" , "selflink", "license", |
"License" , "selflink", "license", |
||||||
"History" , "selflink", "history", |
"History" , "selflink", "history", |
||||||
"Links" , "selflink", "links", |
"Links" , "selflink", "links", |
||||||
"Blue Sky" , "selflink", "bluesky"), |
"Blue Sky" , "selflink", "bluesky"); |
||||||
"Feedback", |
?> |
||||||
array("Bug Tracking" , "sflink", "bugs/", |
|
||||||
"Public Forums" , "sflink", "forum/", |
|
||||||
"Mailing List" , "link", |
|
||||||
"http://lists.sourceforge.net/mailman/listinfo/jode-users", |
|
||||||
"Private Mail" , "link", |
|
||||||
"http://sourceforge.net/sendmessage.php?touser=18252"), |
|
||||||
"Download", |
|
||||||
array("FTP server", "link", "ftp://jode.sourceforge.net/pub/jode/", |
|
||||||
"Source releases", "sflink", "project/filelist.php")); |
|
||||||
|
|
||||||
$images = array( |
|
||||||
"Powered by ", "http://sourceforge.net/sflogo.php?group_id=3790&type=1", |
|
||||||
"SourceForge", "http://sourceforge.net", |
|
||||||
"Best viewed with ", "a-logo.gif", |
|
||||||
"Any Browser", "http://www.anybrowser.org/campaign/"); |
|
||||||
|
|
||||||
if (eregi("^Lynx", $HTTP_USER_AGENT)) { |
|
||||||
|
|
||||||
reset($menu); |
|
||||||
while (list($dummy, $header) = each($menu)) { |
|
||||||
list($dummy, $subitems) = each($menu); |
|
||||||
|
|
||||||
echo "<b>$header:</b>\n"; |
|
||||||
reset($subitems); |
|
||||||
while (list($dummy, $name) = each($subitems)) { |
|
||||||
list($dummy, $type) = each($subitems); |
|
||||||
list($dummy, $link) = each($subitems); |
|
||||||
if ($type == "selflink") { |
|
||||||
selflink($link); |
|
||||||
} else if ($type == "sflink") { |
|
||||||
sflink($link); |
|
||||||
} else if ($type == "-") { |
|
||||||
echo "<br>\n"; |
|
||||||
continue; |
|
||||||
} else if ($type == "link") { |
|
||||||
echo "<a href=\"$link\">"; |
|
||||||
} |
|
||||||
$name = ereg_replace(" ", " ", $name); |
|
||||||
echo "$name</a>"; |
|
||||||
if (current($subitems)) { |
|
||||||
echo " |\n"; |
|
||||||
} |
|
||||||
} |
|
||||||
echo "<br>\n\n"; |
|
||||||
} |
|
||||||
echo "<right>\n"; |
|
||||||
reset($images); |
|
||||||
while (list($dummy, $label) = each($images)) { |
|
||||||
list($dummy, $src) = each($images); |
|
||||||
list($dummy, $alt) = each($images); |
|
||||||
list($dummy, $link) = each($images); |
|
||||||
echo "$label<a href=\"$link\"><img src=\"$src\" border=0"; |
|
||||||
echo " width=88 height=31 alt=\"$alt\"></a>\n"; |
|
||||||
} |
|
||||||
echo "</right>\n"; |
|
||||||
} else { |
|
||||||
echo "<table cellspacing=0 cellpadding=3 width=100%"; |
|
||||||
echo " border=0 bgcolor=eeeef8>\n"; |
|
||||||
|
|
||||||
reset($menu); |
<table cellspacing=0 cellpadding=3 border=0 bgcolor=#EEEEF8 class="nav"> |
||||||
while (list($dummy, $header) = each($menu)) { |
<tr><td class="nav"> |
||||||
list($dummy, $subitems) = each($menu); |
<?php |
||||||
echo "<tr bgcolor=\"7272cc\">\n<td align=\"center\">"; |
reset($menu); |
||||||
echo "<font color=\"ffffff\"><b>$header</b></font></td></tr>\n"; |
$self = ereg_replace("^.*/", "", $PHP_SELF); |
||||||
echo "<tr><td align=\"right\">\n"; |
while (list($dummy, $name) = each($menu)) { |
||||||
reset($subitems); |
list($dummy, $type) = each($menu); |
||||||
while (list($dummy, $name) = each($subitems)) { |
list($dummy, $link) = each($menu); |
||||||
list($dummy, $type) = each($subitems); |
$name = ereg_replace(" ", " ", $name); |
||||||
list($dummy, $link) = each($subitems); |
if ($type == "selflink") { |
||||||
if ($type == "selflink") { |
if ($self == "$link.$extension") { |
||||||
selflink($link); |
echo "$name"; |
||||||
} else if ($type == "sflink") { |
} else { |
||||||
sflink($link); |
selflink($link); |
||||||
} else if ($type == "-") { |
|
||||||
echo "<br>\n"; |
|
||||||
continue; |
|
||||||
} else if ($type == "link") { |
|
||||||
echo "<a href=\"$link\">"; |
|
||||||
} |
|
||||||
$name = ereg_replace(" ", " ", $name); |
|
||||||
echo "$name</a>"; |
echo "$name</a>"; |
||||||
if (current($subitems)) { |
|
||||||
echo "<br>\n"; |
|
||||||
} |
|
||||||
} |
} |
||||||
|
} else if ($type == "sflink") { |
||||||
|
sflink($link); |
||||||
|
echo "$name</a>"; |
||||||
|
} else if ($type == "-") { |
||||||
|
echo "<br>\n"; |
||||||
|
continue; |
||||||
|
} else if ($type == "link") { |
||||||
|
echo "<a href=\"$link\">$name</a>"; |
||||||
} |
} |
||||||
echo "</td></tr>\n"; |
if (current($menu)) { |
||||||
echo "<tr bgcolor=\"ffffff\"><td align=\"center\">"; |
echo " |\n"; |
||||||
|
|
||||||
reset($images); |
|
||||||
while (list($dummy, $label) = each($images)) { |
|
||||||
list($dummy, $src) = each($images); |
|
||||||
list($dummy, $alt) = each($images); |
|
||||||
list($dummy, $link) = each($images); |
|
||||||
echo "<br>$label<br>\n"; |
|
||||||
echo "<a href=\"$link\"><img src=\"$src\" border=0"; |
|
||||||
echo " width=88 height=31 alt=\"$alt\"></a><br>\n"; |
|
||||||
} |
} |
||||||
echo "</td></tr></table>\n"; |
|
||||||
} |
} |
||||||
?> |
?> |
||||||
|
</td></tr> |
||||||
|
</table><br> |
||||||
|
@ -1,281 +0,0 @@ |
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<title>Java Optimize and Decompile Environment (JODE)</title> |
|
||||||
<meta name="date" content="2000-06-30"> |
|
||||||
<meta name="description" content="JODE - Java Optimize and Decompile Environment."> |
|
||||||
<meta name="author" content="Jochen Hoenicke"> |
|
||||||
<meta name="keywords" content="jode, java, decompiler, obfuscator, deobfuscator, reverse engineering, free, GPL"> |
|
||||||
</head> |
|
||||||
|
|
||||||
<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0"> |
|
||||||
<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"> |
|
||||||
<table cellspacing=0 cellpadding=3 width=100% border=0 bgcolor=eeeef8> |
|
||||||
<tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Jode</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="./"><B>Home</B></a><br> |
|
||||||
<a href="http://sourceforge.net/project/?group_id=3790">Project page</a><br> |
|
||||||
<br> |
|
||||||
<a href="./applet.html">Applet</a><br> |
|
||||||
<a href="./download.html">Download</a><br> |
|
||||||
<a href="./usage.html">Documentation</a><br> |
|
||||||
<a href="./license.html">License</a><br> |
|
||||||
<a href="./history.html">History</a><br> |
|
||||||
<a href="./links.html">Links</a><br> |
|
||||||
<a href="./bluesky.html">Blue Sky</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Feedback</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="http://sourceforge.net/bugs/?group_id=3790">Bug Tracking</a><br> |
|
||||||
<a href="http://sourceforge.net/forum/?group_id=3790">Public Forums</a><br> |
|
||||||
<a href="http://lists.sourceforge.net/mailman/listinfo/jode-users">Mailing List</a><br> |
|
||||||
<a href="http://sourceforge.net/sendmessage.html?touser=18252">Private Mail</a><tr bgcolor="7272cc"> |
|
||||||
<td align="center"><font color="ffffff"><b>Download</b></font></td></tr> |
|
||||||
<tr><td align="right"> |
|
||||||
<a href="ftp://jode.sourceforge.net/pub/jode/">FTP server</a><br> |
|
||||||
<a href="http://sourceforge.net/project/filelist.html?group_id=3790">Source releases</a></td></tr> |
|
||||||
<tr bgcolor="ffffff"><td align="center"><br>Powered by <br> |
|
||||||
<a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.html?group_id=3790&type=1" border=0 width=88 height=31 alt="SourceForge"></a><br> |
|
||||||
<br>Best viewed with <br> |
|
||||||
<a href="http://www.anybrowser.org/campaign/"><img src="a-logo.gif" border=0 width=88 height=31 alt="Any Browser"></a><br> |
|
||||||
</td></tr></table> |
|
||||||
</td> |
|
||||||
<td valign="top"> |
|
||||||
<a name="decompiler"> |
|
||||||
<h1>Using the Decompiler</h1></a> |
|
||||||
After you have <a href="./download.html">downloaded</a> the necessary |
|
||||||
packages, put them into your <tt>CLASSPATH</tt>: |
|
||||||
|
|
||||||
<ul><li>Under Windows you have to start a MSDOS session and type |
|
||||||
something like: |
|
||||||
<pre> |
|
||||||
set CLASSPATH=C:\download\jode-xxx.jar;C:\swing\swingall.jar |
|
||||||
</pre> |
|
||||||
</li><li>Under Unix you start a shell and type (for bourne shell): |
|
||||||
<pre>export CLASSPATH=/tmp/jode-xxx.jar:/usr/local/swing/swingall.jar</pre> |
|
||||||
or for csh: |
|
||||||
<pre>setenv CLASSPATH /tmp/jode-xxx.jar:/usr/local/swing/swingall.jar</pre> |
|
||||||
</ul> |
|
||||||
<br> |
|
||||||
There is also a batch file for windows and a script file for unix, |
|
||||||
that you can use. Adapt the CLASSPATH in the file and put it to a |
|
||||||
convenient location. |
|
||||||
<pre> |
|
||||||
jar -xvf jode-xxx.jar bin/jode.bat <i>resp.</i> bin/jode |
|
||||||
</pre> |
|
||||||
|
|
||||||
<a name="cmdline"><h3>Command Line Interface</h3></a> |
|
||||||
|
|
||||||
The most powerful way to start <I>JODE</I>'s decompiler is the command |
|
||||||
line interface. Some people don't like long command lines; they |
|
||||||
should go to the next section. <br> |
|
||||||
|
|
||||||
Start the class <tt>jode.decompiler.Main</tt> with the options. The |
|
||||||
following command will give a complete list of the available commands: |
|
||||||
|
|
||||||
<pre>java jode.decompiler.Main --help</pre> |
|
||||||
|
|
||||||
<a name="awt"><h3>AWT Interface</h3></a> |
|
||||||
|
|
||||||
The AWT Interface looks exactly like the <a href="./applet.html">applet</a>. In fact the applet uses the AWT Interface. You start it |
|
||||||
after setting the <tt>CLASSPATH</tt> (see <a href="./usage.html#decompiler">above</a>), with |
|
||||||
|
|
||||||
<pre>java jode.decompiler.Window</pre> |
|
||||||
|
|
||||||
In the classpath line you can enter a number of jar files, zip files |
|
||||||
and directories separated by comma(<tt>,</tt>). Then enter the |
|
||||||
dot(<tt>.</tt>) separated name of the class you want to decompile. |
|
||||||
Press the <code>start</code> button and the decompiled class should |
|
||||||
appear. You can save it via the <code>save</code> button. |
|
||||||
|
|
||||||
<a name="swing"><h3>Swing Interface</h3></a> |
|
||||||
|
|
||||||
For the swing interface you need java version 1.2 or the separately |
|
||||||
available swing package (see <a href="./links.html#swing">link |
|
||||||
page</a>. You can invoke it like this: |
|
||||||
<pre> |
|
||||||
java jode.swingui.Main --classpath classes.jar |
|
||||||
</pre> |
|
||||||
|
|
||||||
The swing interface will show the package hierarchie of all classes |
|
||||||
in the classpath on the left side. You can now select a class and the |
|
||||||
decompiled code will appear on the right side. Via the menu, you may |
|
||||||
change the classpath or switch between package hierarchie tree and |
|
||||||
class inheritence tree.<br> |
|
||||||
|
|
||||||
The swing interface is very useful to browse through class files if |
|
||||||
you don't have the source code. You can also use it to trace bugs in |
|
||||||
library code. It is not meant to generate <tt>java</tt> files and so |
|
||||||
you won't find a save option there.<br> |
|
||||||
|
|
||||||
<a name="java"><h3>Java Interface</h3></a> |
|
||||||
|
|
||||||
If you want to integrate <i>JODE</i> into your own java program, you |
|
||||||
can use the <a |
|
||||||
href="Decompiler.java"><code>jode.decompiler.Decompiler</code></a> |
|
||||||
class. Note that the GPL only allows you to integrate <i>JODE</i> |
|
||||||
into GPL programs. Please contact me if you use <i>JODE</i> in this |
|
||||||
way.<br> |
|
||||||
|
|
||||||
You may use this <a |
|
||||||
href="ftp://jode.sourceforge.net/pub/jode/jode-embedded.jar">stripped |
|
||||||
down jar archive</a> containing all necessary classes. |
|
||||||
|
|
||||||
<a name="optimizer"><h1>Using the Obfuscator</h1> |
|
||||||
|
|
||||||
To use the obfuscator you should first create a script file, say <a |
|
||||||
href="myproject.jos"><tt>myproject.jos</tt></a>. Then you can invoke the |
|
||||||
obfuscator with: |
|
||||||
<pre> |
|
||||||
java jode.obfuscator.Main myproject.jos |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>The script file should contain the following options: </p> |
|
||||||
|
|
||||||
<p>First select the classpath. You should include everything in the |
|
||||||
classpath that you need to run your application. This also includes |
|
||||||
the system class files (Sun puts them into <code>classes.zip</code> or |
|
||||||
<code>rt.jar</code>))</p> |
|
||||||
<pre> |
|
||||||
classpath = "c:\\jdk1.2\\jre\\lib\\rt.jar","d:\\project\\java", |
|
||||||
"ftp://www.myorg.org/pub/classlib.jar" |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>Specify where you want the obfuscated classes to go. I recommend |
|
||||||
to write them directly into a zip file, but you can also give a |
|
||||||
directory.</p> |
|
||||||
<pre> |
|
||||||
dest = "obfuscated.zip" |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>You can make <i>JODE</i> write its translation table. This table |
|
||||||
can be used later to undo the name obfuscation, or you can look there |
|
||||||
to decrypt exceptions you may get.</p> |
|
||||||
<pre> |
|
||||||
revtable = "translat.tbl" |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>Select what you want to strip. There are several |
|
||||||
possibilities, which can be separated by comma(<tt>,</tt>):</p> |
|
||||||
<dl> |
|
||||||
<dt>unreach</dt> |
|
||||||
<dd>strip unreachable methods and classes.</dd> |
|
||||||
<dt>source</dt> |
|
||||||
<dd>remove the name of the java file (exceptions will get unreadable).</dd> |
|
||||||
<dt>lnt</dt> |
|
||||||
<dd>remove the line number table (exceptions will get unreadable).</dd> |
|
||||||
<dt>lvt</dt> |
|
||||||
<dd>remove the local variable table (debugging doesn't work).</dd> |
|
||||||
<dt>inner</dt> |
|
||||||
<dd>strip inner class info (reflection doesn't work correctly).</dd> |
|
||||||
</dl> |
|
||||||
<pre> |
|
||||||
strip = "unreach","lvt","inner" |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>Select the packages and classes you want to obfuscate. You should |
|
||||||
only include libraries, that you don't ship separately. If you give a |
|
||||||
package, all classes and subpackages are loaded. You can also use |
|
||||||
<code>*</code> as wild card, that matches everything (including dots). |
|
||||||
</p> |
|
||||||
<pre> |
|
||||||
load = new WildCard { value = "org.myorg.myproject" }, |
|
||||||
new WildCard { value = "org.myorg.mylib*" }, |
|
||||||
new WildCard { value = "org.otherorg.shortlib" } |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>Select the methods and classes you want to preserve. This is |
|
||||||
the <tt>main</tt> method for applications and the default constructor |
|
||||||
<tt><init>.()V</tt> for applets, resource bundles and other classes |
|
||||||
that you load manually at runtime.<br> You have to give the method |
|
||||||
name and the type signature to identify your method. <tt>javap |
|
||||||
-s</tt> will show you the type signatures for your classes, but you |
|
||||||
may also use <tt>*</tt>, to select all methods with that name.</p> |
|
||||||
<pre> |
|
||||||
preserve = new WildCard { value = "org.myorg.ApplicationClass.main.*" }, |
|
||||||
new WildCard { value = "org.myorg.AppletClass.<init>.()V" }, |
|
||||||
new WildCard { value = "org.resources.Bundle*.<init>.()V" }, |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>If you want to obfuscate (or just shorten) the identifier you can |
|
||||||
specify a renamer. There are currently following renamer |
|
||||||
available</p> |
|
||||||
<dl><dt>StrongRenamer</dt> |
|
||||||
<dd>Renames to the shortest possible name. You can give a charset |
|
||||||
that should be used. It uses the same name as much as possible.</dd> |
|
||||||
<dt>UniqueRenamer</dt> |
|
||||||
<dd>Renames to unique identifier of the form <tt>xxx123</tt>. Useful |
|
||||||
to reduce name conflicts, before you decompile an obfuscated package.</dd> |
|
||||||
<dt>NameSwapper</dt> |
|
||||||
<dd>This renamer just swaps the names. This is a funny obfuscation |
|
||||||
option that is not very strong, but very confusing.</dd> |
|
||||||
<dt>KeywordRenamer</dt> |
|
||||||
<dd>Renames identifiers to keyword. You can give your own list of |
|
||||||
keywords as parameters. Resulting code is not decompilable directly, |
|
||||||
<b>but it is <i>not</i> legal bytecode either</b>. Some paranoid |
|
||||||
web browsers refuse to run applets containing keywords as identifiers |
|
||||||
(and they are completely within the Java VM spec).</dd> |
|
||||||
</dl> |
|
||||||
<pre> |
|
||||||
renamer = new StrongRenamer |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>You can also create a renaming table with the same format as the |
|
||||||
table written by revtable. The entries in the table get precedence |
|
||||||
over renamer. Entries not in the table will get renamed by the |
|
||||||
renamer.<p> |
|
||||||
<pre> |
|
||||||
table = "translat.tbl" |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>Now you can select the analyzer. The purpose of the |
|
||||||
analyzer is to mark all reachable methods, find out which methods |
|
||||||
needs to get the same name (overloading), and which method names |
|
||||||
mustn't change (overload of library methods, e.g. <tt>nextElement</tt> |
|
||||||
for <tt>Enumeration</tt>s). There are currently two analyzers. |
|
||||||
<dl><dt>SimpleAnalyzer</dt> |
|
||||||
<dd>Straight forward analyzer. It is fast and will remove dead code |
|
||||||
on method basis.</dd> |
|
||||||
|
|
||||||
<dd><dt>ConstantAnalyzer</dt> |
|
||||||
<dd>Strong analyzer that will determine, which fields and instructions |
|
||||||
have constant values. It will remove dead code on instruction basis |
|
||||||
and replace constant instruction with a load of the constant, or |
|
||||||
remove them completely.<br> This analyzer is especially useful to |
|
||||||
revert the flow obfuscation of some other obfuscators.</dd> |
|
||||||
</dl> |
|
||||||
</p> |
|
||||||
<pre> |
|
||||||
analyzer = new ConstantAnalyzer |
|
||||||
</pre> |
|
||||||
|
|
||||||
<p>Pre- and Post transformers transform the bytecode before |
|
||||||
resp. after the Analyzer runs. Using this default should be okay. |
|
||||||
You may remove the LocalOptimizer, though, if you have problems.</p> |
|
||||||
<p>In the future I may add some new post transformers, that do string |
|
||||||
encryption, flow obfuscation and similar things. If you want to write |
|
||||||
your own Transformers please contact me, since the next version will |
|
||||||
change the bytecode interface.</p> |
|
||||||
<pre> |
|
||||||
post = new LocalOptimizer, new RemovePopAnalyzer |
|
||||||
</pre> |
|
||||||
</td></tr> |
|
||||||
</table> |
|
||||||
<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c"> |
|
||||||
<TR> |
|
||||||
<TD align="center"><FONT color="#ffffff"><SPAN class="titlebar"> |
|
||||||
All trademarks and copyrights on this page are properties of their respective owners. <br> |
|
||||||
Last updated on 8-May-2000, |
|
||||||
Copyright © 1998-2000 by Jochen Hoenicke.</SPAN></FONT> |
|
||||||
</TD> |
|
||||||
</TR> |
|
||||||
</TABLE> |
|
||||||
|
|
||||||
</BODY> |
|
||||||
</HTML> |
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue