Migrate java plugin ##arch

This commit is contained in:
Luc Tielen 2023-06-01 18:05:21 +02:00 committed by pancake
parent 6102b1208a
commit 8c3ce37255
22 changed files with 64 additions and 57 deletions

View File

@ -8,7 +8,7 @@ anal.x86_cs
anal.arm_cs
arch.arm_v35
anal.mips_cs
anal.java
arch.java
anal.dalvik
anal.gb
arch.null

View File

@ -25,7 +25,7 @@ anal.avr
arch.bf
anal.dalvik
arch.i8080
anal.java
arch.java
anal.m68k
anal.mips_cs
arch.ppc_cs

View File

@ -6,7 +6,7 @@ anal.avr
anal.dalvik
anal.gb
arch.i8080
anal.java
arch.java
anal.mips_cs
anal.null
arch.ppc_cs

View File

@ -6,7 +6,7 @@ anal.avr
anal.dalvik
anal.gb
arch.i8080
anal.java
arch.java
anal.mips_cs
anal.null
anal.x86_cs

View File

@ -6,7 +6,7 @@ anal.null
anal.x86_cs
anal.arm_cs
anal.mips_cs
anal.java
arch.java
anal.dalvik
anal.gb
arch.null

View File

@ -7,7 +7,7 @@ anal.null
anal.x86_cs
anal.arm_cs
anal.mips_cs
anal.java
arch.java
anal.dalvik
anal.gb
arch.null

View File

@ -15,7 +15,7 @@ anal.dalvik
anal.gb
arch.h8300
arch.i8080
anal.java
arch.java
arch.kvx
arch.lh5801
arch.m68k_cs

View File

@ -12,7 +12,7 @@ arch.ebc
anal.gb
arch.h8300
arch.i8080
anal.java
arch.java
arch.kvx
arch.lh5801
arch.xtensa

View File

@ -9,7 +9,7 @@ arch.ebc
anal.gb
arch.h8300
arch.i8080
anal.java
arch.java
arch.m680x_cs
anal.mips_cs
arch.msp430

View File

@ -11,7 +11,7 @@ anal.dalvik
anal.gb
arch.mcs96
arch.i8080
anal.java
arch.java
arch.hppa_gnu
arch.kvx
arch.lh5801

View File

@ -8,7 +8,7 @@ anal.dalvik
anal.gb
arch.lm32
arch.i8080
anal.java
arch.java
arch.m68k_cs
anal.mips_cs
arch.mcs96

View File

@ -5,7 +5,7 @@ anal.avr
arch.bf
anal.dalvik
anal.gb
anal.java
arch.java
arch.lh5801
anal.mips_cs
arch.mips_gnu

View File

@ -5,7 +5,7 @@ anal.null
anal.x86_cs
anal.arm_cs
anal.mips_cs
anal.java
arch.java
anal.dalvik
anal.gb
arch.null

View File

