fix: improve disassemble view for java-input

This commit is contained in:
Skylot
2021-08-22 16:53:54 +01:00
parent 9ea3f0f240
commit 1ce3fc972a
9 changed files with 115 additions and 38 deletions
@@ -61,15 +61,16 @@ public class JavaCodeReader implements ICodeReader {
state.setInsn(insn);
int offset = 0;
while (offset < codeSize) {
insn.setDecoded(false);
insn.setOffset(offset);
insn.setInsnStart(reader.getOffset());
int opcode = reader.readU1();
JavaInsnInfo insnInfo = JavaInsnsRegister.get(opcode);
if (insnInfo == null) {
throw new JavaClassParseException("Unknown opcode: 0x" + Integer.toHexString(opcode));
}
insn.setDecoded(false);
insn.setInsnInfo(insnInfo);
insn.setInsnStart(reader.getOffset());
insn.setOffset(offset);
insn.setInsnInfo(insnInfo);
insn.setRegsCount(insnInfo.getRegsCount());
insn.setOpcode(insnInfo.getApiOpcode());
@@ -12,6 +12,7 @@ import jadx.api.plugins.input.insns.InsnIndexType;
import jadx.api.plugins.input.insns.Opcode;
import jadx.api.plugins.input.insns.custom.ICustomPayload;
import jadx.plugins.input.java.data.ConstPoolReader;
import jadx.plugins.input.java.data.DataReader;
import jadx.plugins.input.java.data.code.decoders.IJavaInsnDecoder;
public class JavaInsnData implements InsnData {
@@ -74,9 +75,21 @@ public class JavaInsnData implements InsnData {
this.opcode = opcode;
}
@Override
public String getOpcodeMnemonic() {
return insnInfo.getName();
}
@Override
public byte[] getByteCode() {
return new byte[0];
DataReader reader = state.reader();
int startOffset = reader.getOffset();
try {
reader.absPos(insnStart);
return reader.readBytes(1 + payloadSize);
} finally {
reader.absPos(startOffset);
}
}
@Override
@@ -3,27 +3,42 @@ package jadx.plugins.input.java.utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.TimeUnit;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.util.TraceClassVisitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DisasmUtils {
private static final Logger LOG = LoggerFactory.getLogger(DisasmUtils.class);
public static String get(byte[] bytes) {
return useASM(bytes);
}
private static String useASM(byte[] bytes) {
StringWriter out = new StringWriter();
TraceClassVisitor tcv = new TraceClassVisitor(new PrintWriter(out));
new ClassReader(bytes).accept(tcv, 0);
return out.toString();
}
/**
* Use javap as a temporary disassembler for java bytecode
* Don't remove! Useful for debug.
*/
public static String get(byte[] bytes) {
private static String useSystemJavaP(byte[] bytes) {
try {
Path tmpCls = null;
try {
tmpCls = Files.createTempFile("jadx", ".class");
Files.write(tmpCls, bytes, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
Process process = Runtime.getRuntime().exec(new String[] {
"javap", "-constants", "-v", "-p", "-c",
tmpCls.toAbsolutePath().toString()