fix: improve disassemble view for java-input
This commit is contained in:
@@ -4,4 +4,8 @@ plugins {
|
||||
|
||||
dependencies {
|
||||
api(project(":jadx-plugins:jadx-plugins-api"))
|
||||
|
||||
// show bytecode disassemble
|
||||
implementation 'org.ow2.asm:asm:9.2'
|
||||
implementation 'org.ow2.asm:asm-util:9.2'
|
||||
}
|
||||
|
||||
+4
-3
@@ -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());
|
||||
|
||||
+14
-1
@@ -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
|
||||
|
||||
+17
-2
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user