diff options
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 13 | ||||
| -rw-r--r-- | miasm2/jitter/codegen.py | 3 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore.py | 12 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 81 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 9 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 24 |
6 files changed, 120 insertions, 22 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/codegen.py b/miasm2/jitter/codegen.py index 7bdbf890..068839e7 100644 --- a/miasm2/jitter/codegen.py +++ b/miasm2/jitter/codegen.py @@ -331,6 +331,9 @@ class CGen(object): if attrib.set_exception or attrib.op_set_exception: out += (self.CODE_CPU_EXCEPTION_POST_INSTR % (self.C_PC, dst)).split('\n') + if attrib.mem_read | attrib.mem_write: + out.append("reset_code_bloc_write(&((VmMngr*)jitcpu->pyvm)->vm_mngr);") + return out def gen_pre_code(self, attrib): diff --git a/miasm2/jitter/jitcore.py b/miasm2/jitter/jitcore.py index 6048d62e..e81acc4e 100644 --- a/miasm2/jitter/jitcore.py +++ b/miasm2/jitter/jitcore.py @@ -147,7 +147,8 @@ class JitCore(object): cur_bloc = self.mdis.dis_bloc(addr) except IOError: # vm_exception_flag is set - cur_bloc = asmbloc.asm_bloc(label) + label = self.ir_arch.symbol_pool.getby_offset_create(addr) + cur_bloc = asmbloc.asm_block_bad(label) # Logging if self.log_newbloc: @@ -264,11 +265,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/vm_mngr.c b/miasm2/jitter/vm_mngr.c index f9d19b9d..2b0ae1fd 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -393,10 +393,58 @@ 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) +{ + PyObject* range; + PyObject* element; + int list_size; + uint64_t addr_start, addr_stop; + + list_size = PyList_Size(vm_mngr->code_bloc_memory_w); + + if (list_size > 0) { + /* check match on upper bound */ + element = PyList_GetItem(vm_mngr->code_bloc_memory_w, list_size - 1); + + addr_start = (uint64_t)PyLong_AsUnsignedLongLong(PyTuple_GetItem(element, 0)); + addr_stop = (uint64_t)PyLong_AsUnsignedLongLong(PyTuple_GetItem(element, 1)); + + if (addr_stop == addr) { + range = PyTuple_New(2); + PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)addr_start)); + PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)addr+size)); + PyList_SetItem(vm_mngr->code_bloc_memory_w, list_size - 1, range); + return; + + } + + /* check match on lower bound */ + element = PyList_GetItem(vm_mngr->code_bloc_memory_w, 0); + addr_start = (uint64_t)PyLong_AsUnsignedLongLong(PyTuple_GetItem(element, 0)); + + if (addr_start == addr + size) { + range = PyTuple_New(2); + PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)addr)); + PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)addr_start)); + PyList_SetItem(vm_mngr->code_bloc_memory_w, 0, range); + return; + } + + } + 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) { struct code_bloc_node * cbp; + if (vm_mngr->exception_flags & EXCEPT_CODE_AUTOMOD) + return; + if (!(addr + my_size/8 <= vm_mngr->code_bloc_pool_ad_min || addr >=vm_mngr->code_bloc_pool_ad_max)){ LIST_FOREACH(cbp, &vm_mngr->code_bloc_pool, next){ @@ -404,18 +452,40 @@ 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; - break; } } } } +void reset_code_bloc_write(vm_mngr_t* vm_mngr) +{ + int i; + int list_size; + PyObject* element; + + list_size = PyList_Size(vm_mngr->code_bloc_memory_w); + + for (i=0;i<list_size; i++) { + element = PyList_GetItem(vm_mngr->code_bloc_memory_w, i); + Py_DECREF(element); + } + + Py_DECREF(vm_mngr->code_bloc_memory_w); + vm_mngr->code_bloc_memory_w = PyList_New(0); + +} + +PyObject* get_code_bloc_write(vm_mngr_t* vm_mngr) +{ + return vm_mngr->code_bloc_memory_w; +} + PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr) { PyObject* pyaddr; @@ -436,22 +506,26 @@ PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr) void vm_MEM_WRITE_08(vm_mngr_t* vm_mngr, uint64_t addr, unsigned char src) { check_write_code_bloc(vm_mngr, 8, addr); + code_bloc_add_write(vm_mngr, addr, 1); memory_page_write(vm_mngr, 8, addr, src); } void vm_MEM_WRITE_16(vm_mngr_t* vm_mngr, uint64_t addr, unsigned short src) { check_write_code_bloc(vm_mngr, 16, addr); + code_bloc_add_write(vm_mngr, addr, 2); memory_page_write(vm_mngr, 16, addr, src); } void vm_MEM_WRITE_32(vm_mngr_t* vm_mngr, uint64_t addr, unsigned int src) { check_write_code_bloc(vm_mngr, 32, addr); + code_bloc_add_write(vm_mngr, addr, 4); memory_page_write(vm_mngr, 32, addr, src); } void vm_MEM_WRITE_64(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t src) { check_write_code_bloc(vm_mngr, 64, addr); + code_bloc_add_write(vm_mngr, addr, 8); memory_page_write(vm_mngr, 64, addr, src); } @@ -1390,6 +1464,9 @@ 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_memory_w = PyList_New(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..67f0bac2 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -90,6 +90,12 @@ typedef struct { uint64_t exception_flags; uint64_t exception_flags_new; PyObject *addr2obj; + + + + PyObject* code_bloc_memory_w; + + }vm_mngr_t; @@ -282,6 +288,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); +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 215517ee..9e370465 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -460,6 +460,25 @@ 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) +{ + PyObject* result; + + result = get_code_bloc_write(&self->vm_mngr); + Py_INCREF(result); + + return result; +} + + + static PyObject * vm_set_big_endian(VmMngr *self, PyObject *value, void *closure) @@ -529,6 +548,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 +572,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, |