about summary refs log tree commit diff
path: root/frida_mode/src/cmplog/cmplog.c
diff options
context:
space:
mode:
Diffstat (limited to 'frida_mode/src/cmplog/cmplog.c')
-rw-r--r--frida_mode/src/cmplog/cmplog.c110
1 files changed, 11 insertions, 99 deletions
diff --git a/frida_mode/src/cmplog/cmplog.c b/frida_mode/src/cmplog/cmplog.c
index a2609c8e..7b11c350 100644
--- a/frida_mode/src/cmplog/cmplog.c
+++ b/frida_mode/src/cmplog/cmplog.c
@@ -1,32 +1,19 @@
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <sys/mman.h>
-#include <sys/syscall.h>
-#include <unistd.h>
-
-#include "frida-gumjs.h"
+#include "frida-gum.h"
 
 #include "debug.h"
 
 #include "util.h"
 
 #define DEFAULT_MMAP_MIN_ADDR (32UL << 10)
-#define MAX_MEMFD_SIZE (64UL << 10)
 
 extern struct cmp_map *__afl_cmp_map;
-static GArray *        cmplog_ranges = NULL;
-static GHashTable *    hash_yes = NULL;
-static GHashTable *    hash_no = NULL;
 
-static long page_size = 0;
-static long page_offset_mask = 0;
-static long page_mask = 0;
+static GArray *cmplog_ranges = NULL;
 
 static gboolean cmplog_range(const GumRangeDetails *details,
                              gpointer               user_data) {
 
-  GArray *       cmplog_ranges = (GArray *)user_data;
+  UNUSED_PARAMETER(user_data);
   GumMemoryRange range = *details->range;
   g_array_append_val(cmplog_ranges, range);
   return TRUE;
@@ -40,50 +27,20 @@ static gint cmplog_sort(gconstpointer a, gconstpointer b) {
 
 }
 
-static void cmplog_get_ranges(void) {
-
-  OKF("CMPLOG - Collecting ranges");
-
-  cmplog_ranges = g_array_sized_new(false, false, sizeof(GumMemoryRange), 100);
-  gum_process_enumerate_ranges(GUM_PAGE_READ, cmplog_range, cmplog_ranges);
-  g_array_sort(cmplog_ranges, cmplog_sort);
-
-}
-
-void cmplog_config(void) {
-
-}
-
 void cmplog_init(void) {
 
   if (__afl_cmp_map != NULL) { OKF("CMPLOG mode enabled"); }
 
-  cmplog_get_ranges();
+  cmplog_ranges = g_array_sized_new(false, false, sizeof(GumMemoryRange), 100);
+  gum_process_enumerate_ranges(GUM_PAGE_READ, cmplog_range, NULL);
+  g_array_sort(cmplog_ranges, cmplog_sort);
 
   for (guint i = 0; i < cmplog_ranges->len; i++) {
 
     GumMemoryRange *range = &g_array_index(cmplog_ranges, GumMemoryRange, i);
-    OKF("CMPLOG Range - %3u: 0x%016" G_GINT64_MODIFIER
-        "X - 0x%016" G_GINT64_MODIFIER "X",
-        i, range->base_address, range->base_address + range->size);
-
-  }
-
-  page_size = sysconf(_SC_PAGE_SIZE);
-  page_offset_mask = page_size - 1;
-  page_mask = ~(page_offset_mask);
-
-  hash_yes = g_hash_table_new(g_direct_hash, g_direct_equal);
-  if (hash_yes == NULL) {
-
-    FATAL("Failed to g_hash_table_new, errno: %d", errno);
-
-  }
-
-  hash_no = g_hash_table_new(g_direct_hash, g_direct_equal);
-  if (hash_no == NULL) {
-
-    FATAL("Failed to g_hash_table_new, errno: %d", errno);
+    OKF("CMPLOG Range - 0x%016" G_GINT64_MODIFIER "X - 0x%016" G_GINT64_MODIFIER
+        "X",
+        range->base_address, range->base_address + range->size);
 
   }
 
@@ -96,45 +53,6 @@ static gboolean cmplog_contains(GumAddress inner_base, GumAddress inner_limit,
 
 }
 
-gboolean cmplog_test_addr(guint64 addr, size_t size) {
-
-  if (g_hash_table_contains(hash_yes, GSIZE_TO_POINTER(addr))) { return true; }
-  if (g_hash_table_contains(hash_no, GSIZE_TO_POINTER(addr))) { return false; }
-
-  void * page_addr = GSIZE_TO_POINTER(addr & page_mask);
-  size_t page_offset = addr & page_offset_mask;
-
-  /* If it spans a page, then bail */
-  if (page_size - page_offset < size) { return false; }
-
-  /*
-   * Our address map can change (e.g. stack growth), use msync as a fallback to
-   * validate our address.
-   */
-  if (msync(page_addr, page_offset + size, MS_ASYNC) < 0) {
-
-    if (!g_hash_table_add(hash_no, GSIZE_TO_POINTER(addr))) {
-
-      FATAL("Failed - g_hash_table_add");
-
-    }
-
-    return false;
-
-  } else {
-
-    if (!g_hash_table_add(hash_yes, GSIZE_TO_POINTER(addr))) {
-
-      FATAL("Failed - g_hash_table_add");
-
-    }
-
-    return true;
-
-  }
-
-}
-
 gboolean cmplog_is_readable(guint64 addr, size_t size) {
 
   if (cmplog_ranges == NULL) FATAL("CMPLOG not initialized");
@@ -149,26 +67,20 @@ gboolean cmplog_is_readable(guint64 addr, size_t size) {
    */
   if (addr < DEFAULT_MMAP_MIN_ADDR) { return false; }
 
-  /* Check our addres/length don't wrap around */
-  if (SIZE_MAX - addr < size) { return false; }
-
   GumAddress inner_base = addr;
   GumAddress inner_limit = inner_base + size;
 
   for (guint i = 0; i < cmplog_ranges->len; i++) {
 
     GumMemoryRange *range = &g_array_index(cmplog_ranges, GumMemoryRange, i);
-
-    GumAddress outer_base = range->base_address;
-    GumAddress outer_limit = outer_base + range->size;
+    GumAddress      outer_base = range->base_address;
+    GumAddress      outer_limit = outer_base + range->size;
 
     if (cmplog_contains(inner_base, inner_limit, outer_base, outer_limit))
       return true;
 
   }
 
-  if (cmplog_test_addr(addr, size)) { return true; }
-
   return false;
 
 }