diff options
Diffstat (limited to 'miasm2/jitter/arch/JitCore_x86.c')
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index 5c7b9c02..c77d45f2 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -5,6 +5,7 @@ #include <inttypes.h> #include "../queue.h" #include "../vm_mngr.h" +#include "../vm_mngr_py.h" #include "JitCore_x86.h" #define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} @@ -357,6 +358,153 @@ JitCpu_set_cpu(JitCpu *self, PyObject *value, void *closure) return -1; } + + +static PyObject * +JitCpu_get_vmmngr(JitCpu *self, void *closure) +{ + return self->vmcpu.pyvm; +} + +static PyObject * +JitCpu_set_vmmngr(JitCpu *self, PyObject *value, void *closure) +{ + self->vmcpu.pyvm = value; + return 0; +} + +static PyObject * +JitCpu_get_jitter(JitCpu *self, void *closure) +{ + return self->vmcpu.jitter; +} + +static PyObject * +JitCpu_set_jitter(JitCpu *self, PyObject *value, void *closure) +{ + self->vmcpu.jitter = value; + return 0; +} + +uint8_t MEM_LOOKUP_08(vm_cpu_t* vmcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); +} + +uint16_t MEM_LOOKUP_16(vm_cpu_t* vmcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); +} + +uint32_t MEM_LOOKUP_32(vm_cpu_t* vmcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); +} + +uint64_t MEM_LOOKUP_64(vm_cpu_t* vmcpu, uint64_t addr) +{ + return vm_MEM_LOOKUP_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr); +} + + + +void check_automod(vm_cpu_t* vmcpu, uint64_t addr, int size) +{ + PyObject *result; + + if (!((((VmMngr*)vmcpu->pyvm)->vm_mngr).exception_flags & EXCEPT_CODE_AUTOMOD)) + return; + result = PyObject_CallMethod((PyObject *)vmcpu->jitter, "automod_cb", "LL", addr, size); + Py_DECREF(result); + +} + +void MEM_WRITE_08(vm_cpu_t* vmcpu, uint64_t addr, uint8_t src) +{ + vm_MEM_WRITE_08(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); + check_automod(vmcpu, addr, 8); +} + +void MEM_WRITE_16(vm_cpu_t* vmcpu, uint64_t addr, uint16_t src) +{ + vm_MEM_WRITE_16(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); + check_automod(vmcpu, addr, 16); +} + +void MEM_WRITE_32(vm_cpu_t* vmcpu, uint64_t addr, uint32_t src) +{ + vm_MEM_WRITE_32(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); + check_automod(vmcpu, addr, 32); +} + +void MEM_WRITE_64(vm_cpu_t* vmcpu, uint64_t addr, uint64_t src) +{ + vm_MEM_WRITE_64(&(((VmMngr*)vmcpu->pyvm)->vm_mngr), addr, src); + check_automod(vmcpu, addr, 64); +} + + + +PyObject* vm_set_mem(JitCpu *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; + + PyGetInt(py_addr, addr); + + if(!PyString_Check(py_buffer)) + RAISE(PyExc_TypeError,"arg must be str"); + + size = PyString_Size(py_buffer); + PyString_AsStringAndSize(py_buffer, &buffer, &py_length); + + ret = vm_write_mem(&(((VmMngr*)self->vmcpu.pyvm)->vm_mngr), addr, buffer, size); + if (ret < 0) + RAISE(PyExc_TypeError,"arg must be str"); + check_automod(&self->vmcpu, addr, size*8); + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* vm_get_mem(JitCpu *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(&(((VmMngr*)self->vmcpu.pyvm)->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; +} + static PyMemberDef JitCpu_members[] = { {NULL} /* Sentinel */ }; @@ -378,6 +526,10 @@ static PyMethodDef JitCpu_methods[] = { "X"}, {"set_exception", (PyCFunction)cpu_set_exception, METH_VARARGS, "X"}, + {"set_mem", (PyCFunction)vm_set_mem, METH_VARARGS, + "X"}, + {"get_mem", (PyCFunction)vm_get_mem, METH_VARARGS, + "X"}, {NULL} /* Sentinel */ }; @@ -701,6 +853,16 @@ static PyGetSetDef JitCpu_getseters[] = { (getter)JitCpu_get_cpu, (setter)JitCpu_set_cpu, "first name", NULL}, + {"vmmngr", + (getter)JitCpu_get_vmmngr, (setter)JitCpu_set_vmmngr, + "vmmngr", + NULL}, + + {"jitter", + (getter)JitCpu_get_jitter, (setter)JitCpu_set_jitter, + "jitter", + NULL}, + {"RAX", (getter)JitCpu_get_RAX, (setter)JitCpu_set_RAX, "RAX", NULL}, {"RBX", (getter)JitCpu_get_RBX, (setter)JitCpu_set_RBX, "RBX", NULL}, |