about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <devnull@localhost>2012-03-01 10:49:59 +0100
committerserpilliere <devnull@localhost>2012-03-01 10:49:59 +0100
commit8303a3da321bdc39460b2a974fab80f5ddab4df0 (patch)
tree91429e02f31ed5d94b3fe959768c26496b6c96d7
parent4456f0eb29d80e03a86d46098813178963f51d45 (diff)
downloadmiasm-8303a3da321bdc39460b2a974fab80f5ddab4df0.tar.gz
miasm-8303a3da321bdc39460b2a974fab80f5ddab4df0.zip
libcodenat: add is_mem_mapped; get_mem_base_addr
-rw-r--r--miasm/tools/emul_lib/libcodenat.c23
-rw-r--r--miasm/tools/emul_lib/libcodenat.h2
-rw-r--r--miasm/tools/emul_lib/libcodenat_interface.c73
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 */
 
 };