diff options
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 40 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 6 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 18 |
3 files changed, 20 insertions, 44 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index 67599c39..5cf6f162 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -395,20 +395,14 @@ 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; - } + PyObject* range; + + + range = PyTuple_New(2); + PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)addr)); + PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)addr+size)); + + PyList_Append(vm_mngr->code_bloc_memory_w, range); } void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr) @@ -427,6 +421,8 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr) fprintf(stderr, "**********************************\n"); #endif vm_mngr->exception_flags |= EXCEPT_CODE_AUTOMOD; + printf("self modifying code %"PRIX64" %"PRIX64"\n", + addr, my_size); code_bloc_add_write(vm_mngr, addr, my_size/8); break; } @@ -436,16 +432,14 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr) 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; + Py_DECREF(vm_mngr->code_bloc_memory_w); + vm_mngr->code_bloc_memory_w = PyList_New(0); + } -int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop) +PyObject* get_code_bloc_write(vm_mngr_t* vm_mngr) { - *start = vm_mngr->code_bloc_memory_w_start; - *stop = vm_mngr->code_bloc_memory_w_stop; - return vm_mngr->code_bloc_valid; + return vm_mngr->code_bloc_memory_w; } PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr) @@ -1423,9 +1417,7 @@ void init_code_bloc_pool(vm_mngr_t* vm_mngr) 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; + vm_mngr->code_bloc_memory_w = PyList_New(0); } diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index eb13855f..67f0bac2 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -93,9 +93,7 @@ typedef struct { - uint64_t code_bloc_valid; - uint64_t code_bloc_memory_w_start; - uint64_t code_bloc_memory_w_stop; + PyObject* code_bloc_memory_w; }vm_mngr_t; @@ -292,7 +290,7 @@ void add_memory_page(vm_mngr_t* vm_mngr, struct memory_page_node* mpn); void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr); void code_bloc_add_write(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size); void reset_code_bloc_write(vm_mngr_t* vm_mngr); -int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop); +PyObject* get_code_bloc_write(vm_mngr_t* vm_mngr); char* dump(vm_mngr_t* vm_mngr); diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index af41709e..9e370465 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -469,24 +469,10 @@ PyObject* vm_reset_code_bloc_write(VmMngr* self, PyObject* args) PyObject* vm_get_code_bloc_write(VmMngr* self, PyObject* args) { - uint64_t start, stop; - PyObject* range; PyObject* result; - uint32_t valid; - valid = get_code_bloc_write(&self->vm_mngr, &start, &stop); - if (!valid) { - result = PyList_New(0); - return result; - } - - range = PyTuple_New(2); - PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)start)); - PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)stop)); - - - result = PyList_New(1); - PyList_SET_ITEM(result, 0, range); + result = get_code_bloc_write(&self->vm_mngr); + Py_INCREF(result); return result; } |