@ -51,7 +51,6 @@ r_anal_sources = [
'p/anal_gb.c',
'../arch/p/h8300/plugin.c',
'../arch/p/h8300/h8300_disas.c',
'p/anal_java.c',
'../arch/p/lh5801/plugin.c',
'../arch/p/m68k_cs/plugin.c',
'../arch/p/m680x_cs/plugin.c',
@ -129,7 +128,6 @@ r_anal = library('r_anal', r_anal_sources,
r_cons_dep,
r_syscall_dep,
r_flag_dep,
java_dep,
capstone_dep
],
install: true,

View File

@ -17,6 +17,7 @@ v35pre:
$(MAKE) -C p/arm/v35
include $(STATIC_ARCH_PLUGINS)
include $(STOP)/java/deps.mk
STATIC_OBJS=$(subst ..,p/..,$(subst arch_,p/arch_,$(STATIC_OBJ)))
OBJS=arch.o arch_config.o arch_switch.o arch_op.o

View File

@ -52,6 +52,7 @@ r_arch_sources = [
'p/tms320/c55x_plus/decode_funcs.c',
'p/tms320/c55x_plus/hashtable.c',
'p/tms320/c55x_plus/utils.c',
'p/java/plugin.c',
# fails on windows
# error LNK2005: SocketNotificationRetrieveEvents already defined in p_hppa_gnu_hppa-dis.c.obj
'p/hppa/plugin_gnu.c',
@ -180,6 +181,7 @@ r_arch = library('r_arch', r_arch_sources,
dependencies: [
r_util_dep,
r_reg_dep,
java_dep,
capstone_dep,
],
install: true,

View File

@ -1,16 +1,16 @@
OBJ_JAVA=anal_java.o
OBJ_JAVA=p/java/plugin.o
SHARED2_JAVA=$(addprefix ../,${SHARED_JAVA})
OBJ_JAVA+=${SHARED2_JAVA}
STATIC_OBJ+=${OBJ_JAVA}
TARGET_JAVA=anal_java.${EXT_SO}
TARGET_JAVA=java.${EXT_SO}
ALL_TARGETS+=${TARGET_JAVA}
${TARGET_JAVA}: ${OBJ_JAVA}
${CC} $(call libname,anal_java) ${CFLAGS} \
-o anal_java.${EXT_SO} \
${CC} $(call libname,java) ${CFLAGS} \
-o java.${EXT_SO} \
${OBJ_JAVA} ${SHARED2_JAVA} \
$(SHLR)/java/libr_java.$(EXT_AR) \
$(SHLR)/sdb/src/libsdb.$(EXT_AR)

View File

@ -1,7 +1,6 @@
/* radare - Apache 2.0 - Copyright 2010-2022 - pancake and Adam Pridgen <dso@rice.edu || adam.pridgen@thecoverofnight.com> */
#include <r_lib.h>
#include <r_anal.h>
#include <r_arch.h>
#include "../../../shlr/java/ops.h"
#include "../../../shlr/java/code.h"
@ -12,23 +11,11 @@
static R_TH_LOCAL ut64 METHOD_START = 0;
static void java_update_anal_types(RAnal *anal, RBinJavaObj *bin_obj);
static int java_cmd_ext(RAnal *anal, const char* input);
static int java_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len, RAnalOpMask mask);
static RBinJavaObj *get_java_bin_obj(RAnal *anal);
static RBinJavaObj *get_java_bin_obj(RAnal *anal) {
RBin *b = anal->binb.bin;
RBinPlugin *plugin = b->cur && b->cur->o ? b->cur->o->plugin : NULL;
ut8 is_java = (plugin && strcmp (plugin->name, "java") == 0) ? 1 : 0;
return is_java ? b->cur->o->bin_obj : NULL;
}
static ut64 java_get_method_start(void) {
return METHOD_START;
}
static int java_switch_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len) {
static int java_switch_op(RArchSession *as, RAnalOp *op, ut64 addr, const ut8 *data, int len) {
ut8 op_byte = data[0];
ut64 offset = addr - java_get_method_start ();
ut8 pos = (offset + 1)%4 ? 1 + 4 - (offset+1)%4 : 1;
@ -182,18 +169,21 @@ static int r_anal_java_is_op_type_eop(ut64 x) {
(x & R_ANAL_JAVA_CODEOP_SWITCH) == R_ANAL_JAVA_CODEOP_SWITCH);
}
static int java_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len, RAnalOpMask mask) {
/* get opcode size */
static bool decode(RArchSession *as, RAnalOp *op, RAnalOpMask mask) {
const ut64 addr = op->addr;
const ut8 *data = op->bytes;
const int len = op->size;
// get opcode size
if (len < 1) {
op->type = R_ANAL_OP_TYPE_ILL;
return 1;
return true; // XXX return false; ?
}
//ut8 op_byte = data[0];
ut8 op_byte = data[0];
int sz = JAVA_OPS[op_byte].size;
if (!op) {
op->type = R_ANAL_OP_TYPE_ILL;
return sz;
return sz > 0;
}
IFDBG {
R_LOG_DEBUG ("Extracting op from buffer (%d byte(s)) @ 0x%04x", (int)len, (ut32)addr);
@ -206,13 +196,13 @@ static int java_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len
op->type = map_java_op_to_anal_op_type (op->type2);
// handle lookup and table switch offsets
if (op_byte == 0xaa || op_byte == 0xab) {
java_switch_op (anal, op, addr, data, len);
java_switch_op (as, op, addr, data, len);
// IN_SWITCH_OP = 1;
}
if (mask & R_ARCH_OP_MASK_DISASM) {
RBinJavaObj *obj = NULL;
RBin *bin = anal->binb.bin;
RBin *bin = as->arch->binb.bin;
RBinPlugin *plugin = bin && bin->cur && bin->cur->o ?
bin->cur->o->plugin : NULL;
if (plugin && plugin->name) {
@ -245,7 +235,7 @@ static int java_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len
op->type2 = 0;
op->type = R_ANAL_OP_TYPE_CASE
op->eob = 0;
return op->sizes;
return op->sizes > 0;
}
*/
@ -260,7 +250,7 @@ static int java_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len
if (len < 4) {
// incomplete analysis here
return op->size; // 0
return op->size > 0; // XXX false
}
if (op->type == R_ANAL_OP_TYPE_POP) {
op->stackop = R_ANAL_STACK_INC;
@ -284,11 +274,27 @@ static int java_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len
op->fail = addr + sz;
//IFDBG eprintf ("%s callto 0x%04x failto 0x%04x.\n", JAVA_OPS[op_byte].name, op->jump, op->fail);
}
return op->size;
return op->size > 0;
}
static int java_opasm(RAnal *a, ut64 addr, const char *str, ut8 *outbuf, int outsize) {
return r_java_assemble (addr, outbuf, str);
static bool encode(RArchSession *as, RAnalOp *op, ut32 mask) {
ut8 bytes[8] = {0};
int size = r_java_assemble (op->addr, bytes, op->mnemonic);
if (size > 0) {
op->bytes = r_mem_dup (bytes, size);
op->size = size;
return true;
}
return false;
}
#if 0
static RBinJavaObj *get_java_bin_obj(RAnal *anal) {
RBin *b = anal->binb.bin;
RBinPlugin *plugin = b->cur && b->cur->o ? b->cur->o->plugin : NULL;
ut8 is_java = (plugin && strcmp (plugin->name, "java") == 0) ? 1 : 0;
return is_java ? b->cur->o->bin_obj : NULL;
}
static void java_update_anal_types(RAnal *anal, RBinJavaObj *bin_obj) {
@ -340,23 +346,23 @@ static int java_cmd_ext(RAnal *anal, const char* input) {
}
return 0;
}
#endif
RAnalPlugin r_anal_plugin_java = {
RArchPlugin r_arch_plugin_java = {
.name = "java",
.desc = "Java bytecode analysis plugin",
.license = "Apache",
.arch = "java",
.bits = 32,
.op = &java_op,
.opasm = &java_opasm,
.cmd_ext = java_cmd_ext,
0
.bits = R_SYS_BITS_PACK1 (32),
.decode = decode,
.encode = encode,
//.cmd_ext = java_cmd_ext,
};
#ifndef R2_PLUGIN_INCORE
R_API RLibStruct radare_plugin = {
.type = R_LIB_TYPE_ANAL,
.data = &r_anal_plugin_java,
.type = R_LIB_TYPE_ARCH,
.data = &r_arch_plugin_java,
.version = R2_VERSION
};
#endif

View File

@ -1605,7 +1605,6 @@ extern RAnalPlugin r_anal_plugin_arm_gnu;
extern RAnalPlugin r_anal_plugin_avr;
extern RAnalPlugin r_anal_plugin_dalvik;
extern RAnalPlugin r_anal_plugin_gb;
extern RAnalPlugin r_anal_plugin_java;
extern RAnalPlugin r_anal_plugin_mips_cs;
extern RAnalPlugin r_anal_plugin_jdh8;
extern RAnalPlugin r_anal_plugin_sh;

View File

@ -350,6 +350,7 @@ extern RArchPlugin r_arch_plugin_sm5xx;
extern RArchPlugin r_arch_plugin_tms320;
extern RArchPlugin r_arch_plugin_ppc_cs;
extern RArchPlugin r_arch_plugin_i8080;
extern RArchPlugin r_arch_plugin_java;
#ifdef __cplusplus
}

View File

@ -159,12 +159,12 @@ anal_plugins += [
'avr',
'dalvik',
'gb',
'java',
'mips_cs',
'x86_cs',
]
arch_plugins += [
'java',
'chip8',
'wasm',
'i8080',

View File

@ -58,7 +58,7 @@ RebuildJava() {
Rebuild shlr/java
Rebuild libr/bin
Rebuild libr/asm
Rebuild libr/anal
Rebuild libr/arch
Rebuild libr/core
}