diff options
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 60 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 3 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr_py.c | 142 |
3 files changed, 116 insertions, 89 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index f74830fd..a9bdd8ca 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -537,6 +537,66 @@ uint64_t MEM_LOOKUP_64(vm_mngr_t* vm_mngr, uint64_t addr) return ret; } + +int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t size) +{ + char* buffer; + uint64_t len; + struct memory_page_node * mpn; + + buffer = malloc(size); + *buffer_ptr = buffer; + if (!buffer){ + fprintf(stderr, "cannot alloc read\n"); + exit(-1); + } + + /* read is multiple page wide */ + while (size){ + mpn = get_memory_page_from_address(vm_mngr, addr); + if (!mpn){ + free(*buffer_ptr); + PyErr_SetString(PyExc_RuntimeError, "cannot find address"); + return -1; + } + + len = MIN(size, mpn->size - (addr - mpn->ad)); + memcpy(buffer, (char*)(mpn->ad_hp + (addr - mpn->ad)), len); + buffer += len; + addr += len; + size -= len; + } + + return 0; +} + +int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size) +{ + uint64_t len; + struct memory_page_node * mpn; + + check_write_code_bloc(vm_mngr, size * 8, addr); + + /* write is multiple page wide */ + while (size){ + mpn = get_memory_page_from_address(vm_mngr, addr); + if (!mpn){ + PyErr_SetString(PyExc_RuntimeError, "cannot find address"); + return -1; + } + + len = MIN(size, mpn->size - (addr - mpn->ad)); + memcpy(mpn->ad_hp + (addr-mpn->ad), buffer, len); + buffer += len; + addr += len; + size -= len; + } + + return 0; +} + + + 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 e365bcee..9589f601 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -175,6 +175,9 @@ unsigned short MEM_LOOKUP_16_PASSTHROUGH(uint64_t addr); unsigned int MEM_LOOKUP_32_PASSTHROUGH(uint64_t addr); uint64_t MEM_LOOKUP_64_PASSTHROUGH(uint64_t addr); +int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t size); +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); diff --git a/miasm2/jitter/vm_mngr_py.c b/miasm2/jitter/vm_mngr_py.c index 952e620f..fdc4837d 100644 --- a/miasm2/jitter/vm_mngr_py.c +++ b/miasm2/jitter/vm_mngr_py.c @@ -172,49 +172,6 @@ PyObject* vm_add_memory_page(VmMngr* self, PyObject* args) - -PyObject* vm_set_mem(VmMngr* self, PyObject* args) -{ - PyObject *addr; - PyObject *item_str; - - uint64_t buf_size; - char* buf_data; - 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; - - PyGetInt(addr, val); - - if(!PyString_Check(item_str)) - RAISE(PyExc_TypeError,"arg must be str"); - - 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){ - 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); -} - PyObject* vm_set_mem_access(VmMngr* self, PyObject* args) { PyObject *addr; @@ -241,64 +198,71 @@ PyObject* vm_set_mem_access(VmMngr* self, PyObject* args) return PyLong_FromUnsignedLongLong((uint64_t)ret); } +PyObject* vm_set_mem(VmMngr* self, PyObject* args) +{ + PyObject *py_addr; + PyObject *py_buffer; + Py_ssize_t py_length; + char * buffer; + uint64_t size; + uint64_t addr; + int ret = 0x1337; + if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_buffer)) + return NULL; -PyObject* vm_get_mem(VmMngr* self, PyObject* args) -{ - PyObject *item; - PyObject *item_len; + PyGetInt(py_addr, addr); - uint64_t buf_addr; - uint64_t buf_len; - PyObject *obj_out; - struct memory_page_node * mpn; - char * buf_out; - char * addr_tmp; - char * addr_out; - uint64_t off; - uint64_t l; - uint64_t my_size; - - if (!PyArg_ParseTuple(args, "OO", &item, &item_len)) - return NULL; + if(!PyString_Check(py_buffer)) + RAISE(PyExc_TypeError,"arg must be str"); - PyGetInt(item, buf_addr); - PyGetInt(item_len, buf_len); + size = PyString_Size(py_buffer); + PyString_AsStringAndSize(py_buffer, &buffer, &py_length); - my_size = buf_len; - buf_out = malloc(buf_len); - if (!buf_out){ - fprintf(stderr, "cannot alloc read\n"); - exit(-1); - } + ret = vm_write_mem(&self->vm_mngr, addr, buffer, size); + if (ret < 0) + RAISE(PyExc_TypeError,"arg must be str"); - addr_out = buf_out; + check_write_code_bloc(&self->vm_mngr, size*8, addr); - /* read is multiple page wide */ - while (my_size){ - mpn = get_memory_page_from_address(&self->vm_mngr, buf_addr); - if (!mpn){ - free(buf_out); - PyErr_SetString(PyExc_RuntimeError, "cannot find address"); - return 0; - } + Py_INCREF(Py_None); + return Py_None; +} - off = buf_addr - mpn->ad; - addr_tmp = &((char*)mpn->ad_hp)[off]; - l = MIN(my_size, mpn->size - off); - memcpy(addr_out, addr_tmp, l); - my_size -= l; - addr_out +=l; - buf_addr +=l; - } - obj_out = PyString_FromStringAndSize(buf_out, buf_len); - free(buf_out); - return obj_out; + +PyObject* vm_get_mem(VmMngr* self, PyObject* args) +{ + PyObject *py_addr; + PyObject *py_len; + + uint64_t addr; + uint64_t size; + PyObject *obj_out; + char * buf_out; + int ret; + + if (!PyArg_ParseTuple(args, "OO", &py_addr, &py_len)) + return NULL; + + PyGetInt(py_addr, addr); + PyGetInt(py_len, size); + + ret = vm_read_mem(&self->vm_mngr, addr, &buf_out, size); + if (ret < 0) { + free(buf_out); + PyErr_SetString(PyExc_RuntimeError, "cannot find address"); + return NULL; + } + + obj_out = PyString_FromStringAndSize(buf_out, size); + free(buf_out); + return obj_out; } + PyObject* vm_add_memory_breakpoint(VmMngr* self, PyObject* args) { PyObject *ad; @@ -738,7 +702,7 @@ PyObject* add_jitbloc(VmMngr* self, PyObject* args) if (!PyArg_ParseTuple(args, "O", &addr2obj)) return NULL; - + Py_INCREF(Py_None); return Py_None; |