diff options
Diffstat (limited to 'miasm2/jitter/vm_mngr.c')
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index f9d19b9d..67599c39 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -393,6 +393,24 @@ void dump_code_bloc(vm_mngr_t* vm_mngr) } +void code_bloc_add_write(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size) +{ + if (vm_mngr->code_bloc_valid == 0) { + vm_mngr->code_bloc_valid = 1; + vm_mngr->code_bloc_memory_w_start = addr; + vm_mngr->code_bloc_memory_w_stop = addr + size; + } else { + if (vm_mngr->code_bloc_memory_w_stop != addr) { + fprintf(stderr, + "Error: sparse write %"PRIx64" %"PRIx64"\n", + vm_mngr->code_bloc_memory_w_stop, + addr); + exit(-1); + } + vm_mngr->code_bloc_memory_w_stop = addr + size; + } +} + void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr) { struct code_bloc_node * cbp; @@ -404,18 +422,32 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr) (addr < cbp->ad_stop)){ #ifdef DEBUG_MIASM_AUTOMOD_CODE fprintf(stderr, "**********************************\n"); - fprintf(stderr, "self modifying code %"PRIX64" %.8X\n", + fprintf(stderr, "self modifying code %"PRIX64" %"PRIX64"\n", addr, my_size); fprintf(stderr, "**********************************\n"); #endif vm_mngr->exception_flags |= EXCEPT_CODE_AUTOMOD; - + code_bloc_add_write(vm_mngr, addr, my_size/8); break; } } } } +void reset_code_bloc_write(vm_mngr_t* vm_mngr) +{ + vm_mngr->code_bloc_valid = 0; + vm_mngr->code_bloc_memory_w_start = 0; + vm_mngr->code_bloc_memory_w_stop = 0; +} + +int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop) +{ + *start = vm_mngr->code_bloc_memory_w_start; + *stop = vm_mngr->code_bloc_memory_w_stop; + return vm_mngr->code_bloc_valid; +} + PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr) { PyObject* pyaddr; @@ -1390,6 +1422,12 @@ void init_code_bloc_pool(vm_mngr_t* vm_mngr) LIST_INIT(&vm_mngr->code_bloc_pool); vm_mngr->code_bloc_pool_ad_min = 0xffffffff; vm_mngr->code_bloc_pool_ad_max = 0; + + vm_mngr->code_bloc_valid = 0; + vm_mngr->code_bloc_memory_w_start = 0; + vm_mngr->code_bloc_memory_w_stop = 0; + + } void init_memory_breakpoint(vm_mngr_t* vm_mngr) |