diff options
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 13 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore.py | 9 | ||||
| -rw-r--r-- | miasm2/jitter/jitload.py | 1 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 42 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 11 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 38 |
6 files changed, 93 insertions, 21 deletions
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index cd24522d..6a503d83 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -322,42 +322,31 @@ IMOD(16) IMOD(32) IMOD(64) - - - void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size) { - PyObject *result; - if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD)) return; - result = PyObject_CallMethod(jitcpu->jitter, "automod_cb", "LL", addr, size); - Py_DECREF(result); - + code_bloc_add_write(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, size/8); } void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src) { vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); - check_automod(jitcpu, addr, 8); } void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src) { vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); - check_automod(jitcpu, addr, 16); } void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src) { vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); - check_automod(jitcpu, addr, 32); } void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) { vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); - check_automod(jitcpu, addr, 64); } diff --git a/miasm2/jitter/jitcore.py b/miasm2/jitter/jitcore.py index 6048d62e..5c2584f0 100644 --- a/miasm2/jitter/jitcore.py +++ b/miasm2/jitter/jitcore.py @@ -264,11 +264,8 @@ class JitCore(object): """Remove code jitted in range self.addr_mod @vm: VmMngr instance """ - for addr_start, addr_stop in self.addr_mod: - self.del_bloc_in_range(addr_start, addr_stop + 1) + for addr_start, addr_stop in vm.get_code_bloc_write(): + self.del_bloc_in_range(addr_start, addr_stop) self.__updt_jitcode_mem_range(vm) self.addr_mod = interval() - - def automod_cb(self, addr=0, size=0): - self.addr_mod += interval([(addr, addr + size / 8 - 1)]) - return None + vm.reset_code_bloc_write() diff --git a/miasm2/jitter/jitload.py b/miasm2/jitter/jitload.py index 8943e2c7..c9be1597 100644 --- a/miasm2/jitter/jitload.py +++ b/miasm2/jitter/jitload.py @@ -245,6 +245,7 @@ class jitter: "Tell the JiT backend to update blocs modified" self.jit.updt_automod_code(jitter.vm) + self.vm.reset_code_bloc_write() self.vm.set_exception(0) return True 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) diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index fb0a3c92..eb13855f 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -90,6 +90,14 @@ typedef struct { uint64_t exception_flags; uint64_t exception_flags_new; PyObject *addr2obj; + + + + uint64_t code_bloc_valid; + uint64_t code_bloc_memory_w_start; + uint64_t code_bloc_memory_w_stop; + + }vm_mngr_t; @@ -282,6 +290,9 @@ void remove_memory_breakpoint(vm_mngr_t* vm_mngr, uint64_t ad, unsigned int acce 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); char* dump(vm_mngr_t* vm_mngr); diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index 215517ee..af41709e 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -460,6 +460,39 @@ PyObject* vm_is_mapped(VmMngr* self, PyObject* args) return PyLong_FromUnsignedLongLong((uint64_t)ret); } +PyObject* vm_reset_code_bloc_write(VmMngr* self, PyObject* args) +{ + reset_code_bloc_write(&self->vm_mngr); + Py_INCREF(Py_None); + return Py_None; +} + +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); + + return result; +} + + + static PyObject * vm_set_big_endian(VmMngr *self, PyObject *value, void *closure) @@ -529,6 +562,8 @@ static PyMethodDef VmMngr_methods[] = { "X"}, {"is_mapped", (PyCFunction)vm_is_mapped, METH_VARARGS, "X"}, + {"reset_code_bloc_write", (PyCFunction)vm_reset_code_bloc_write, METH_VARARGS, + "X"}, {"add_code_bloc",(PyCFunction)vm_add_code_bloc, METH_VARARGS, "X"}, {"get_mem", (PyCFunction)vm_get_mem, METH_VARARGS, @@ -551,13 +586,14 @@ static PyMethodDef VmMngr_methods[] = { "X"}, {"reset_code_bloc_pool", (PyCFunction)vm_reset_code_bloc_pool, METH_VARARGS, "X"}, + {"get_code_bloc_write", (PyCFunction)vm_get_code_bloc_write, METH_VARARGS, + "X"}, {"set_alarm", (PyCFunction)set_alarm, METH_VARARGS, "X"}, {"get_exception",(PyCFunction)vm_get_exception, METH_VARARGS, "X"}, {"get_exception",(PyCFunction)vm_get_exception, METH_VARARGS, "X"}, - {"set_big_endian",(PyCFunction)vm_set_big_endian, METH_VARARGS, "X"}, {"set_little_endian",(PyCFunction)vm_set_little_endian, METH_VARARGS, |