about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/vm_mngr.c40
-rw-r--r--miasm2/jitter/vm_mngr.h6
-rw-r--r--miasm2/jitter/vm_mngr_py.c18
3 files changed, 20 insertions, 44 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 67599c39..5cf6f162 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -395,20 +395,14 @@ 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)
 {
-	if (vm_mngr->code_bloc_valid == 0) {
-		vm_mngr->code_bloc_valid = 1;
-		vm_mngr->code_bloc_memory_w_start = addr;
-		vm_mngr->code_bloc_memory_w_stop = addr + size;
-	} else {
-		if (vm_mngr->code_bloc_memory_w_stop != addr) {
-			fprintf(stderr,
-				"Error: sparse write %"PRIx64" %"PRIx64"\n",
-				vm_mngr->code_bloc_memory_w_stop,
-				addr);
-			exit(-1);
-		}
-		vm_mngr->code_bloc_memory_w_stop = addr + size;
-	}
+	PyObject* range;
+
+
+	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)
@@ -427,6 +421,8 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 				fprintf(stderr, "**********************************\n");
 #endif
 				vm_mngr->exception_flags |= EXCEPT_CODE_AUTOMOD;
+				printf("self modifying code %"PRIX64" %"PRIX64"\n",
+				       addr, my_size);
 				code_bloc_add_write(vm_mngr, addr, my_size/8);
 				break;
 			}
@@ -436,16 +432,14 @@ void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr)
 
 void reset_code_bloc_write(vm_mngr_t* vm_mngr)
 {
-	vm_mngr->code_bloc_valid = 0;
-	vm_mngr->code_bloc_memory_w_start = 0;
-	vm_mngr->code_bloc_memory_w_stop = 0;
+	Py_DECREF(vm_mngr->code_bloc_memory_w);
+	vm_mngr->code_bloc_memory_w = PyList_New(0);
+
 }
 
-int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop)
+PyObject* get_code_bloc_write(vm_mngr_t* vm_mngr)
 {
-	*start = vm_mngr->code_bloc_memory_w_start;
-	*stop = vm_mngr->code_bloc_memory_w_stop;
-	return vm_mngr->code_bloc_valid;
+	return vm_mngr->code_bloc_memory_w;
 }
 
 PyObject* addr2BlocObj(vm_mngr_t* vm_mngr, uint64_t addr)
@@ -1423,9 +1417,7 @@ void init_code_bloc_pool(vm_mngr_t* vm_mngr)
 	vm_mngr->code_bloc_pool_ad_min = 0xffffffff;
 	vm_mngr->code_bloc_pool_ad_max = 0;
 
-	vm_mngr->code_bloc_valid = 0;
-	vm_mngr->code_bloc_memory_w_start = 0;
-	vm_mngr->code_bloc_memory_w_stop = 0;
+	vm_mngr->code_bloc_memory_w = PyList_New(0);
 
 
 }
diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h
index eb13855f..67f0bac2 100644
--- a/miasm2/jitter/vm_mngr.h
+++ b/miasm2/jitter/vm_mngr.h
@@ -93,9 +93,7 @@ typedef struct {
 
 
 
-	uint64_t code_bloc_valid;
-	uint64_t code_bloc_memory_w_start;
-	uint64_t code_bloc_memory_w_stop;
+	PyObject* code_bloc_memory_w;
 
 
 }vm_mngr_t;
@@ -292,7 +290,7 @@ void add_memory_page(vm_mngr_t* vm_mngr, struct memory_page_node* mpn);
 void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr);
 void code_bloc_add_write(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size);
 void reset_code_bloc_write(vm_mngr_t* vm_mngr);
-int get_code_bloc_write(vm_mngr_t* vm_mngr, uint64_t* start, uint64_t* stop);
+PyObject* get_code_bloc_write(vm_mngr_t* vm_mngr);
 
 
 char* dump(vm_mngr_t* vm_mngr);
diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c
index af41709e..9e370465 100644
--- a/miasm2/jitter/vm_mngr_py.c
+++ b/miasm2/jitter/vm_mngr_py.c
@@ -469,24 +469,10 @@ PyObject* vm_reset_code_bloc_write(VmMngr* self, PyObject* args)
 
 PyObject* vm_get_code_bloc_write(VmMngr* self, PyObject* args)
 {
-	uint64_t start, stop;
-	PyObject* range;
 	PyObject* result;
-	uint32_t valid;
 
-	valid = get_code_bloc_write(&self->vm_mngr, &start, &stop);
-	if (!valid) {
-		result = PyList_New(0);
-		return result;
-	}
-
-	range = PyTuple_New(2);
-	PyTuple_SetItem(range, 0, PyLong_FromUnsignedLongLong((uint64_t)start));
-	PyTuple_SetItem(range, 1, PyLong_FromUnsignedLongLong((uint64_t)stop));
-
-
-	result = PyList_New(1);
-	PyList_SET_ITEM(result, 0, range);
+	result = get_code_bloc_write(&self->vm_mngr);
+	Py_INCREF(result);
 
 	return result;
 }