diff options
Diffstat (limited to 'miasm2/jitter/arch/JitCore_x86.c')
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 215 |
1 files changed, 121 insertions, 94 deletions
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index 5c7b9c02..a5bbb7bc 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -1,19 +1,13 @@ #include <Python.h> -#include "JitCore.h" +#include "../JitCore.h" #include "structmember.h" #include <stdint.h> #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;} -#define RAISE_ret0(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return 0;} - -typedef struct _reg_dict{ - char* name; - size_t offset; -} reg_dict; reg_dict gpreg_dict[] = { {.name = "RAX", .offset = offsetof(vm_cpu_t, RAX)}, @@ -57,19 +51,8 @@ reg_dict gpreg_dict[] = { {.name = "RAX", .offset = offsetof(vm_cpu_t, RAX)}, /************************** JitCpu object **************************/ -typedef struct { - PyObject_HEAD - PyObject *cpu; /* cpu */ - vm_cpu_t vmcpu; -} JitCpu; - -#define get_reg(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.reg); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); PyObject* cpu_get_gpreg(JitCpu* self) @@ -119,13 +102,17 @@ PyObject* cpu_get_gpreg(JitCpu* self) -PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) + +PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) { + PyObject* dict; PyObject *d_key, *d_value = NULL; Py_ssize_t pos = 0; uint64_t val; unsigned int i, found; + if (!PyArg_ParseTuple(args, "O", &dict)) + return NULL; if(!PyDict_Check(dict)) RAISE(PyExc_TypeError, "arg must be dict"); while(PyDict_Next(dict, &pos, &d_key, &d_value)){ @@ -138,7 +125,7 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) for (i=0; i < sizeof(gpreg_dict)/sizeof(reg_dict); i++){ if (strcmp(PyString_AsString(d_key), gpreg_dict[i].name)) continue; - *((uint64_t*)(((char*)&(self->vmcpu)) + gpreg_dict[i].offset)) = val; + *((uint64_t*)(((char*)(self->cpu)) + gpreg_dict[i].offset)) = val; found = 1; break; } @@ -148,27 +135,17 @@ PyObject* _vm_set_gpreg(JitCpu* self, PyObject *dict) fprintf(stderr, "unkown key: %s\n", PyString_AsString(d_key)); RAISE(PyExc_ValueError, "unkown reg"); } - return NULL; -} - -PyObject* cpu_set_gpreg(JitCpu* self, PyObject *args) -{ - PyObject* dict; - if (!PyArg_ParseTuple(args, "O", &dict)) - return NULL; - _vm_set_gpreg(self, dict); - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } - PyObject * cpu_init_regs(JitCpu* self) { - memset(&self->vmcpu, 0, sizeof(vm_cpu_t)); + memset(self->cpu, 0, sizeof(vm_cpu_t)); - self->vmcpu.tsc1 = 0x22222222; - self->vmcpu.tsc2 = 0x11111111; - self->vmcpu.i_f = 1; + ((vm_cpu_t*)self->cpu)->tsc1 = 0x22222222; + ((vm_cpu_t*)self->cpu)->tsc2 = 0x11111111; + ((vm_cpu_t*)self->cpu)->i_f = 1; Py_INCREF(Py_None); return Py_None; @@ -193,13 +170,37 @@ PyObject * cpu_dump_gpregs(JitCpu* self, PyObject* args) { vm_cpu_t* vmcpu; - vmcpu = &self->vmcpu; + vmcpu = self->cpu; dump_gpregs(vmcpu); Py_INCREF(Py_None); return Py_None; } +PyObject* cpu_set_exception(JitCpu* self, PyObject* args) +{ + PyObject *item1; + uint64_t i; + + if (!PyArg_ParseTuple(args, "O", &item1)) + return NULL; + + PyGetInt(item1, i); + + ((vm_cpu_t*)self->cpu)->exception_flags = i; + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* cpu_get_exception(JitCpu* self, PyObject* args) +{ + return PyLong_FromUnsignedLongLong((uint64_t)(((vm_cpu_t*)self->cpu)->exception_flags)); +} + + + + + PyObject* cpu_set_segm_base(JitCpu* self, PyObject* args) { PyObject *item1, *item2; @@ -210,7 +211,7 @@ PyObject* cpu_set_segm_base(JitCpu* self, PyObject* args) PyGetInt(item1, segm_num); PyGetInt(item2, segm_base); - self->vmcpu.segm_base[segm_num] = segm_base; + ((vm_cpu_t*)self->cpu)->segm_base[segm_num] = segm_base; Py_INCREF(Py_None); return Py_None; @@ -225,38 +226,16 @@ PyObject* cpu_get_segm_base(JitCpu* self, PyObject* args) if (!PyArg_ParseTuple(args, "O", &item1)) return NULL; PyGetInt(item1, segm_num); - v = PyInt_FromLong((long)self->vmcpu.segm_base[segm_num]); + v = PyInt_FromLong((long)(((vm_cpu_t*)self->cpu)->segm_base[segm_num])); return v; } -uint64_t segm2addr(vm_cpu_t* vmcpu, uint64_t segm, uint64_t addr) +uint64_t segm2addr(JitCpu* jitcpu, uint64_t segm, uint64_t addr) { - return addr + vmcpu->segm_base[segm]; + return addr + ((vm_cpu_t*)jitcpu->cpu)->segm_base[segm]; } -PyObject* cpu_set_exception(JitCpu* self, PyObject* args) -{ - PyObject *item1; - uint64_t i; - - if (!PyArg_ParseTuple(args, "O", &item1)) - return NULL; - - PyGetInt(item1, i); - - self->vmcpu.exception_flags = i; - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* cpu_get_exception(JitCpu* self, PyObject* args) -{ - return PyLong_FromUnsignedLongLong((uint64_t)self->vmcpu.exception_flags); -} - - - #define UDIV(sizeA) \ uint ## sizeA ## _t udiv ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \ { \ @@ -328,33 +307,72 @@ IMOD(64) -static void -JitCpu_dealloc(JitCpu* self) +void check_automod(JitCpu* jitcpu, uint64_t addr, int size) { - self->ob_type->tp_free((PyObject*)self); + PyObject *result; + + if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD)) + return; + result = PyObject_CallMethod(jitcpu->jitter, "automod_cb", "LL", addr, size); + Py_DECREF(result); + } +void MEM_WRITE_08(JitCpu* jitcpu, uint64_t addr, uint8_t src) +{ + vm_MEM_WRITE_08(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 8); +} -static PyObject * -JitCpu_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +void MEM_WRITE_16(JitCpu* jitcpu, uint64_t addr, uint16_t src) { - JitCpu *self; + vm_MEM_WRITE_16(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 16); +} - self = (JitCpu *)type->tp_alloc(type, 0); - return (PyObject *)self; +void MEM_WRITE_32(JitCpu* jitcpu, uint64_t addr, uint32_t src) +{ + vm_MEM_WRITE_32(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 32); } -static PyObject * -JitCpu_get_cpu(JitCpu *self, void *closure) +void MEM_WRITE_64(JitCpu* jitcpu, uint64_t addr, uint64_t src) { - return PyLong_FromUnsignedLongLong((uint64_t)&(self->vmcpu)); + vm_MEM_WRITE_64(&((VmMngr*)jitcpu->pyvm)->vm_mngr, addr, src); + check_automod(jitcpu, addr, 64); } -static int -JitCpu_set_cpu(JitCpu *self, PyObject *value, void *closure) + + +PyObject* vm_set_mem(JitCpu *self, PyObject* args) { - PyErr_SetString(PyExc_TypeError, "immutable cpu"); - return -1; + 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->pyvm)->vm_mngr), addr, buffer, size); + if (ret < 0) + RAISE(PyExc_TypeError,"arg must be str"); + check_automod(self, addr, size*8); + + Py_INCREF(Py_None); + return Py_None; } static PyMemberDef JitCpu_members[] = { @@ -378,12 +396,21 @@ 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 */ }; static int JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) { + self->cpu = malloc(sizeof(vm_cpu_t)); + if (self->cpu == NULL) { + fprintf(stderr, "cannot alloc vm_cpu_t\n"); + exit(0); + } return 0; } @@ -391,15 +418,15 @@ JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) #define getset_reg_E_u32(regname) \ static PyObject *JitCpu_get_E ## regname (JitCpu *self, void *closure) \ { \ - return PyLong_FromUnsignedLongLong((uint32_t)(self->vmcpu.R ## regname & 0xFFFFFFFF )); \ + return PyLong_FromUnsignedLongLong((uint32_t)(((vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFFFFFF )); \ } \ static int JitCpu_set_E ## regname (JitCpu *self, PyObject *value, void *closure) \ { \ uint64_t val; \ PyGetInt_ret0(value, val); \ val &= 0xFFFFFFFF; \ - val |= self->vmcpu.R ##regname & 0xFFFFFFFF00000000ULL; \ - self->vmcpu.R ## regname = val; \ + val |= ((vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFF00000000ULL; \ + ((vm_cpu_t*)(self->cpu))->R ## regname = val; \ return 0; \ } @@ -408,15 +435,15 @@ JitCpu_init(JitCpu *self, PyObject *args, PyObject *kwds) #define getset_reg_R_u16(regname) \ static PyObject *JitCpu_get_ ## regname (JitCpu *self, void *closure) \ { \ - return PyLong_FromUnsignedLongLong((uint16_t)(self->vmcpu.R ## regname & 0xFFFF )); \ + return PyLong_FromUnsignedLongLong((uint16_t)(((vm_cpu_t*)(self->cpu))->R ## regname & 0xFFFF )); \ } \ static int JitCpu_set_ ## regname (JitCpu *self, PyObject *value, void *closure) \ { \ uint64_t val; \ PyGetInt_ret0(value, val); \ val &= 0xFFFF; \ - val |= self->vmcpu.R ##regname & 0xFFFFFFFFFFFF0000ULL; \ - self->vmcpu.R ## regname = val; \ + val |= ((vm_cpu_t*)(self->cpu))->R ##regname & 0xFFFFFFFFFFFF0000ULL; \ + ((vm_cpu_t*)(self->cpu))->R ## regname = val; \ return 0; \ } @@ -479,12 +506,6 @@ getset_reg_R_u16(BP); getset_reg_R_u16(IP); -#define get_reg_off(reg) do { \ - o = PyLong_FromUnsignedLongLong((uint64_t)offsetof(vm_cpu_t, reg)); \ - PyDict_SetItemString(dict, #reg, o); \ - Py_DECREF(o); \ - } while(0); - PyObject* get_gpreg_offset_all(void) { @@ -697,11 +718,17 @@ PyObject* get_gpreg_offset_all(void) static PyGetSetDef JitCpu_getseters[] = { - {"cpu", - (getter)JitCpu_get_cpu, (setter)JitCpu_set_cpu, - "first name", + {"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}, {"RCX", (getter)JitCpu_get_RCX, (setter)JitCpu_set_RCX, "RCX", NULL}, |