diff options
| author | serpilliere <devnull@localhost> | 2012-03-01 10:49:59 +0100 |
|---|---|---|
| committer | serpilliere <devnull@localhost> | 2012-03-01 10:49:59 +0100 |
| commit | 8303a3da321bdc39460b2a974fab80f5ddab4df0 (patch) | |
| tree | 91429e02f31ed5d94b3fe959768c26496b6c96d7 | |
| parent | 4456f0eb29d80e03a86d46098813178963f51d45 (diff) | |
| download | miasm-8303a3da321bdc39460b2a974fab80f5ddab4df0.tar.gz miasm-8303a3da321bdc39460b2a974fab80f5ddab4df0.zip | |
libcodenat: add is_mem_mapped; get_mem_base_addr
| -rw-r--r-- | miasm/tools/emul_lib/libcodenat.c | 23 | ||||
| -rw-r--r-- | miasm/tools/emul_lib/libcodenat.h | 2 | ||||
| -rw-r--r-- | miasm/tools/emul_lib/libcodenat_interface.c | 73 |
3 files changed, 98 insertions, 0 deletions
diff --git a/miasm/tools/emul_lib/libcodenat.c b/miasm/tools/emul_lib/libcodenat.c index 7e201b63..cc675fee 100644 --- a/miasm/tools/emul_lib/libcodenat.c +++ b/miasm/tools/emul_lib/libcodenat.c @@ -67,9 +67,32 @@ struct memory_page_node *memory_page_pool_tab[MAX_MEMORY_PAGE_POOL_TAB]; +int is_mem_mapped(uint64_t ad) +{ + struct memory_page_node * mpn; + mpn = memory_page_pool_tab[ad>>MEMORY_PAGE_POOL_MASK_BIT]; + if ( mpn && (mpn->ad <= ad) && (ad < mpn->ad + mpn->size)) + return 1; + return 0; +} +/* return the address base of the memory page + containing addr +*/ +uint64_t get_mem_base_addr(uint64_t ad, uint64_t *addr_base) +{ + struct memory_page_node * mpn; + + mpn = memory_page_pool_tab[ad>>MEMORY_PAGE_POOL_MASK_BIT]; + if ( mpn && (mpn->ad <= ad) && (ad < mpn->ad + mpn->size)){ + *addr_base = mpn->ad; + return 1; + } + return 0; +} + void dump_gpregs(void) { diff --git a/miasm/tools/emul_lib/libcodenat.h b/miasm/tools/emul_lib/libcodenat.h index 3c4c16e1..0f3f99af 100644 --- a/miasm/tools/emul_lib/libcodenat.h +++ b/miasm/tools/emul_lib/libcodenat.h @@ -275,6 +275,8 @@ struct code_bloc_node { #define EXCEPT_ILLEGAL_INSN (1<<8) void dump_gpregs(void); +int is_mem_mapped(uint64_t ad); +uint64_t get_mem_base_addr(uint64_t addr, uint64_t *addr_base); void MEM_WRITE(unsigned int my_size, uint64_t addr, unsigned int src); unsigned int MEM_LOOKUP(unsigned int my_size, uint64_t addr); diff --git a/miasm/tools/emul_lib/libcodenat_interface.c b/miasm/tools/emul_lib/libcodenat_interface.c index 7348ff00..565bf8c9 100644 --- a/miasm/tools/emul_lib/libcodenat_interface.c +++ b/miasm/tools/emul_lib/libcodenat_interface.c @@ -79,6 +79,74 @@ PyObject* _vm_get_all_memory(void) } + +PyObject* _vm_is_mem_mapped(PyObject* item) +{ + unsigned int page_addr; + unsigned int ret; + if (PyInt_Check(item)){ + page_addr = (unsigned int)PyInt_AsLong(item); + } + else if (PyLong_Check(item)){ + page_addr = (unsigned int)PyInt_AsUnsignedLongLongMask(item); + } + else{ + RAISE(PyExc_TypeError,"arg1 must be int"); + } + + ret = is_mem_mapped(page_addr); + return PyInt_FromLong((long)ret); + +} + +PyObject* vm_is_mem_mapped(PyObject* self, PyObject* args) +{ + PyObject *addr; + PyObject *p; + + if (!PyArg_ParseTuple(args, "O", &addr)) + return NULL; + p = _vm_is_mem_mapped(addr); + return p; +} + + +PyObject* _vm_get_mem_base_addr(PyObject* item) +{ + unsigned int page_addr; + uint64_t addr_base; + unsigned int ret; + if (PyInt_Check(item)){ + page_addr = (unsigned int)PyInt_AsLong(item); + } + else if (PyLong_Check(item)){ + page_addr = (unsigned int)PyInt_AsUnsignedLongLongMask(item); + } + else{ + RAISE(PyExc_TypeError,"arg1 must be int"); + } + + ret = get_mem_base_addr(page_addr, &addr_base); + if (ret == 0){ + Py_INCREF(Py_None); + return Py_None; + } + return PyInt_FromLong((long)addr_base); +} + + +PyObject* vm_get_mem_base_addr(PyObject* self, PyObject* args) +{ + PyObject *addr; + PyObject *p; + + if (!PyArg_ParseTuple(args, "O", &addr)) + return NULL; + p = _vm_get_mem_base_addr(addr); + return p; +} + + PyObject* _vm_get_gpreg(void) { PyObject *dict = PyDict_New(); @@ -1357,6 +1425,11 @@ static PyMethodDef CodenatMethods[] = { {"vm_set_segm_base",vm_set_segm_base, METH_VARARGS, "X"}, + {"vm_is_mem_mapped",vm_is_mem_mapped, METH_VARARGS, + "X"}, + {"vm_get_mem_base_addr",vm_get_mem_base_addr, METH_VARARGS, + "X"}, + {NULL, NULL, 0, NULL} /* Sentinel */ }; |