git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@156 379699f6-c40d-0410-875b-85095c16579estable
parent
dc4c80f6d5
commit
a4ff579f1d
@ -0,0 +1,67 @@ |
||||
package jode; |
||||
import java.applet.*; |
||||
import java.awt.*; |
||||
import java.awt.event.*; |
||||
import java.io.*; |
||||
|
||||
public class JodeApplet extends Applet implements ActionListener, Runnable { |
||||
TextField classpathField; |
||||
TextField classField; |
||||
TextArea sourcecodeField; |
||||
|
||||
Thread decompileThread; |
||||
|
||||
public JodeApplet() { |
||||
setLayout(new BorderLayout()); |
||||
Panel optionPanel = new Panel(); |
||||
optionPanel.setLayout(new GridLayout(2,2)); |
||||
optionPanel.add(new Label("class path: ")); |
||||
classpathField = new TextField(); |
||||
optionPanel.add(classpathField); |
||||
optionPanel.add(new Label("class name: ")); |
||||
classField = new TextField(); |
||||
optionPanel.add(classField); |
||||
add(optionPanel, BorderLayout.NORTH); |
||||
|
||||
sourcecodeField = new TextArea(); |
||||
add(sourcecodeField, BorderLayout.CENTER); |
||||
|
||||
classField.addActionListener(this); |
||||
} |
||||
|
||||
public synchronized void actionPerformed(ActionEvent e) { |
||||
if (decompileThread == null) { |
||||
decompileThread = new Thread(this); |
||||
sourcecodeField.setText("Please wait, while decompiling...\n"); |
||||
decompileThread.start(); |
||||
} else |
||||
sourcecodeField.append("Be a little bit more patient, please.\n"); |
||||
} |
||||
|
||||
public void init() { |
||||
String cp = getParameter("classpath"); |
||||
if (cp != null) |
||||
classpathField.setText(cp); |
||||
String cls = getParameter("class"); |
||||
if (cls != null) |
||||
classField.setText(cls); |
||||
} |
||||
|
||||
public void run() { |
||||
JodeEnvironment env = new JodeEnvironment(classpathField.getText()); |
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
try { |
||||
TabbedPrintWriter writer = new TabbedPrintWriter(out, " "); |
||||
env.doClass(classField.getText(), writer); |
||||
sourcecodeField.setText(out.toString()); |
||||
} catch (Throwable t) { |
||||
sourcecodeField.setText("Didn't succeed.\n" |
||||
+"Check the java console for more info."); |
||||
t.printStackTrace(); |
||||
} finally { |
||||
synchronized(this) { |
||||
decompileThread = null; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,132 @@ |
||||
/* |
||||
* MethodReachability (c) 1998 Jochen Hoenicke |
||||
* |
||||
* You may distribute under the terms of the GNU General Public License. |
||||
* |
||||
* IN NO EVENT SHALL JOCHEN HOENICKE BE LIABLE TO ANY PARTY FOR DIRECT, |
||||
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF |
||||
* THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF JOCHEN HOENICKE |
||||
* HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
* JOCHEN HOENICKE SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
||||
* PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" |
||||
* BASIS, AND JOCHEN HOENICKE HAS NO OBLIGATION TO PROVIDE MAINTENANCE, |
||||
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
||||
* |
||||
* $Id$ |
||||
*/ |
||||
|
||||
package jode.obfuscator; |
||||
import jode.bytecode.ConstantPool; |
||||
import jode.bytecode.MethodInfo; |
||||
import jode.MethodType; |
||||
import jode.Type; |
||||
import java.lang.reflect.Modifier; |
||||
import java.util.*; |
||||
|
||||
public class MethodReachability { |
||||
ClassReachability clazz; |
||||
MethodInfo info; |
||||
public ClassReachability inheritedFromClass; |
||||
|
||||
public boolean reachable = false; |
||||
public boolean preserve = false; |
||||
|
||||
public Vector references; |
||||
|
||||
public MethodReachability(ClassReachability clazz, MethodInfo info) { |
||||
this.clazz = clazz; |
||||
this.info = info; |
||||
|
||||
AttributeInfo codeattr = minfo.findAttribute("Code"); |
||||
if (codeattr != null) { |
||||
DataInputStream stream = new DataInputStream |
||||
(new ByteArrayInputStream(codeattr.getContents())); |
||||
CodeInfo codeinfo = new CodeInfo(); |
||||
try { |
||||
codeinfo.read(classAnalyzer.getConstantPool(), stream); |
||||
analyzeCode(codeinfo); |
||||
} catch (IOException ex) { |
||||
ex.printStackTrace(); |
||||
code = null; |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
public void analyzeCode(CodeInfo codeinfo) { |
||||
references = new Vector(); |
||||
byte[] code = codeinfo.getCode(); |
||||
try { |
||||
DataInputStream stream = |
||||
new DataInputStream(new ByteArrayInputStream(code)); |
||||
Opcodes.getReferences(stream, references); |
||||
} catch (IOException ex) { |
||||
ex.printStackTrace(); |
||||
throw new ClassFormatError(ex.getMessage()); |
||||
} |
||||
} |
||||
|
||||
public void markReachable() { |
||||
ConstantPool cp = clazz.getClassInfo().getConstantPool(); |
||||
if (!reachable) { |
||||
reachable = true; |
||||
Enumeration enum = references.elements(); |
||||
while (enum.hasMoreElements()) { |
||||
int ref = ((Integer) enum.nextElement()).intValue(); |
||||
int tag = cp.getTag(ref); |
||||
switch (tag) { |
||||
case ConstantPool.FIELDREF: |
||||
case ConstantPool.METHODREF: |
||||
case ConstantPool.INTERFACEMETHODREF: |
||||
String[] refs = cp.getRef(ref); |
||||
if (tag == ConstantPool.FIELDREF) |
||||
clazz.getBundle() |
||||
.markReachableField(refs[0], refs[1], |
||||
new MethodType(refs[2])); |
||||
else |
||||
clazz.getBundle() |
||||
.markReachableMethod(refs[0], refs[1], |
||||
new MethodTyp(refs[2])); |
||||
break; |
||||
case ConstantPool.CLASS: |
||||
String clName = cp.getClassName(ref); |
||||
clazz.getBundle().markReachable(clName); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void markPreserved() { |
||||
ConstantPool cp = clazz.getClassInfo().getConstantPool(); |
||||
if (!preserved) { |
||||
preserved = true; |
||||
Enumeration enum = references.elements(); |
||||
while (enum.hasMoreElements()) { |
||||
int ref = ((Integer) enum.nextElement()).intValue(); |
||||
int tag = cp.getTag(ref); |
||||
switch (tag) { |
||||
case ConstantPool.FIELDREF: |
||||
case ConstantPool.METHODREF: |
||||
case ConstantPool.INTERFACEMETHODREF: |
||||
String[] refs = cp.getRef(ref); |
||||
if (tag == ConstantPool.FIELDREF) |
||||
clazz.getBundle() |
||||
.markPreservedField(refs[0], refs[1], |
||||
new MethodType(refs[2])); |
||||
else |
||||
clazz.getBundle() |
||||
.markPreservedMethod(refs[0], refs[1], |
||||
new MethodTyp(refs[2])); |
||||
break; |
||||
case ConstantPool.CLASS: |
||||
String clName = cp.getClassName(ref); |
||||
clazz.getBundle().markPreserved(clName); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue