aboutsummaryrefslogtreecommitdiff
path: root/frida_mode/src/persistent/persistent.c
diff options
context:
space:
mode:
authorWorksButNotTested <62701594+WorksButNotTested@users.noreply.github.com>2021-04-28 09:25:26 +0100
committerGitHub <noreply@github.com>2021-04-28 10:25:26 +0200
commit39ad3b89467d6de12cbb9d08ccd77d331c0d1f9e (patch)
tree18bdf509d47e0d971bd9d7faf56d27758b23b09c /frida_mode/src/persistent/persistent.c
parent8da5cba4012080afca5e7f7da9aaa6aa6e263f3e (diff)
downloadafl++-39ad3b89467d6de12cbb9d08ccd77d331c0d1f9e.tar.gz
Frida persistent (#880)
* Added x64 support for persistent mode (function call only), in-memory teest cases and complog * Review changes, fix NeverZero and code to parse the .text section of the main executable. Excluded ranges TBC * Various minor fixes and finished support for AFL_INST_LIBS * Review changes Co-authored-by: Your Name <you@example.com>
Diffstat (limited to 'frida_mode/src/persistent/persistent.c')
-rw-r--r--frida_mode/src/persistent/persistent.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/frida_mode/src/persistent/persistent.c b/frida_mode/src/persistent/persistent.c
new file mode 100644
index 00000000..fe3a1d20
--- /dev/null
+++ b/frida_mode/src/persistent/persistent.c
@@ -0,0 +1,68 @@
+#include <dlfcn.h>
+
+#include "frida-gum.h"
+
+#include "config.h"
+#include "debug.h"
+
+#include "persistent.h"
+#include "util.h"
+
+int __afl_sharedmem_fuzzing = 0;
+afl_persistent_hook_fn hook = NULL;
+guint64 persistent_start = 0;
+guint64 persistent_count = 0;
+
+void persistent_init(void) {
+
+ char *hook_name = getenv("AFL_FRIDA_PERSISTENT_HOOK");
+
+ persistent_start = util_read_address("AFL_FRIDA_PERSISTENT_ADDR");
+ persistent_count = util_read_num("AFL_FRIDA_PERSISTENT_CNT");
+
+ if (persistent_count != 0 && persistent_start == 0)
+ FATAL(
+ "AFL_FRIDA_PERSISTENT_ADDR must be specified if "
+ "AFL_FRIDA_PERSISTENT_CNT is");
+
+ if (persistent_start != 0 && persistent_count == 0) persistent_count = 1000;
+
+ if (persistent_count != 0 && persistent_count < 100)
+ WARNF("Persistent count out of recommended range (<100)");
+
+ if (persistent_count > 10000)
+ WARNF("Persistent count out of recommended range (<10000)");
+
+ if (persistent_start != 0 && !persistent_is_supported())
+ FATAL("Persistent mode not supported on this architecture");
+
+ OKF("Instrumentation - persistent mode [%c] (0x%016lX)",
+ persistent_start == 0 ? ' ' : 'X', persistent_start);
+ OKF("Instrumentation - persistent count [%c] (%ld)",
+ persistent_start == 0 ? ' ' : 'X', persistent_count);
+ OKF("Instrumentation - hook [%s]", hook_name);
+
+ if (hook_name != NULL) {
+
+ void *hook_obj = dlopen(hook_name, RTLD_NOW);
+ if (hook_obj == NULL)
+ FATAL("Failed to load AFL_FRIDA_PERSISTENT_HOOK (%s)", hook_name);
+
+ int (*afl_persistent_hook_init_ptr)(void) =
+ dlsym(hook_obj, "afl_persistent_hook_init");
+ if (afl_persistent_hook_init_ptr == NULL)
+ FATAL("Failed to find afl_persistent_hook_init in %s", hook_name);
+
+ if (afl_persistent_hook_init_ptr() == 0)
+ FATAL("afl_persistent_hook_init returned a failure");
+
+ hook = (afl_persistent_hook_fn)dlsym(hook_obj, "afl_persistent_hook");
+ if (hook == NULL)
+ FATAL("Failed to find afl_persistent_hook in %s", hook_name);
+
+ __afl_sharedmem_fuzzing = 1;
+
+ }
+
+}
+