diff options
Diffstat (limited to 'frida_mode/src/asan')
-rw-r--r-- | frida_mode/src/asan/asan.c | 21 | ||||
-rw-r--r-- | frida_mode/src/asan/asan_arm.c | 28 | ||||
-rw-r--r-- | frida_mode/src/asan/asan_arm64.c | 78 | ||||
-rw-r--r-- | frida_mode/src/asan/asan_x64.c | 2 | ||||
-rw-r--r-- | frida_mode/src/asan/asan_x86.c | 2 |
5 files changed, 40 insertions, 91 deletions
diff --git a/frida_mode/src/asan/asan.c b/frida_mode/src/asan/asan.c index b2e763ca..f78f690c 100644 --- a/frida_mode/src/asan/asan.c +++ b/frida_mode/src/asan/asan.c @@ -1,18 +1,18 @@ -#include "frida-gumjs.h" +#include "frida-gum.h" #include "debug.h" #include "asan.h" -static gboolean asan_enabled = FALSE; -gboolean asan_initialized = FALSE; +gboolean asan_initialized = FALSE; -void asan_config(void) { +void asan_init(void) { if (getenv("AFL_USE_FASAN") != NULL) { OKF("Frida ASAN mode enabled"); - asan_enabled = TRUE; + asan_arch_init(); + asan_initialized = TRUE; } else { @@ -22,14 +22,3 @@ void asan_config(void) { } -void asan_init(void) { - - if (asan_enabled) { - - asan_arch_init(); - asan_initialized = TRUE; - - } - -} - diff --git a/frida_mode/src/asan/asan_arm.c b/frida_mode/src/asan/asan_arm.c new file mode 100644 index 00000000..79475ced --- /dev/null +++ b/frida_mode/src/asan/asan_arm.c @@ -0,0 +1,28 @@ +#include "frida-gum.h" + +#include "debug.h" + +#include "asan.h" +#include "util.h" + +#if defined(__arm__) +void asan_instrument(const cs_insn *instr, GumStalkerIterator *iterator) { + + UNUSED_PARAMETER(instr); + UNUSED_PARAMETER(iterator); + if (asan_initialized) { + + FATAL("ASAN mode not supported on this architecture"); + + } + +} + +void asan_arch_init(void) { + + FATAL("ASAN mode not supported on this architecture"); + +} + +#endif + diff --git a/frida_mode/src/asan/asan_arm64.c b/frida_mode/src/asan/asan_arm64.c index 65524e03..6262ee18 100644 --- a/frida_mode/src/asan/asan_arm64.c +++ b/frida_mode/src/asan/asan_arm64.c @@ -1,80 +1,18 @@ -#include <dlfcn.h> -#include "frida-gumjs.h" +#include "frida-gum.h" #include "debug.h" #include "asan.h" -#include "ctx.h" #include "util.h" #if defined(__aarch64__) - -typedef struct { - - size_t size; - cs_arm64_op operand; - -} asan_ctx_t; - -typedef void (*asan_loadN_t)(gsize address, uint8_t size); -typedef void (*asan_storeN_t)(gsize address, uint8_t size); - -asan_loadN_t asan_loadN = NULL; -asan_storeN_t asan_storeN = NULL; - -static void asan_callout(GumCpuContext *ctx, gpointer user_data) { - - asan_ctx_t * asan_ctx = (asan_ctx_t *)user_data; - cs_arm64_op * operand = &asan_ctx->operand; - arm64_op_mem *mem = &operand->mem; - gsize base = 0; - gsize index = 0; - gsize address; - - if (mem->base != ARM64_REG_INVALID) { base = ctx_read_reg(ctx, mem->base); } - - if (mem->index != ARM64_REG_INVALID) { - - index = ctx_read_reg(ctx, mem->index); - - } - - address = base + index + mem->disp; - - if ((operand->access & CS_AC_READ) == CS_AC_READ) { - - asan_loadN(address, asan_ctx->size); - - } - - if ((operand->access & CS_AC_WRITE) == CS_AC_WRITE) { - - asan_storeN(address, asan_ctx->size); - - } - -} - void asan_instrument(const cs_insn *instr, GumStalkerIterator *iterator) { + UNUSED_PARAMETER(instr); UNUSED_PARAMETER(iterator); + if (asan_initialized) { - cs_arm64 arm64 = instr->detail->arm64; - cs_arm64_op *operand; - asan_ctx_t * ctx; - - if (!asan_initialized) return; - - for (uint8_t i = 0; i < arm64.op_count; i++) { - - operand = &arm64.operands[i]; - - if (operand->type != ARM64_OP_MEM) { continue; } - - ctx = g_malloc0(sizeof(asan_ctx_t)); - ctx->size = ctx_get_size(instr, &arm64.operands[0]); - memcpy(&ctx->operand, operand, sizeof(cs_arm64_op)); - gum_stalker_iterator_put_callout(iterator, asan_callout, ctx, g_free); + FATAL("ASAN mode not supported on this architecture"); } @@ -82,13 +20,7 @@ void asan_instrument(const cs_insn *instr, GumStalkerIterator *iterator) { void asan_arch_init(void) { - asan_loadN = (asan_loadN_t)dlsym(RTLD_DEFAULT, "__asan_loadN"); - asan_storeN = (asan_loadN_t)dlsym(RTLD_DEFAULT, "__asan_storeN"); - if (asan_loadN == NULL || asan_storeN == NULL) { - - FATAL("Frida ASAN failed to find '__asan_loadN' or '__asan_storeN'"); - - } + FATAL("ASAN mode not supported on this architecture"); } diff --git a/frida_mode/src/asan/asan_x64.c b/frida_mode/src/asan/asan_x64.c index 5c12669f..a2eabe3c 100644 --- a/frida_mode/src/asan/asan_x64.c +++ b/frida_mode/src/asan/asan_x64.c @@ -1,5 +1,5 @@ #include <dlfcn.h> -#include "frida-gumjs.h" +#include "frida-gum.h" #include "debug.h" diff --git a/frida_mode/src/asan/asan_x86.c b/frida_mode/src/asan/asan_x86.c index 6d2f9e2b..8490b490 100644 --- a/frida_mode/src/asan/asan_x86.c +++ b/frida_mode/src/asan/asan_x86.c @@ -1,5 +1,5 @@ #include <dlfcn.h> -#include "frida-gumjs.h" +#include "frida-gum.h" #include "debug.h" |