diff --git a/pinpoint/stage0/separate_offset_pass.cpp b/pinpoint/stage0/separate_offset_pass.cpp index 0c3c0ce..2f8e805 100644 --- a/pinpoint/stage0/separate_offset_pass.cpp +++ b/pinpoint/stage0/separate_offset_pass.cpp @@ -1,4 +1,3 @@ -#include // TODO #include #include #include diff --git a/selfpatch/src/spslr_program.h b/selfpatch/src/spslr_program.h index 190818b..abf4f57 100644 --- a/selfpatch/src/spslr_program.h +++ b/selfpatch/src/spslr_program.h @@ -4,6 +4,8 @@ #include #include +#define SPSLR_FLAG_FIELD_FIXED 1 + enum SPSLR_OPCODE { SPSLR_TARGET, // uid, size, field count SPSLR_FIELD, // offset, size, flags diff --git a/selfpatch/src/targets.c b/selfpatch/src/targets.c index 6c18dff..ecc125f 100644 --- a/selfpatch/src/targets.c +++ b/selfpatch/src/targets.c @@ -1,4 +1,5 @@ #include "targets.h" +#include "spslr_program.h" #include #include @@ -17,7 +18,7 @@ struct Field { uint32_t offset; uint32_t size; - uint32_t flags; // TODO -> fixed flag! + uint32_t flags; }; struct FinalField { @@ -177,6 +178,11 @@ static uint32_t target_get_shuffle_options(const struct Target* target, uint32_t if (f->offset >= option_would_end) break; + if (f->flags & SPSLR_FLAG_FIELD_FIXED) { + conflict = 1; + break; + } + // Could field be placed in origin? uint32_t falign = field_alignment(f); if (origin_region_ptr % falign != 0) @@ -248,6 +254,10 @@ static void target_shuffle_one(struct Target* target) { return; uint32_t origin = rand_uint32() % target->field_count; + + if (target->fields[origin].flags & SPSLR_FLAG_FIELD_FIXED) + return; + uint32_t origin_alignment = field_alignment(&target->fields[origin]); uint32_t max_options = target->size / origin_alignment;