From cded4df114e899d726520dd1221e2ccfa98a7b96 Mon Sep 17 00:00:00 2001 From: pancake Date: Sun, 13 Nov 2022 01:22:32 +0100 Subject: [PATCH] Move anal.esil into the new esil ##esil --- binr/rabin2/meson.build | 8 -- binr/radare2/Makefile | 2 +- binr/radare2/meson.build | 1 + libr/anal/Makefile | 9 +- libr/anal/meson.build | 31 ++-- libr/anal/p/Makefile | 4 +- libr/anal/p/anal_malbolge.c | 80 ----------- libr/anal/p/malbolge.mk | 9 -- libr/anal/rtti_msvc.c | 19 +-- libr/arch/meson.build | 1 + libr/arch/p/arch_malbolge.c | 81 +++++++++++ libr/arch/p/malbolge.mk | 9 ++ libr/core/Makefile | 2 +- libr/core/meson.build | 85 +++++------ libr/esil/Makefile | 18 +++ libr/{anal => esil}/esil.c | 6 +- libr/{anal => esil}/esil_handler.c | 0 libr/{anal => esil}/esil_plugin.c | 0 libr/{anal => esil}/esil_stats.c | 0 libr/{anal => esil}/esil_trace.c | 0 libr/esil/meson.build | 51 +++++++ libr/esil/p/Makefile | 25 ++++ libr/{anal => esil}/p/dummy.mk | 0 libr/{anal => esil}/p/esil_dummy.c | 0 libr/include/r_anal.h | 203 +------------------------- libr/include/r_esil.h | 219 +++++++++++++++++++++++++++++ libr/libs.mk | 2 +- libr/meson.build | 6 + 28 files changed, 487 insertions(+), 384 deletions(-) delete mode 100644 libr/anal/p/anal_malbolge.c delete mode 100644 libr/anal/p/malbolge.mk create mode 100644 libr/arch/p/arch_malbolge.c create mode 100644 libr/arch/p/malbolge.mk create mode 100644 libr/esil/Makefile rename libr/{anal => esil}/esil.c (99%) rename libr/{anal => esil}/esil_handler.c (100%) rename libr/{anal => esil}/esil_plugin.c (100%) rename libr/{anal => esil}/esil_stats.c (100%) rename libr/{anal => esil}/esil_trace.c (100%) create mode 100644 libr/esil/meson.build create mode 100644 libr/esil/p/Makefile rename libr/{anal => esil}/p/dummy.mk (100%) rename libr/{anal => esil}/p/esil_dummy.c (100%) create mode 100644 libr/include/r_esil.h diff --git a/binr/rabin2/meson.build b/binr/rabin2/meson.build index 60bffa96cc..23b4146cf1 100644 --- a/binr/rabin2/meson.build +++ b/binr/rabin2/meson.build @@ -1,15 +1,7 @@ executable('rabin2', 'rabin2.c', include_directories: [platform_inc], dependencies: [ - r_util_dep, - r_cons_dep, - r_main_dep, - r_config_dep, - r_io_dep, - r_crypto_dep, r_core_dep, - r_magic_dep, - r_bin_dep ], install: true, install_rpath: rpath_exe, diff --git a/binr/radare2/Makefile b/binr/radare2/Makefile index 1b31d84bb0..2758fe2fac 100644 --- a/binr/radare2/Makefile +++ b/binr/radare2/Makefile @@ -1,7 +1,7 @@ BIN=radare2 BINDEPS=r_core r_parse r_search r_cons r_config BINDEPS+=r_bin r_debug r_anal r_reg r_bp r_io r_fs -BINDEPS+=r_lang r_asm r_syscall r_main r_util +BINDEPS+=r_lang r_asm r_syscall r_main r_util r_esil BINDEPS+=r_magic r_socket r_flag r_egg r_crypto include ../../config-user.mk diff --git a/binr/radare2/meson.build b/binr/radare2/meson.build index 10239d6bb7..0b47f01d2c 100644 --- a/binr/radare2/meson.build +++ b/binr/radare2/meson.build @@ -9,6 +9,7 @@ radare2_exe = executable('radare2', 'radare2.c', r_fs_dep, r_bin_dep, r_flag_dep, + r_esil_dep, r_cons_dep, r_asm_dep, r_debug_dep, diff --git a/libr/anal/Makefile b/libr/anal/Makefile index 0d46d17567..333cd3f1f9 100644 --- a/libr/anal/Makefile +++ b/libr/anal/Makefile @@ -4,7 +4,7 @@ EXTRA_TARGETS+=do EXTRA_CLEAN=doclean NAME=r_anal -R2DEPS=r_util r_reg r_syscall r_search r_cons r_flag r_crypto r_parse r_arch +R2DEPS=r_util r_reg r_syscall r_search r_cons r_flag r_crypto r_parse r_arch r_esil CFLAGS:=-I.. -I$(LTOP)/asm/arch/include -DR2_PLUGIN_INCORE -Iarch -I$(TOP)/shlr $(CFLAGS) LDFLAGS+=${BN_LIBS} @@ -26,14 +26,13 @@ plugins: ${LIBSO} ${LIBAR} @$(MAKE) -C p all include ${STATIC_ANAL_PLUGINS} -include ${STATIC_ESIL_PLUGINS} STATIC_OBJS=$(addprefix $(LTOP)/anal/p/,$(STATIC_OBJ)) OBJLIBS=meta.o reflines.o op.o fcn.o bb.o var.o block.o OBJLIBS+=cond.o value.o cc.o class.o diff.o type.o type_pdb.o dwarf_process.o -OBJLIBS+=hint.o anal.o data.o xrefs.o esil.o sign.o esil_plugin.o -OBJLIBS+=esil_handler.o switch.o cycles.o esil_dfg.o esil_cfg.o -OBJLIBS+=esil_stats.o esil_trace.o flirt.o labels.o +OBJLIBS+=hint.o anal.o data.o xrefs.o sign.o +OBJLIBS+=switch.o cycles.o esil_dfg.o esil_cfg.o +OBJLIBS+=flirt.o labels.o OBJLIBS+=pin.o vtable.o rtti.o codemeta.o anplugs.o global.o OBJLIBS+=rtti_msvc.o rtti_itanium.o jmptbl.o function.o diff --git a/libr/anal/meson.build b/libr/anal/meson.build index cd64a5ffe0..dce71c90ac 100644 --- a/libr/anal/meson.build +++ b/libr/anal/meson.build @@ -14,11 +14,6 @@ r_anal_sources = [ 'cycles.c', 'data.c', 'diff.c', - 'esil.c', - 'esil_stats.c', - 'esil_trace.c', - 'esil_plugin.c', - 'esil_handler.c', 'esil_cfg.c', 'esil_dfg.c', 'fcn.c', @@ -86,7 +81,6 @@ r_anal_sources = [ 'p/anal_m68k_gnu.c', '../asm/arch/m68k/gnu/m68k-dis.c', '../asm/arch/m68k/gnu/m68k-opc.c', - 'p/anal_malbolge.c', 'p/anal_mcore.c', 'p/anal_mips_cs.c', '../asm/arch/mips/mipsasm.c', @@ -137,7 +131,6 @@ r_anal_sources = [ 'p/anal_xcore_cs.c', 'p/anal_xtensa.c', 'p/anal_z80.c', - 'p/esil_dummy.c', #join_paths('arch','gb','meta_gb_cmt.c'), 'arch/ebc/ebc_disas.c', 'arch/wasm/wasm.c', @@ -239,6 +232,7 @@ r_anal = library('r_anal', r_anal_sources, r_reg_dep, r_asm_dep, r_arch_dep, + r_esil_dep, r_crypto_dep, r_search_dep, r_cons_dep, @@ -262,18 +256,19 @@ r_anal_static = static_library('r_anal_static', r_anal_sources, include_directories: r_anal_inc, c_args: library_cflags, dependencies: [ - r_util_static_dep, - r_reg_static_dep, - r_asm_static_dep, - r_crypto_static_dep, - r_search_static_dep, - r_arch_static_dep, - r_cons_static_dep, - r_parse_static_dep, - r_syscall_static_dep, - r_flag_static_dep, + capstone_dep, java_static_dep, - capstone_dep + r_arch_static_dep, + r_asm_static_dep, + r_cons_static_dep, + r_crypto_static_dep, + r_esil_static_dep, + r_flag_static_dep, + r_parse_static_dep, + r_reg_static_dep, + r_search_static_dep, + r_syscall_static_dep, + r_util_static_dep, ], install: true, implicit_include_directories: false, diff --git a/libr/anal/p/Makefile b/libr/anal/p/Makefile index 7738256640..1abc42e91f 100644 --- a/libr/anal/p/Makefile +++ b/libr/anal/p/Makefile @@ -12,8 +12,8 @@ all: ${ALL_TARGETS} ALL_TARGETS= # TODO: rename to enabled plugins -ARCHS=null.mk arc.mk ppc_gnu.mk ppc_cs.mk arm_gnu.mk avr.mk xap.mk bpf.mk dalvik.mk sh.mk ebc.mk gb.mk lh5801.mk malbolge.mk ws.mk h8300.mk cr16.mk v850.mk msp430.mk sparc_gnu.mk sparc_cs.mk x86_cs.mk cris.mk 6502.mk snes.mk riscv.mk vax.mk xtensa.mk rsp.mk mcore.mk tricore.mk s390_cs.mk pickle.mk -include $(ARCHS) +ANAL_PLUGINS=null.mk arc.mk ppc_gnu.mk ppc_cs.mk arm_gnu.mk avr.mk xap.mk bpf.mk dalvik.mk sh.mk ebc.mk gb.mk lh5801.mk ws.mk h8300.mk cr16.mk v850.mk msp430.mk sparc_gnu.mk sparc_cs.mk x86_cs.mk cris.mk 6502.mk snes.mk riscv.mk vax.mk xtensa.mk rsp.mk mcore.mk tricore.mk s390_cs.mk pickle.mk +include $(ANAL_PLUGINS) clean: -rm -f *.${EXT_SO} *.o ${STATIC_OBJ} diff --git a/libr/anal/p/anal_malbolge.c b/libr/anal/p/anal_malbolge.c deleted file mode 100644 index c28c9cd965..0000000000 --- a/libr/anal/p/anal_malbolge.c +++ /dev/null @@ -1,80 +0,0 @@ -/* radare - LGPL - Copyright 2015-2022 - condret */ - -#include -#include -#include - -static int mal_anal(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *data, int len, RAnalOpMask mask) { - if (len) { - switch ((data[0] + addr) % 94) { - case 4: - op->type = R_ANAL_OP_TYPE_UJMP; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("jmp [d]"); - } - break; - case 5: - op->type = R_ANAL_OP_TYPE_IO; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("out a"); - } - break; - case 23: - op->type = R_ANAL_OP_TYPE_IO; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("in a"); - } - break; - case 39: - op->type = R_ANAL_OP_TYPE_ROR; - op->type2 = R_ANAL_OP_TYPE_LOAD; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("rotr [d], mov a, [d]"); - } - break; - case 40: - op->type = R_ANAL_OP_TYPE_LOAD; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("mov d, [d]"); - } - break; - case 62: - op->type = R_ANAL_OP_TYPE_XOR; - op->type2 = R_ANAL_OP_TYPE_LOAD; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("crz [d], a, mov a, [d]"); - } - break; - case 81: - op->type = R_ANAL_OP_TYPE_TRAP; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("end"); - } - break; - default: - op->type = R_ANAL_OP_TYPE_NOP; - if (mask & R_ARCH_OP_MASK_DISASM) { - op->mnemonic = strdup ("nop"); - } - } - return op->size = 1; - } - return 0; -} - -RAnalPlugin r_anal_plugin_malbolge = { - .name = "malbolge", - .desc = "Malbolge analysis plugin", - .arch = "malbolge", - .license = "LGPL3", - .bits = 32, - .op = &mal_anal, -}; - -#ifndef R2_PLUGIN_INCORE -R_API RLibStruct radare_plugin = { - .type = R_LIB_TYPE_ANAL, - .data = &r_anal_plugin_malbolge, - .version = R2_VERSION -}; -#endif diff --git a/libr/anal/p/malbolge.mk b/libr/anal/p/malbolge.mk deleted file mode 100644 index e449c21e9c..0000000000 --- a/libr/anal/p/malbolge.mk +++ /dev/null @@ -1,9 +0,0 @@ -OBJ_MALBOLGE=anal_malbolge.o - -STATIC_OBJ+=${OBJ_MALBOLGE} -TARGET_MALBOLGE=anal_malbolge.${EXT_SO} - -ALL_TARGETS+=${TARGET_MALBOLGE} - -${TARGET_MALBOLGE}: ${OBJ_MALBOLGE} - ${CC} $(call libname,anal_malbolge) ${LDFLAGS} ${CFLAGS} -o anal_malbolge.${EXT_SO} ${OBJ_MALBOLGE} diff --git a/libr/anal/rtti_msvc.c b/libr/anal/rtti_msvc.c index 4cb55d1560..7170c8140d 100644 --- a/libr/anal/rtti_msvc.c +++ b/libr/anal/rtti_msvc.c @@ -5,6 +5,9 @@ #define NAME_BUF_SIZE 64 #define BASE_CLASSES_MAX 32 +RecoveryTypeDescriptor *recovery_anal_type_descriptor(RRTTIMSVCAnalContext *context, ut64 addr, RecoveryCompleteObjectLocator *col); +static const char *recovery_apply_complete_object_locator(RRTTIMSVCAnalContext *context, RecoveryCompleteObjectLocator *col); +static const char *recovery_apply_type_descriptor(RRTTIMSVCAnalContext *context, RecoveryTypeDescriptor *td); typedef struct rtti_complete_object_locator_t { ut32 signature; @@ -15,7 +18,6 @@ typedef struct rtti_complete_object_locator_t { ut32 object_base; // only for 64bit, see rtti_msvc_read_complete_object_locator() } rtti_complete_object_locator; - typedef struct rtti_class_hierarchy_descriptor_t { ut32 signature; ut32 attributes; // bit 0 set = multiple inheritance, bit 1 set = virtual inheritance @@ -704,8 +706,6 @@ typedef struct rtti_msvc_anal_context_t { } RRTTIMSVCAnalContext; -RecoveryTypeDescriptor *recovery_anal_type_descriptor(RRTTIMSVCAnalContext *context, ut64 addr, RecoveryCompleteObjectLocator *col); - RecoveryCompleteObjectLocator *recovery_anal_complete_object_locator(RRTTIMSVCAnalContext *context, ut64 addr, RVTableInfo *vtable) { RecoveryCompleteObjectLocator *col = ht_up_find (context->addr_col, addr, NULL); if (col) { @@ -848,9 +848,6 @@ static void recovery_apply_vtable(RAnal *anal, const char *class_name, RVTableIn } } -static const char *recovery_apply_complete_object_locator(RRTTIMSVCAnalContext *context, RecoveryCompleteObjectLocator *col); -static const char *recovery_apply_type_descriptor(RRTTIMSVCAnalContext *context, RecoveryTypeDescriptor *td); - static void recovery_apply_bases(RRTTIMSVCAnalContext *context, const char *class_name, RVector *base_descs) { RecoveryBaseDescriptor *base_desc; r_vector_foreach (base_descs, base_desc) { @@ -886,7 +883,6 @@ static void recovery_apply_bases(RRTTIMSVCAnalContext *context, const char *clas } } - static const char *recovery_apply_complete_object_locator(RRTTIMSVCAnalContext *context, RecoveryCompleteObjectLocator *col) { if (!col->valid) { return NULL; @@ -933,8 +929,6 @@ static const char *recovery_apply_complete_object_locator(RRTTIMSVCAnalContext * return name; } - - static const char *recovery_apply_type_descriptor(RRTTIMSVCAnalContext *context, RecoveryTypeDescriptor *td) { if (!td->valid) { return NULL; @@ -971,9 +965,10 @@ static const char *recovery_apply_type_descriptor(RRTTIMSVCAnalContext *context, return name; } -static void str_value_free(HtUPKv *kv) { +static inline void str_value_free(HtUPKv *kv) { if (kv) { - free (kv->value); + R_FREE (kv->value); + // free (kv); ??? } } @@ -1018,7 +1013,6 @@ R_API void r_anal_rtti_msvc_recover_all(RVTableContext *vt_context, RList *vtabl recovery_apply_complete_object_locator (&context, col); } #endif - r_pvector_clear (&context.vtables); r_pvector_clear (&context.complete_object_locators); ht_up_free (context.addr_col); @@ -1026,4 +1020,3 @@ R_API void r_anal_rtti_msvc_recover_all(RVTableContext *vt_context, RList *vtabl ht_up_free (context.addr_td); ht_up_free (context.col_td_classes); } - diff --git a/libr/arch/meson.build b/libr/arch/meson.build index f89bc51a6d..4c337e051a 100644 --- a/libr/arch/meson.build +++ b/libr/arch/meson.build @@ -10,6 +10,7 @@ r_arch_sources = [ 'p/arch_i4004.c', 'p/arch_amd29k.c', 'p/arch_jdh8.c', + 'p/arch_malbolge.c', 'p/arch_sh.c', 'p/sh/gnu/sh-dis.c', ] diff --git a/libr/arch/p/arch_malbolge.c b/libr/arch/p/arch_malbolge.c new file mode 100644 index 0000000000..a25a1e64ee --- /dev/null +++ b/libr/arch/p/arch_malbolge.c @@ -0,0 +1,81 @@ +/* radare - LGPL - Copyright 2015-2022 - condret */ + +#include +#include + +static bool mal_decode(RArchSession *s, RAnalOp *op, RArchEncodeMask mask) { + if (op->size < 1 || !op->bytes) { + return false; + } + const ut8 *data = op->bytes; + switch ((data[0] + op->addr) % 94) { + case 4: + op->type = R_ANAL_OP_TYPE_UJMP; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("jmp [d]"); + } + break; + case 5: + op->type = R_ANAL_OP_TYPE_IO; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("out a"); + } + break; + case 23: + op->type = R_ANAL_OP_TYPE_IO; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("in a"); + } + break; + case 39: + op->type = R_ANAL_OP_TYPE_ROR; + op->type2 = R_ANAL_OP_TYPE_LOAD; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("rotr [d], mov a, [d]"); + } + break; + case 40: + op->type = R_ANAL_OP_TYPE_LOAD; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("mov d, [d]"); + } + break; + case 62: + op->type = R_ANAL_OP_TYPE_XOR; + op->type2 = R_ANAL_OP_TYPE_LOAD; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("crz [d], a, mov a, [d]"); + } + break; + case 81: + op->type = R_ANAL_OP_TYPE_TRAP; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("end"); + } + break; + default: + op->type = R_ANAL_OP_TYPE_NOP; + if (mask & R_ARCH_OP_MASK_DISASM) { + op->mnemonic = strdup ("nop"); + } + } + op->size = 1; + return true; +} + +RArchPlugin r_arch_plugin_malbolge = { + .name = "malbolge", + .desc = "Malbolge analysis plugin", + .arch = "malbolge", + .license = "LGPL3", + .bits = 32, + .decode = &mal_decode, +}; + +#ifndef R2_PLUGIN_INCORE +R_API RLibStruct radare_plugin = { + .type = R_LIB_TYPE_ANAL, + .data = &r_arch_plugin_malbolge, + .version = R2_VERSION +}; +#endif diff --git a/libr/arch/p/malbolge.mk b/libr/arch/p/malbolge.mk new file mode 100644 index 0000000000..ad03750cdf --- /dev/null +++ b/libr/arch/p/malbolge.mk @@ -0,0 +1,9 @@ +OBJ_MALBOLGE=arch_malbolge.o + +STATIC_OBJ+=${OBJ_MALBOLGE} +TARGET_MALBOLGE=arch_malbolge.${EXT_SO} + +ALL_TARGETS+=${TARGET_MALBOLGE} + +${TARGET_MALBOLGE}: ${OBJ_MALBOLGE} + ${CC} $(call libname,arch_malbolge) ${LDFLAGS} ${CFLAGS} -o arch_malbolge.${EXT_SO} ${OBJ_MALBOLGE} diff --git a/libr/core/Makefile b/libr/core/Makefile index d83f262434..4529e54baa 100644 --- a/libr/core/Makefile +++ b/libr/core/Makefile @@ -2,7 +2,7 @@ include ../config.mk NAME=r_core -R2DEPS=r_config r_cons r_io r_util r_flag r_asm r_arch +R2DEPS=r_config r_cons r_io r_util r_flag r_asm r_arch r_esil R2DEPS+=r_debug r_bin r_lang r_io r_anal r_parse r_bp r_egg R2DEPS+=r_reg r_search r_syscall r_socket r_fs r_magic r_crypto diff --git a/libr/core/meson.build b/libr/core/meson.build index e0a2cb38d0..5182ef9a50 100644 --- a/libr/core/meson.build +++ b/libr/core/meson.build @@ -79,6 +79,7 @@ r_core_deps = [ r_syscall_dep, r_search_dep, r_arch_dep, + r_esil_dep, r_cons_dep, r_anal_dep, r_socket_dep, @@ -120,31 +121,32 @@ r_core_dep = declare_dependency(link_with: r_core, include_directories: r_core_i if get_option('blob') r_core_static_deps = [ - r_util_static_dep, - r_reg_static_dep, - r_syscall_static_dep, - r_search_static_dep, - r_arch_static_dep, - r_cons_static_dep, - r_anal_static_dep, - r_socket_static_dep, - r_io_static_dep, - r_fs_static_dep, - r_lang_static_dep, - r_magic_static_dep, - r_flag_static_dep, - r_parse_static_dep, - r_egg_static_dep, - r_debug_static_dep, - r_crypto_static_dep, - r_config_static_dep, - r_bin_static_dep, - r_asm_static_dep, - r_bp_static_dep, - platform_deps, gdb_static_dep, java_static_dep, - lrt + lrt, + platform_deps, + r_anal_static_dep, + r_arch_static_dep, + r_asm_static_dep, + r_bin_static_dep, + r_bp_static_dep, + r_config_static_dep, + r_cons_static_dep, + r_crypto_static_dep, + r_debug_static_dep, + r_egg_static_dep, + r_esil_static_dep, + r_flag_static_dep, + r_fs_static_dep, + r_io_static_dep, + r_lang_static_dep, + r_magic_static_dep, + r_parse_static_dep, + r_reg_static_dep, + r_search_static_dep, + r_socket_static_dep, + r_syscall_static_dep, + r_util_static_dep, ] r_core_static = static_library('r_core_static', r_core_sources, include_directories: r_core_inc, @@ -165,26 +167,27 @@ pkgconfig_mod.generate( filebase: 'r_core', libraries: pkgcfg_sanitize_libs, requires: pkgconfig_magic_requires + [ - 'r_util', - 'r_reg', - 'r_syscall', - 'r_search', - 'r_arch', - 'r_cons', 'r_anal', - 'r_socket', - 'r_io', - 'r_fs', - 'r_lang', - 'r_flag', - 'r_parse', - 'r_egg', - 'r_debug', - 'r_crypto', - 'r_config', - 'r_bin', + 'r_arch', 'r_asm', - 'r_bp' + 'r_bin', + 'r_bp', + 'r_config', + 'r_cons', + 'r_crypto', + 'r_debug', + 'r_egg', + 'r_esil', + 'r_flag', + 'r_fs', + 'r_io', + 'r_lang', + 'r_parse', + 'r_reg', + 'r_search', + 'r_socket', + 'r_syscall', + 'r_util', ], description: 'radare foundation libraries' ) diff --git a/libr/esil/Makefile b/libr/esil/Makefile new file mode 100644 index 0000000000..f7821c7669 --- /dev/null +++ b/libr/esil/Makefile @@ -0,0 +1,18 @@ +include ../config.mk + +NAME=r_esil +R2DEPS+=r_util r_reg + +CFLAGS+=-DR2_PLUGIN_INCORE +CFLAGS:=-I.. -I$(LTOP)/asm/esil/include -DR2_PLUGIN_INCORE -Iesil -I$(TOP)/shlr $(CFLAGS) + +.PHONY: pre +pre: libr_esil.$(EXT_SO) libr_esil.$(EXT_AR) + $(MAKE) -C p + +include $(STATIC_ESIL_PLUGINS) +STATIC_OBJS=$(subst ..,p/..,$(subst esil_,p/esil_,$(STATIC_OBJ))) +OBJS=esil.o esil_plugin.o esil_handler.o esil_stats.o esil_trace.o +OBJS+=${STATIC_OBJS} + +include ../rules.mk diff --git a/libr/anal/esil.c b/libr/esil/esil.c similarity index 99% rename from libr/anal/esil.c rename to libr/esil/esil.c index 73c7c1d60f..6dab4a86ed 100644 --- a/libr/anal/esil.c +++ b/libr/esil/esil.c @@ -1,6 +1,6 @@ /* radare - LGPL - Copyright 2014-2022 - pancake, condret */ -#define R_LOG_ORIGIN "anal.esil" +#define R_LOG_ORIGIN "esil" #include @@ -238,8 +238,8 @@ static ut8 esil_internal_sizeof_reg(RAnalEsil *esil, const char *r) { } static bool alignCheck(RAnalEsil *esil, ut64 addr) { - int dataAlign = r_anal_archinfo (esil->anal, R_ANAL_ARCHINFO_DATA_ALIGN); - return !(dataAlign > 0 && addr % dataAlign); + const int da = esil->data_align; // r_anal_archinfo (esil->anal, R_ANAL_ARCHINFO_DATA_ALIGN); + return !(da > 0 && addr % da); } static bool internal_esil_mem_read(RAnalEsil *esil, ut64 addr, ut8 *buf, int len) { diff --git a/libr/anal/esil_handler.c b/libr/esil/esil_handler.c similarity index 100% rename from libr/anal/esil_handler.c rename to libr/esil/esil_handler.c diff --git a/libr/anal/esil_plugin.c b/libr/esil/esil_plugin.c similarity index 100% rename from libr/anal/esil_plugin.c rename to libr/esil/esil_plugin.c diff --git a/libr/anal/esil_stats.c b/libr/esil/esil_stats.c similarity index 100% rename from libr/anal/esil_stats.c rename to libr/esil/esil_stats.c diff --git a/libr/anal/esil_trace.c b/libr/esil/esil_trace.c similarity index 100% rename from libr/anal/esil_trace.c rename to libr/esil/esil_trace.c diff --git a/libr/esil/meson.build b/libr/esil/meson.build new file mode 100644 index 0000000000..0664cdd5a3 --- /dev/null +++ b/libr/esil/meson.build @@ -0,0 +1,51 @@ +r_esil_sources = [ + 'esil.c', + 'esil_handler.c', + 'esil_plugin.c', + 'esil_stats.c', + 'esil_trace.c', +] + +extra_includes = include_directories('../asm/esil/include') + +r_esil = library('r_esil', r_esil_sources, + include_directories: [platform_inc, extra_includes], + c_args: library_cflags, + dependencies: [ + r_util_dep, + r_reg_dep + ], + install: true, + implicit_include_directories: false, + install_rpath: rpath_lib, + soversion: r2_libversion +) + +r_esil_dep = declare_dependency(link_with: r_esil, + include_directories: [platform_inc]) + +if get_option('blob') +r_esil_static = static_library('r_esil_static', r_esil_sources, + include_directories: [platform_inc, extra_includes], + c_args: library_cflags, + dependencies: [r_util_static_dep], + install: true, + implicit_include_directories: false, +) + +r_esil_static_dep = declare_dependency(link_with: r_esil_static, + include_directories: [platform_inc]) +endif + +pkgconfig_mod.generate(r_esil, + subdirs: 'libr', + version: r2_version, + name: 'r_esil', + filebase: 'r_esil', + libraries: pkgcfg_sanitize_libs, + requires: [ + 'r_util', + 'r_reg', + ], + description: 'radare foundation libraries' +) diff --git a/libr/esil/p/Makefile b/libr/esil/p/Makefile new file mode 100644 index 0000000000..657442dd83 --- /dev/null +++ b/libr/esil/p/Makefile @@ -0,0 +1,25 @@ +include ../../config.mk +include ../../../mk/platform.mk + +ifeq ($(WITHPIC),1) +CFLAGS+=-I../../include -I../arch/ -I../arch/include -Wall ${PIC_CFLAGS} ${LDFLAGS_LIB} +CFLAGS+=-D__UNIX__ + +all: ${ALL_TARGETS} + +ALL_TARGETS= +ESIL_PLUGINS=dummy.mk +include $(ESIL_PLUGINS) + +clean: + -rm -f *.so *.o ${STATIC_OBJ} + +mrproper: clean + -rm -f *.d + +.PHONY: all clean mrproper +else +all clean mrproper: + +.PHONY: all clean mrproper +endif diff --git a/libr/anal/p/dummy.mk b/libr/esil/p/dummy.mk similarity index 100% rename from libr/anal/p/dummy.mk rename to libr/esil/p/dummy.mk diff --git a/libr/anal/p/esil_dummy.c b/libr/esil/p/esil_dummy.c similarity index 100% rename from libr/anal/p/esil_dummy.c rename to libr/esil/p/esil_dummy.c diff --git a/libr/include/r_anal.h b/libr/include/r_anal.h index f23becb0e0..990f892dd4 100644 --- a/libr/include/r_anal.h +++ b/libr/include/r_anal.h @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -61,9 +62,6 @@ typedef struct r_anal_range_t { RBNode rb; } RAnalRange; - -#define esilprintf(op, fmt, ...) r_strbuf_setf (&op->esil, fmt, ##__VA_ARGS__) - enum { R_ANAL_DATA_TYPE_NULL = 0, R_ANAL_DATA_TYPE_UNKNOWN = 1, @@ -660,15 +658,6 @@ typedef struct r_anal_esil_word_t { const char *str; } RAnalEsilWord; -// only flags that affect control flow -enum { - R_ANAL_ESIL_FLAG_ZERO = 1, - R_ANAL_ESIL_FLAG_CARRY = 2, - R_ANAL_ESIL_FLAG_OVERFLOW = 4, - R_ANAL_ESIL_FLAG_PARITY = 8, - R_ANAL_ESIL_FLAG_SIGN = 16, - // ... -}; enum { R_ANAL_TRAP_NONE = 0, @@ -684,196 +673,6 @@ enum { R_ANAL_TRAP_HALT = 10, }; -enum { - R_ANAL_ESIL_PARM_INVALID = 0, - R_ANAL_ESIL_PARM_REG, - R_ANAL_ESIL_PARM_NUM, -}; - -/* Constructs to convert from ESIL to REIL */ -#define FOREACHOP(GENERATE) \ -/* No Operation */ GENERATE(NOP) \ -/* Unknown/Undefined */ GENERATE(UNK) \ -/* Conditional Jump */ GENERATE(JCC) \ -/* Store Value to register */ GENERATE(STR) \ -/* Store value to memory */ GENERATE(STM) \ -/* Load value from memory */ GENERATE(LDM) \ -/* Addition */ GENERATE(ADD) \ -/* Subtraction */ GENERATE(SUB) \ -/* Negation */ GENERATE(NEG) \ -/* Multiplication */ GENERATE(MUL) \ -/* Division */ GENERATE(DIV) \ -/* Modulo */ GENERATE(MOD) \ -/* Signed Multiplication */ GENERATE(SMUL) \ -/* Sugned Division */ GENERATE(SDIV) \ -/* Signed Modulus */ GENERATE(SMOD) \ -/* Shift Left */ GENERATE(SHL) \ -/* Shift Right */ GENERATE(SHR) \ -/* Binary and */ GENERATE(AND) \ -/* Binary or */ GENERATE(OR) \ -/* Binary xor */ GENERATE(XOR) \ -/* Binary not */ GENERATE(NOT) \ -/* Equation */ GENERATE(EQ) \ -/* Less Than */ GENERATE(LT) - -#define MAKE_ENUM(OP) REIL_##OP, -#define REIL_OP_STRING(STRING) #STRING, - -typedef enum { - FOREACHOP(MAKE_ENUM) -} RAnalReilOpcode; - -typedef enum { - ARG_REG, // CPU Register - ARG_TEMP, // Temporary register used by REIL - ARG_CONST, // Constant value - ARG_ESIL_INTERNAL, // Used to resolve ESIL internal flags - ARG_NONE // Operand not used by the instruction -} RAnalReilArgType; - -// Arguments to a REIL instruction. -typedef struct r_anal_reil_arg { - RAnalReilArgType type; // Type of the argument - ut8 size; // Size of the argument in bytes - char name[32]; // Name of the argument -} RAnalReilArg; - -typedef struct r_anal_ref_char { - char *str; - char *cols; -} RAnalRefStr; - -// Instruction arg1, arg2, arg3 -typedef struct r_anal_reil_inst { - RAnalReilOpcode opcode; - RAnalReilArg *arg[3]; -} RAnalReilInst; - -typedef struct r_anal_reil { - char old[32]; // Used to compute flags. - char cur[32]; - ut8 lastsz; - ut64 reilNextTemp; // Used to store the index of the next REIL temp register to be used. - ut64 addr; // Used for instruction sequencing. Check esil2reil.c for details. - ut8 seq_num; // Incremented and used when noInc is set to 1. - int skip; - int cmd_count; - char if_buf[64]; - char pc[8]; -} RAnalReil; - -// must be a char -#define ESIL_INTERNAL_PREFIX '$' -#define ESIL_STACK_NAME "esil.ram" -#define ESIL struct r_anal_esil_t - -typedef bool (*RAnalEsilHandlerCB)(ESIL *esil, ut32 h, void *user); - -typedef struct r_anal_esil_handler_t { - RAnalEsilHandlerCB cb; - void *user; -} RAnalEsilHandler; - -typedef struct r_anal_esil_change_reg_t { - int idx; - ut64 data; -} RAnalEsilRegChange; - -typedef struct r_anal_esil_change_mem_t { - int idx; - ut8 data; -} RAnalEsilMemChange; - -typedef struct r_anal_esil_trace_t { - int idx; - int end_idx; - HtUP *registers; - HtUP *memory; - RRegArena *arena[R_REG_TYPE_LAST]; - ut64 stack_addr; - ut64 stack_size; - ut8 *stack_data; - //TODO remove `db` and reuse info above - Sdb *db; -} RAnalEsilTrace; - -typedef bool (*RAnalEsilHookRegWriteCB)(ESIL *esil, const char *name, ut64 *val); - -typedef struct r_anal_esil_callbacks_t { - void *user; - /* callbacks */ - bool (*hook_flag_read)(ESIL *esil, const char *flag, ut64 *num); - bool (*hook_command)(ESIL *esil, const char *op); - bool (*hook_mem_read)(ESIL *esil, ut64 addr, ut8 *buf, int len); - bool (*mem_read)(ESIL *esil, ut64 addr, ut8 *buf, int len); - bool (*hook_mem_write)(ESIL *esil, ut64 addr, const ut8 *buf, int len); - bool (*mem_write)(ESIL *esil, ut64 addr, const ut8 *buf, int len); - bool (*hook_reg_read)(ESIL *esil, const char *name, ut64 *res, int *size); - bool (*reg_read)(ESIL *esil, const char *name, ut64 *res, int *size); - RAnalEsilHookRegWriteCB hook_reg_write; - bool (*reg_write)(ESIL *esil, const char *name, ut64 val); -} RAnalEsilCallbacks; - -typedef struct r_anal_esil_t { - RAnal *anal; - char **stack; - ut64 addrmask; - int stacksize; - int stackptr; - ut32 skip; - int nowrite; - int iotrap; - int exectrap; - int parse_stop; - int parse_goto; - int parse_goto_count; - int verbose; - ut64 flags; - ut64 address; - ut64 stack_addr; - ut32 stack_size; - int delay; // mapped to $ds in ESIL - ut64 jump_target; // mapped to $jt in ESIL - int jump_target_set; // mapped to $js in ESIL - int trap; - ut32 trap_code; // extend into a struct to store more exception info? - // parity flag? done with cur - ut64 old; //used for carry-flagging and borrow-flagging - ut64 cur; //used for carry-flagging and borrow-flagging - ut8 lastsz; //in bits //used for signature-flag - /* native ops and custom ops */ - HtPP *ops; - char *current_opstr; - SdbMini *interrupts; - SdbMini *syscalls; - //this is a disgusting workaround, because we have no ht-like storage without magic keys, that you cannot use, with int-keys - RAnalEsilHandler *intr0; - RAnalEsilHandler *sysc0; - RList *plugins; - RList *active_plugins; - /* deep esil parsing fills this */ - Sdb *stats; - RAnalEsilTrace *trace; - RAnalEsilCallbacks cb; - RAnalReil *Reil; - char *pending; // pending op computed as a macro - // this is so cursed, can we please remove external commands from esil internals. - // Function pointers are fine, but not commands - char *cmd_step; // r2 (external) command to run before a step is performed - char *cmd_step_out; // r2 (external) command to run after a step is performed - char *cmd_intr; // r2 (external) command to run when an interrupt occurs - char *cmd_trap; // r2 (external) command to run when a trap occurs - char *cmd_mdev; // r2 (external) command to run when an memory mapped device address is used - char *cmd_todo; // r2 (external) command to run when esil expr contains TODO - char *cmd_ioer; // r2 (external) command to run when esil fails to IO - char *mdev_range; // string containing the r_str_range to match for read/write accesses - bool (*cmd)(ESIL *esil, const char *name, ut64 a0, ut64 a1); - void *user; - int stack_fd; // ahem, let's not do this - bool in_cmd_step; -} RAnalEsil; - -#undef ESIL enum { R_ANAL_ESIL_OP_TYPE_UNKNOWN = 0x1, diff --git a/libr/include/r_esil.h b/libr/include/r_esil.h new file mode 100644 index 0000000000..bacfd4d538 --- /dev/null +++ b/libr/include/r_esil.h @@ -0,0 +1,219 @@ +/* radare2 - LGPL - Copyright 2022 - pancake */ + +#ifndef R_ESIL_H +#define R_ESIL_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define esilprintf(op, fmt, ...) r_strbuf_setf (&op->esil, fmt, ##__VA_ARGS__) +// only flags that affect control flow +enum { + R_ANAL_ESIL_FLAG_ZERO = 1, + R_ANAL_ESIL_FLAG_CARRY = 2, + R_ANAL_ESIL_FLAG_OVERFLOW = 4, + R_ANAL_ESIL_FLAG_PARITY = 8, + R_ANAL_ESIL_FLAG_SIGN = 16, + // ... +}; + +#define ESIL_INTERNAL_PREFIX '$' +#define ESIL_STACK_NAME "esil.ram" + +typedef struct r_anal_esil_t ESIL; + +typedef bool (*RAnalEsilHandlerCB)(ESIL *esil, ut32 h, void *user); + +typedef struct r_anal_esil_handler_t { + RAnalEsilHandlerCB cb; + void *user; +} RAnalEsilHandler; + +typedef struct r_anal_esil_change_reg_t { + int idx; + ut64 data; +} RAnalEsilRegChange; + +typedef struct r_anal_esil_change_mem_t { + int idx; + ut8 data; +} RAnalEsilMemChange; + +typedef struct r_anal_esil_trace_t { + int idx; + int end_idx; + HtUP *registers; + HtUP *memory; + RRegArena *arena[R_REG_TYPE_LAST]; + ut64 stack_addr; + ut64 stack_size; + ut8 *stack_data; + //TODO remove `db` and reuse info above + Sdb *db; +} RAnalEsilTrace; + +typedef bool (*RAnalEsilHookRegWriteCB)(ESIL *esil, const char *name, ut64 *val); + +typedef struct r_anal_esil_callbacks_t { + void *user; + /* callbacks */ + bool (*hook_flag_read)(ESIL *esil, const char *flag, ut64 *num); + bool (*hook_command)(ESIL *esil, const char *op); + bool (*hook_mem_read)(ESIL *esil, ut64 addr, ut8 *buf, int len); + bool (*mem_read)(ESIL *esil, ut64 addr, ut8 *buf, int len); + bool (*hook_mem_write)(ESIL *esil, ut64 addr, const ut8 *buf, int len); + bool (*mem_write)(ESIL *esil, ut64 addr, const ut8 *buf, int len); + bool (*hook_reg_read)(ESIL *esil, const char *name, ut64 *res, int *size); + bool (*reg_read)(ESIL *esil, const char *name, ut64 *res, int *size); + RAnalEsilHookRegWriteCB hook_reg_write; + bool (*reg_write)(ESIL *esil, const char *name, ut64 val); +} RAnalEsilCallbacks; + +typedef struct r_anal_esil_t { + struct r_anal_t *anal; // XXX maybe just use arch? + char **stack; + ut64 addrmask; + int stacksize; + int stackptr; + ut32 skip; + int nowrite; + int iotrap; + int exectrap; + int parse_stop; + int parse_goto; + int parse_goto_count; + int verbose; + ut64 flags; + ut64 address; + ut64 stack_addr; + ut32 stack_size; + int delay; // mapped to $ds in ESIL + ut64 jump_target; // mapped to $jt in ESIL + int jump_target_set; // mapped to $js in ESIL + int trap; + int data_align; + ut32 trap_code; // extend into a struct to store more exception info? + // parity flag? done with cur + ut64 old; //used for carry-flagging and borrow-flagging + ut64 cur; //used for carry-flagging and borrow-flagging + ut8 lastsz; //in bits //used for signature-flag + /* native ops and custom ops */ + HtPP *ops; + char *current_opstr; + SdbMini *interrupts; + SdbMini *syscalls; + //this is a disgusting workaround, because we have no ht-like storage without magic keys, that you cannot use, with int-keys + RAnalEsilHandler *intr0; + RAnalEsilHandler *sysc0; + RList *plugins; + RList *active_plugins; + /* deep esil parsing fills this */ + Sdb *stats; + RAnalEsilTrace *trace; + RAnalEsilCallbacks cb; + struct r_anal_reil_t *Reil; + char *pending; // pending op computed as a macro + // this is so cursed, can we please remove external commands from esil internals. + // Function pointers are fine, but not commands + char *cmd_step; // r2 (external) command to run before a step is performed + char *cmd_step_out; // r2 (external) command to run after a step is performed + char *cmd_intr; // r2 (external) command to run when an interrupt occurs + char *cmd_trap; // r2 (external) command to run when a trap occurs + char *cmd_mdev; // r2 (external) command to run when an memory mapped device address is used + char *cmd_todo; // r2 (external) command to run when esil expr contains TODO + char *cmd_ioer; // r2 (external) command to run when esil fails to IO + char *mdev_range; // string containing the r_str_range to match for read/write accesses + bool (*cmd)(ESIL *esil, const char *name, ut64 a0, ut64 a1); + void *user; + int stack_fd; // ahem, let's not do this + bool in_cmd_step; +} RAnalEsil; + + +/* reil -- must be deprecated */ +/* Constructs to convert from ESIL to REIL */ +#define FOREACHOP(GENERATE) \ +/* No Operation */ GENERATE(NOP) \ +/* Unknown/Undefined */ GENERATE(UNK) \ +/* Conditional Jump */ GENERATE(JCC) \ +/* Store Value to register */ GENERATE(STR) \ +/* Store value to memory */ GENERATE(STM) \ +/* Load value from memory */ GENERATE(LDM) \ +/* Addition */ GENERATE(ADD) \ +/* Subtraction */ GENERATE(SUB) \ +/* Negation */ GENERATE(NEG) \ +/* Multiplication */ GENERATE(MUL) \ +/* Division */ GENERATE(DIV) \ +/* Modulo */ GENERATE(MOD) \ +/* Signed Multiplication */ GENERATE(SMUL) \ +/* Sugned Division */ GENERATE(SDIV) \ +/* Signed Modulus */ GENERATE(SMOD) \ +/* Shift Left */ GENERATE(SHL) \ +/* Shift Right */ GENERATE(SHR) \ +/* Binary and */ GENERATE(AND) \ +/* Binary or */ GENERATE(OR) \ +/* Binary xor */ GENERATE(XOR) \ +/* Binary not */ GENERATE(NOT) \ +/* Equation */ GENERATE(EQ) \ +/* Less Than */ GENERATE(LT) + +#define MAKE_ENUM(OP) REIL_##OP, +#define REIL_OP_STRING(STRING) #STRING, + +typedef enum { + FOREACHOP(MAKE_ENUM) +} RAnalReilOpcode; + +typedef enum { + ARG_REG, // CPU Register + ARG_TEMP, // Temporary register used by REIL + ARG_CONST, // Constant value + ARG_ESIL_INTERNAL, // Used to resolve ESIL internal flags + ARG_NONE // Operand not used by the instruction +} RAnalReilArgType; + +// Arguments to a REIL instruction. +typedef struct r_anal_reil_arg { + RAnalReilArgType type; // Type of the argument + ut8 size; // Size of the argument in bytes + char name[32]; // Name of the argument +} RAnalReilArg; + +enum { + R_ANAL_ESIL_PARM_INVALID = 0, + R_ANAL_ESIL_PARM_REG, + R_ANAL_ESIL_PARM_NUM, +}; + +typedef struct r_anal_ref_char_t { + char *str; + char *cols; +} RAnalRefStr; + +// Instruction arg1, arg2, arg3 +typedef struct r_anal_reil_inst_t { + RAnalReilOpcode opcode; + RAnalReilArg *arg[3]; +} RAnalReilInst; + +typedef struct r_anal_reil_t { + char old[32]; // Used to compute flags. + char cur[32]; + ut8 lastsz; + ut64 reilNextTemp; // Used to store the index of the next REIL temp register to be used. + ut64 addr; // Used for instruction sequencing. Check esil2reil.c for details. + ut8 seq_num; // Incremented and used when noInc is set to 1. + int skip; + int cmd_count; + char if_buf[64]; + char pc[8]; +} RAnalReil; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libr/libs.mk b/libr/libs.mk index d21c8ca4a6..a204da838e 100644 --- a/libr/libs.mk +++ b/libr/libs.mk @@ -4,7 +4,7 @@ ifeq ($(LIBS0),) LIBS0=util LIBS1=socket reg cons magic bp config LIBS2=syscall lang crypto flag arch -LIBS3=parse io search +LIBS3=parse io search esil LIBS4=asm fs LIBS5=anal egg bin LIBS6=debug diff --git a/libr/meson.build b/libr/meson.build index d769787fc6..10ff00b77a 100644 --- a/libr/meson.build +++ b/libr/meson.build @@ -438,6 +438,7 @@ include_files = [ 'include/r_agraph.h', 'include/r_anal.h', 'include/r_arch.h', + 'include/r_esil.h', 'include/r_asm.h', 'include/r_bin.h', 'include/r_bin_dwarf.h', @@ -562,6 +563,11 @@ r_anal_files = [ ] install_headers(r_anal_files, install_dir: join_paths(r2_incdir, 'r_anal')) +r_esil_files = [ + 'include/r_esil.h', +] +install_headers(r_esil_files, install_dir: join_paths(r2_incdir, 'r_esil')) + sflib_common_files = [ join_paths('include/sflib/common/sftypes.h'), join_paths('include/sflib/common/sfsocketcall.h')