mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-15 11:28:08 +00:00
Changes to allow configuration of stalker adjacent blocks
This commit is contained in:
@ -215,6 +215,11 @@ gdb \
|
|||||||
```
|
```
|
||||||
* `AFL_FRIDA_SECCOMP_FILE` - Write a log of any syscalls made by the target to
|
* `AFL_FRIDA_SECCOMP_FILE` - Write a log of any syscalls made by the target to
|
||||||
the specified file.
|
the specified file.
|
||||||
|
* `AFL_FRIDA_STALKER_ADJACENT_BLOCKS` - Configure the number of adjacent blocks
|
||||||
|
to fetch when generating instrumented code. By fetching blocks in the same
|
||||||
|
order they appear in the original program, rather than the order of execution
|
||||||
|
should help reduce locallity and adjacency. This includes allowing us to vector
|
||||||
|
between adjancent blocks using a NOP slide rather than an immediate branch.
|
||||||
* `AFL_FRIDA_STALKER_IC_ENTRIES` - Configure the number of inline cache entries
|
* `AFL_FRIDA_STALKER_IC_ENTRIES` - Configure the number of inline cache entries
|
||||||
stored along-side branch instructions which provide a cache to avoid having to
|
stored along-side branch instructions which provide a cache to avoid having to
|
||||||
call back into FRIDA to find the next block. Default is 32.
|
call back into FRIDA to find the next block. Default is 32.
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
js_api_set_prefetch_disable;
|
js_api_set_prefetch_disable;
|
||||||
js_api_set_seccomp_file;
|
js_api_set_seccomp_file;
|
||||||
js_api_set_stalker_callback;
|
js_api_set_stalker_callback;
|
||||||
|
js_api_set_stalker_adjacent_blocks;
|
||||||
js_api_set_stalker_ic_entries;
|
js_api_set_stalker_ic_entries;
|
||||||
js_api_set_stats_file;
|
js_api_set_stats_file;
|
||||||
js_api_set_stats_interval;
|
js_api_set_stats_interval;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
extern guint stalker_ic_entries;
|
extern guint stalker_ic_entries;
|
||||||
extern gboolean backpatch_enable;
|
extern gboolean backpatch_enable;
|
||||||
|
extern guint stalker_adjacent_blocks;
|
||||||
|
|
||||||
void stalker_config(void);
|
void stalker_config(void);
|
||||||
void stalker_init(void);
|
void stalker_init(void);
|
||||||
|
@ -205,6 +205,12 @@ class Afl {
|
|||||||
const buf = Memory.allocUtf8String(file);
|
const buf = Memory.allocUtf8String(file);
|
||||||
Afl.jsApiSetSeccompFile(buf);
|
Afl.jsApiSetSeccompFile(buf);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* See `AFL_FRIDA_STALKER_ADJACENT_BLOCKS`.
|
||||||
|
*/
|
||||||
|
static setStalkerAdjacentBlocks(val) {
|
||||||
|
Afl.jsApiSetStalkerAdjacentBlocks(val);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Set a function to be called for each instruction which is instrumented
|
* Set a function to be called for each instruction which is instrumented
|
||||||
* by AFL FRIDA mode.
|
* by AFL FRIDA mode.
|
||||||
@ -294,6 +300,7 @@ Afl.jsApiSetPrefetchBackpatchDisable = Afl.jsApiGetFunction("js_api_set_prefetch
|
|||||||
Afl.jsApiSetPrefetchDisable = Afl.jsApiGetFunction("js_api_set_prefetch_disable", "void", []);
|
Afl.jsApiSetPrefetchDisable = Afl.jsApiGetFunction("js_api_set_prefetch_disable", "void", []);
|
||||||
Afl.jsApiSetSeccompFile = Afl.jsApiGetFunction("js_api_set_seccomp_file", "void", ["pointer"]);
|
Afl.jsApiSetSeccompFile = Afl.jsApiGetFunction("js_api_set_seccomp_file", "void", ["pointer"]);
|
||||||
Afl.jsApiSetStalkerCallback = Afl.jsApiGetFunction("js_api_set_stalker_callback", "void", ["pointer"]);
|
Afl.jsApiSetStalkerCallback = Afl.jsApiGetFunction("js_api_set_stalker_callback", "void", ["pointer"]);
|
||||||
|
Afl.jsApiSetStalkerAdjacentBlocks = Afl.jsApiGetFunction("js_api_set_stalker_adjacent_blocks", "void", ["uint32"]);
|
||||||
Afl.jsApiSetStalkerIcEntries = Afl.jsApiGetFunction("js_api_set_stalker_ic_entries", "void", ["uint32"]);
|
Afl.jsApiSetStalkerIcEntries = Afl.jsApiGetFunction("js_api_set_stalker_ic_entries", "void", ["uint32"]);
|
||||||
Afl.jsApiSetStatsFile = Afl.jsApiGetFunction("js_api_set_stats_file", "void", ["pointer"]);
|
Afl.jsApiSetStatsFile = Afl.jsApiGetFunction("js_api_set_stats_file", "void", ["pointer"]);
|
||||||
Afl.jsApiSetStatsInterval = Afl.jsApiGetFunction("js_api_set_stats_interval", "void", ["uint64"]);
|
Afl.jsApiSetStatsInterval = Afl.jsApiGetFunction("js_api_set_stats_interval", "void", ["uint64"]);
|
||||||
|
@ -250,3 +250,11 @@ __attribute__((visibility("default"))) void js_api_set_backpatch_disable(void) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__((visibility("default"))) void js_api_set_stalker_adjacent_blocks(
|
||||||
|
guint val) {
|
||||||
|
|
||||||
|
stalker_adjacent_blocks = val;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
guint stalker_ic_entries = 0;
|
guint stalker_ic_entries = 0;
|
||||||
gboolean backpatch_enable = TRUE;
|
gboolean backpatch_enable = TRUE;
|
||||||
|
guint stalker_adjacent_blocks = 0;
|
||||||
|
|
||||||
static GumStalker *stalker = NULL;
|
static GumStalker *stalker = NULL;
|
||||||
|
|
||||||
@ -60,7 +61,9 @@ void stalker_config(void) {
|
|||||||
|
|
||||||
backpatch_enable = (getenv("AFL_FRIDA_INST_NO_BACKPATCH") == NULL);
|
backpatch_enable = (getenv("AFL_FRIDA_INST_NO_BACKPATCH") == NULL);
|
||||||
|
|
||||||
stalker_ic_entries = util_read_num("AFL_FRIDA_STALKER_IC_ENTRIES");
|
stalker_ic_entries = util_read_num("AFL_FRIDA_STALKER_ADJACENT_BLOCKS");
|
||||||
|
|
||||||
|
stalker_adjacent_blocks = util_read_num("AFL_FRIDA_STALKER_IC_ENTRIES");
|
||||||
|
|
||||||
observer = g_object_new(GUM_TYPE_AFL_STALKER_OBSERVER, NULL);
|
observer = g_object_new(GUM_TYPE_AFL_STALKER_OBSERVER, NULL);
|
||||||
|
|
||||||
@ -92,6 +95,7 @@ void stalker_init(void) {
|
|||||||
FOKF("Instrumentation - backpatch [%c]", backpatch_enable ? 'X' : ' ');
|
FOKF("Instrumentation - backpatch [%c]", backpatch_enable ? 'X' : ' ');
|
||||||
|
|
||||||
FOKF("Stalker - ic_entries [%u]", stalker_ic_entries);
|
FOKF("Stalker - ic_entries [%u]", stalker_ic_entries);
|
||||||
|
FOKF("Stalker - adjacent_blocks [%u]", stalker_adjacent_blocks);
|
||||||
|
|
||||||
#if !(defined(__x86_64__) || defined(__i386__))
|
#if !(defined(__x86_64__) || defined(__i386__))
|
||||||
if (stalker_ic_entries != 0) {
|
if (stalker_ic_entries != 0) {
|
||||||
@ -100,13 +104,21 @@ void stalker_init(void) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (stalker_adjacent_blocks != 0) {
|
||||||
|
|
||||||
|
FFATAL("AFL_FRIDA_STALKER_ADJACENT_BLOCKS not supported");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (stalker_ic_entries == 0) { stalker_ic_entries = 32; }
|
if (stalker_ic_entries == 0) { stalker_ic_entries = 32; }
|
||||||
|
|
||||||
|
if (stalker_adjacent_blocks == 0) { stalker_adjacent_blocks = 32; }
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
stalker =
|
stalker = g_object_new(GUM_TYPE_STALKER, "ic-entries", stalker_ic_entries,
|
||||||
g_object_new(GUM_TYPE_STALKER, "ic-entries", stalker_ic_entries, NULL);
|
"adjacent-blocks", stalker_adjacent_blocks, NULL);
|
||||||
#else
|
#else
|
||||||
stalker = gum_stalker_new();
|
stalker = gum_stalker_new();
|
||||||
#endif
|
#endif
|
||||||
|
@ -241,6 +241,13 @@ class Afl {
|
|||||||
Afl.jsApiSetSeccompFile(buf);
|
Afl.jsApiSetSeccompFile(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See `AFL_FRIDA_STALKER_ADJACENT_BLOCKS`.
|
||||||
|
*/
|
||||||
|
public static setStalkerAdjacentBlocks(val: number): void {
|
||||||
|
Afl.jsApiSetStalkerAdjacentBlocks(val);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set a function to be called for each instruction which is instrumented
|
* Set a function to be called for each instruction which is instrumented
|
||||||
* by AFL FRIDA mode.
|
* by AFL FRIDA mode.
|
||||||
@ -425,6 +432,11 @@ class Afl {
|
|||||||
"void",
|
"void",
|
||||||
["pointer"]);
|
["pointer"]);
|
||||||
|
|
||||||
|
private static readonly jsApiSetStalkerAdjacentBlocks = Afl.jsApiGetFunction(
|
||||||
|
"js_api_set_stalker_adjacent_blocks",
|
||||||
|
"void",
|
||||||
|
["uint32"]);
|
||||||
|
|
||||||
private static readonly jsApiSetStalkerIcEntries = Afl.jsApiGetFunction(
|
private static readonly jsApiSetStalkerIcEntries = Afl.jsApiGetFunction(
|
||||||
"js_api_set_stalker_ic_entries",
|
"js_api_set_stalker_ic_entries",
|
||||||
"void",
|
"void",
|
||||||
|
@ -76,6 +76,8 @@ static char *afl_environment_variables[] = {
|
|||||||
"AFL_FRIDA_PERSISTENT_DEBUG",
|
"AFL_FRIDA_PERSISTENT_DEBUG",
|
||||||
"AFL_FRIDA_PERSISTENT_HOOK",
|
"AFL_FRIDA_PERSISTENT_HOOK",
|
||||||
"AFL_FRIDA_PERSISTENT_RET",
|
"AFL_FRIDA_PERSISTENT_RET",
|
||||||
|
"AFL_FRIDA_STALKER_IC_ENTRIES",
|
||||||
|
"AFL_FRIDA_STALKER_ADJACENT_BLOCKS",
|
||||||
"AFL_FRIDA_STATS_FILE",
|
"AFL_FRIDA_STATS_FILE",
|
||||||
"AFL_FRIDA_STATS_INTERVAL",
|
"AFL_FRIDA_STATS_INTERVAL",
|
||||||
"AFL_FRIDA_TRACEABLE",
|
"AFL_FRIDA_TRACEABLE",
|
||||||
|
Reference in New Issue
Block a user