diff options
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 4 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 3 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 19 |
3 files changed, 19 insertions, 7 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index 1ee1882b..c5e7137f 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -224,7 +224,7 @@ static uint64_t memory_page_read(vm_mngr_t* vm_mngr, unsigned int my_size, uint6 } static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size, - uint64_t ad, uint64_t src) + uint64_t ad, uint64_t src) { struct memory_page_node * mpn; unsigned char * addr; @@ -369,7 +369,7 @@ void dump_code_bloc(vm_mngr_t* vm_mngr) } -void check_write_code_bloc(vm_mngr_t* vm_mngr, unsigned int my_size, uint64_t addr) +void check_write_code_bloc(vm_mngr_t* vm_mngr, uint64_t my_size, uint64_t addr) { struct code_bloc_node * cbp; vm_mngr->last_write_ad = addr; diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index f7fd8f22..2bde6a93 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -246,6 +246,9 @@ void remove_memory_breakpoint(vm_mngr_t* vm_mngr, uint64_t ad, unsigned int acce 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 dump_memory_page_pool(vm_mngr_t* vm_mngr); void dump_memory_breakpoint_pool(vm_mngr_t* vm_mngr); //PyObject* _vm_get_all_memory(void); diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index 19686930..eb5fa112 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -163,6 +163,8 @@ PyObject* vm_set_mem(VmMngr* self, PyObject* args) Py_ssize_t length; int ret = 0x1337; uint64_t val; + uint64_t l; + struct memory_page_node * mpn; if (!PyArg_ParseTuple(args, "OO", &addr, &item_str)) return NULL; @@ -175,14 +177,21 @@ PyObject* vm_set_mem(VmMngr* self, PyObject* args) buf_size = PyString_Size(item_str); PyString_AsStringAndSize(item_str, &buf_data, &length); + + check_write_code_bloc(&self->vm_mngr, buf_size*8, val); /* write is multiple page wide */ while (buf_size){ - MEM_WRITE_08(&self->vm_mngr, val, (char) *(buf_data)); - buf_data += 1; - val += 1; - buf_size -= 1; + mpn = get_memory_page_from_address(&self->vm_mngr, val); + if (!mpn){ + PyErr_SetString(PyExc_RuntimeError, "cannot find address"); + return 0; + } + l = MIN(buf_size, mpn->size - (val-mpn->ad)); + memcpy(mpn->ad_hp + (val-mpn->ad), buf_data, l); + buf_data += l; + val += l; + buf_size -= l; } - return PyLong_FromUnsignedLongLong((uint64_t)ret); } |