#include "entry.h" #include "instrument.h" #include "js.h" #include "output.h" #include "persistent.h" #include "prefetch.h" #include "ranges.h" #include "seccomp.h" #include "stalker.h" #include "stats.h" #include "util.h" typedef uint8_t u8; extern void __afl_set_persistent_mode(u8 mode); __attribute__((visibility("default"))) void js_api_done() { js_done = TRUE; } __attribute__((visibility("default"))) void js_api_error(char *msg) { FFATAL("%s", msg); } __attribute__((visibility("default"))) void js_api_set_entrypoint( void *address) { if (address == NULL) { js_api_error("js_api_set_entrypoint called with NULL"); } entry_point = GPOINTER_TO_SIZE(address); } __attribute__((visibility("default"))) void js_api_set_persistent_address( void *address) { if (address == NULL) { js_api_error("js_api_set_persistent_address called with NULL"); } persistent_start = GPOINTER_TO_SIZE(address); __afl_set_persistent_mode(1); } __attribute__((visibility("default"))) void js_api_set_persistent_return( void *address) { if (address == NULL) { js_api_error("js_api_set_persistent_return called with NULL"); } persistent_ret = GPOINTER_TO_SIZE(address); } __attribute__((visibility("default"))) void js_api_set_persistent_count( uint64_t count) { persistent_count = count; } __attribute__((visibility("default"))) void js_api_set_persistent_debug() { persistent_debug = TRUE; } __attribute__((visibility("default"))) void js_api_set_debug_maps() { ranges_debug_maps = TRUE; } __attribute__((visibility("default"))) void js_api_add_include_range( void *address, gsize size) { GumMemoryRange range = {.base_address = GUM_ADDRESS(address), .size = size}; ranges_add_include(&range); } __attribute__((visibility("default"))) void js_api_add_exclude_range( void *address, gsize size) { GumMemoryRange range = {.base_address = GUM_ADDRESS(address), .size = size}; ranges_add_exclude(&range); } __attribute__((visibility("default"))) void js_api_set_instrument_jit() { ranges_inst_jit = TRUE; } __attribute__((visibility("default"))) void js_api_set_instrument_libraries() { ranges_inst_libs = TRUE; } __attribute__((visibility("default"))) void js_api_set_instrument_coverage_file( char *path) { instrument_coverage_filename = g_strdup(path); } __attribute__((visibility("default"))) void js_api_set_instrument_debug_file( char *path) { instrument_debug_filename = g_strdup(path); } __attribute__((visibility("default"))) void js_api_set_prefetch_disable(void) { prefetch_enable = FALSE; } __attribute__((visibility("default"))) void js_api_set_prefetch_backpatch_disable(void) { prefetch_backpatch = FALSE; } __attribute__((visibility("default"))) void js_api_set_instrument_instructions( void) { instrument_coverage_insn = TRUE; } __attribute__((visibility("default"))) void js_api_set_instrument_no_optimize( void) { instrument_optimize = FALSE; } __attribute__((visibility("default"))) void js_api_set_instrument_regs_file( char *path) { instrument_regs_filename = g_strdup(path); } __attribute__((visibility("default"))) void js_api_set_instrument_seed( guint64 seed) { instrument_use_fixed_seed = TRUE; instrument_fixed_seed = seed; } __attribute__((visibility("default"))) void js_api_set_instrument_trace(void) { instrument_tracing = TRUE; } __attribute__((visibility("default"))) void js_api_set_instrument_trace_unique( void) { instrument_unique = TRUE; } __attribute__((visibility("default"))) void js_api_set_instrument_unstable_coverage_file(char *path) { instrument_coverage_unstable_filename = g_strdup(path); } __attribute__((visibility("default"))) void js_api_set_seccomp_file( char *file) { seccomp_filename = g_strdup(file); } __attribute__((visibility("default"))) void js_api_set_stdout(char *file) { output_stdout = g_strdup(file); } __attribute__((visibility("default"))) void js_api_set_stderr(char *file) { output_stderr = g_strdup(file); } __attribute__((visibility("default"))) void js_api_set_stats_file(char *file) { stats_filename = g_strdup(file); } __attribute__((visibility("default"))) void js_api_set_stats_interval( uint64_t interval) { stats_interval = interval; } __attribute__((visibility("default"))) void js_api_set_persistent_hook( void *address) { if (address == NULL) { js_api_error("js_api_set_persistent_hook called with NULL"); } persistent_hook = address; } __attribute__((visibility("default"))) void js_api_set_stalker_callback( const js_api_stalker_callback_t callback) { js_user_callback = callback; } __attribute__((visibility("default"))) void js_api_set_stalker_ic_entries( guint val) { stalker_ic_entries = val; } __attribute__((visibility("default"))) void js_api_set_traceable(void) { traceable = TRUE; } __attribute__((visibility("default"))) void js_api_set_backpatch_disable(void) { backpatch_enable = FALSE; } __attribute__((visibility("default"))) void js_api_set_stalker_adjacent_blocks( guint val) { stalker_adjacent_blocks = val; } __attribute__((visibility("default"))) void js_api_set_cache_disable(void) { instrument_cache_enabled = FALSE; } __attribute__((visibility("default"))) void js_api_set_instrument_cache_size( gsize size) { instrument_cache_size = size; } __attribute__((visibility("default"))) void js_api_set_js_main_hook( const js_main_hook_t hook) { js_main_hook = hook; } __attribute__((visibility("default"))) void js_api_set_verbose(void) { util_verbose = TRUE; }