diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-02-22 11:19:24 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-04-09 21:40:14 +0200 |
| commit | 4819028066577e8741d6979089bc45103cc4cdd4 (patch) | |
| tree | 8fd24a2c98a5062ff02cbb3aeec440162f6c80c3 | |
| parent | da3dac94a7169ea209ba0af0a8319d424b998fd5 (diff) | |
| download | miasm-4819028066577e8741d6979089bc45103cc4cdd4.tar.gz miasm-4819028066577e8741d6979089bc45103cc4cdd4.zip | |
VmMngr: add is_mapped api
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 41 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 3 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 22 |
3 files changed, 55 insertions, 11 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index f96182bf..1bb58a17 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -106,7 +106,7 @@ int find_page_node(struct memory_page_node * array, uint64_t key, int imin, int return -1; } -struct memory_page_node * get_memory_page_from_address(vm_mngr_t* vm_mngr, uint64_t ad) +struct memory_page_node * get_memory_page_from_address(vm_mngr_t* vm_mngr, uint64_t ad, int raise_exception) { struct memory_page_node * mpn; int i; @@ -120,8 +120,10 @@ struct memory_page_node * get_memory_page_from_address(vm_mngr_t* vm_mngr, uint6 if ((mpn->ad <= ad) && (ad < mpn->ad + mpn->size)) return mpn; } - fprintf(stderr, "WARNING: address 0x%"PRIX64" is not mapped in virtual memory:\n", ad); - vm_mngr->exception_flags |= EXCEPT_ACCESS_VIOL; + if (raise_exception) { + fprintf(stderr, "WARNING: address 0x%"PRIX64" is not mapped in virtual memory:\n", ad); + vm_mngr->exception_flags |= EXCEPT_ACCESS_VIOL; + } return NULL; } @@ -136,7 +138,7 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6 struct memory_breakpoint_info * b; - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return 0; @@ -185,7 +187,7 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6 unsigned int new_size = my_size; int index = 0; while (new_size){ - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return 0; addr = &((unsigned char*)mpn->ad_hp)[ad - mpn->ad]; @@ -222,7 +224,7 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size, unsigned char * addr; struct memory_breakpoint_info * b; - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return; @@ -286,7 +288,7 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size, break; } while (my_size){ - mpn = get_memory_page_from_address(vm_mngr, ad); + mpn = get_memory_page_from_address(vm_mngr, ad, 1); if (!mpn) return; @@ -462,7 +464,7 @@ int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t s /* read is multiple page wide */ while (size){ - mpn = get_memory_page_from_address(vm_mngr, addr); + mpn = get_memory_page_from_address(vm_mngr, addr, 1); if (!mpn){ free(*buffer_ptr); PyErr_SetString(PyExc_RuntimeError, "Error: cannot find address"); @@ -488,7 +490,7 @@ int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size) /* write is multiple page wide */ while (size){ - mpn = get_memory_page_from_address(vm_mngr, addr); + mpn = get_memory_page_from_address(vm_mngr, addr, 1); if (!mpn){ PyErr_SetString(PyExc_RuntimeError, "Error: cannot find address"); return -1; @@ -506,6 +508,27 @@ int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size) +int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size) +{ + uint64_t len; + struct memory_page_node * mpn; + + /* test multiple page wide */ + while (size){ + mpn = get_memory_page_from_address(vm_mngr, addr, 0); + if (!mpn) + return 0; + + len = MIN(size, mpn->size - (addr - mpn->ad)); + addr += len; + size -= len; + } + + return 1; +} + + + unsigned int parity(unsigned int a) { #if defined(__builtin_parity) diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index acea4875..52d62551 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -178,6 +178,7 @@ int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size) unsigned int parity(unsigned int a); unsigned int my_imul08(unsigned int a, unsigned int b); +int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size); void vm_throw(vm_mngr_t* vm_mngr, unsigned long flags); int shift_right_arith(unsigned int size, int a, unsigned int b); @@ -312,7 +313,7 @@ void func_alloc(void); unsigned int get_memory_page_max_address_py(void); unsigned int get_memory_page_max_user_address_py(void); unsigned int get_memory_page_from_min_ad_py(unsigned int size); -struct memory_page_node * get_memory_page_from_address(vm_mngr_t*, uint64_t ad); +struct memory_page_node * get_memory_page_from_address(vm_mngr_t*, uint64_t ad, int raise_exception); void func_malloc_memory_page(void); void func_free_memory_page(void); void func_virtualalloc_memory_page(void); diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index fdadf7f1..215517ee 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -150,7 +150,7 @@ PyObject* vm_set_mem_access(VmMngr* self, PyObject* args) PyGetInt(addr, page_addr); PyGetInt(access, page_access); - mpn = get_memory_page_from_address(&self->vm_mngr, page_addr); + mpn = get_memory_page_from_address(&self->vm_mngr, page_addr, 1); if (!mpn){ PyErr_SetString(PyExc_RuntimeError, "cannot find address"); return 0; @@ -443,6 +443,24 @@ PyObject* vm_set_addr2obj(VmMngr* self, PyObject* args) } +PyObject* vm_is_mapped(VmMngr* self, PyObject* args) +{ + PyObject *ad; + PyObject *size; + uint64_t b_ad; + uint64_t b_size; + int ret; + + if (!PyArg_ParseTuple(args, "OO", &ad, &size)) + return NULL; + + PyGetInt(ad, b_ad); + PyGetInt(size, b_size); + ret = is_mapped(&self->vm_mngr, b_ad, b_size); + return PyLong_FromUnsignedLongLong((uint64_t)ret); +} + + static PyObject * vm_set_big_endian(VmMngr *self, PyObject *value, void *closure) { @@ -509,6 +527,8 @@ static PyMethodDef VmMngr_methods[] = { "X"}, {"set_addr2obj", (PyCFunction)vm_set_addr2obj, METH_VARARGS, "X"}, + {"is_mapped", (PyCFunction)vm_is_mapped, METH_VARARGS, + "X"}, {"add_code_bloc",(PyCFunction)vm_add_code_bloc, METH_VARARGS, "X"}, {"get_mem", (PyCFunction)vm_get_mem, METH_VARARGS, |