about summary refs log tree commit diff stats
path: root/miasm2/jitter/vm_mngr.c
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/jitter/vm_mngr.c')
-rw-r--r--miasm2/jitter/vm_mngr.c81
1 files changed, 79 insertions, 2 deletions
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)