about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/vm_mngr.c41
-rw-r--r--miasm2/jitter/vm_mngr.h3
-rw-r--r--miasm2/jitter/vm_mngr_py.c22
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,