19 #include "structmember.h"
27 #define MIN(a,b) (((a)<(b))?(a):(b))
28 #define MAX(a,b) (((a)>(b))?(a):(b))
33 #define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;}
47 p = PyErr_Format( PyExc_RuntimeError,
"EXCEPT_CODE_AUTOMOD" );
49 p = PyErr_Format( PyExc_RuntimeError,
"EXCEPT_UNK_EIP" );
51 p = PyErr_Format( PyExc_RuntimeError,
"EXCEPT_UNK_MEM_AD" );
53 else p = PyErr_Format( PyExc_RuntimeError,
"EXCEPT_UNKNOWN" );
58 #define PyGetInt(item, value) \
59 if (PyInt_Check(item)){ \
60 value = (uint64_t)PyInt_AsLong(item); \
62 else if (PyLong_Check(item)){ \
63 value = (uint64_t)PyLong_AsUnsignedLongLong(item); \
66 RAISE(PyExc_TypeError,"arg must be int"); \
75 if (!PyArg_ParseTuple(item,
"O", &addr))
81 return PyInt_FromLong((
long)ret);
94 if (!PyArg_ParseTuple(item,
"O", &addr))
104 return PyLong_FromUnsignedLongLong((uint64_t)addr_base);
115 global_vmmngr =
self;
117 return PyLong_FromUnsignedLongLong((uint64_t)0);
130 uint64_t
ret = 0x1337beef;
132 uint64_t page_access;
136 if (!PyArg_ParseTuple(args,
"OOO", &addr, &access, &item_str))
142 if(!PyString_Check(item_str))
143 RAISE(PyExc_TypeError,
"arg must be str");
145 buf_size = PyString_Size(item_str);
146 PyString_AsStringAndSize(item_str, &buf_data, &length);
154 RAISE(PyExc_TypeError,
"cannot create page");
158 RAISE(PyExc_TypeError,
"known page in memory");
161 memcpy(mpn->
ad_hp, buf_data, buf_size);
164 return PyLong_FromUnsignedLongLong((uint64_t)ret);
175 uint64_t
ret = 0x1337beef;
177 uint64_t page_access;
180 if (!PyArg_ParseTuple(args,
"OO", &addr, &access))
188 PyErr_SetString(PyExc_RuntimeError,
"cannot find address");
192 mpn->
access = page_access;
193 return PyLong_FromUnsignedLongLong((uint64_t)ret);
200 Py_ssize_t py_length;
207 if (!PyArg_ParseTuple(args,
"OO", &py_addr, &py_buffer))
212 if(!PyString_Check(py_buffer))
213 RAISE(PyExc_TypeError,
"arg must be str");
215 size = PyString_Size(py_buffer);
216 PyString_AsStringAndSize(py_buffer, &buffer, &py_length);
220 RAISE(PyExc_TypeError,
"Error in set_mem");
242 if (!PyArg_ParseTuple(args,
"OO", &py_addr, &py_len))
248 ret =
vm_read_mem(&self->vm_mngr, addr, &buf_out, size);
250 PyErr_SetString(PyExc_RuntimeError,
"cannot find address");
254 obj_out = PyString_FromStringAndSize(buf_out, size);
270 if (!PyArg_ParseTuple(args,
"OOO", &ad, &size, &access))
290 if (!PyArg_ParseTuple(args,
"OO", &ad, &access))
307 if (!PyArg_ParseTuple(args,
"O", &item1))
312 self->vm_mngr.exception_flags = i;
319 return PyLong_FromUnsignedLongLong((uint64_t)self->vm_mngr.exception_flags);
362 ret_obj = PyString_FromString(buf_final);
385 LIST_FOREACH(mpn, &self->vm_mngr.memory_page_pool, next){
387 dict2 = PyDict_New();
389 o = PyString_FromStringAndSize(mpn->
ad_hp, mpn->
size);
390 PyDict_SetItemString(dict2,
"data", o);
393 o = PyInt_FromLong((
long)mpn->
size);
394 PyDict_SetItemString(dict2,
"size", o);
397 o = PyInt_FromLong((
long)mpn->
access);
398 PyDict_SetItemString(dict2,
"access", o);
401 o = PyInt_FromLong((
long)mpn->
ad);
402 PyDict_SetItem(dict, o, dict2);
431 uint64_t
ret = 0x1337beef;
432 uint64_t ad_start, ad_stop, ad_code = 0;
436 if (!PyArg_ParseTuple(args,
"OO", &item1, &item2))
447 return PyLong_FromUnsignedLongLong((uint64_t)ret);
463 if (!PyArg_ParseTuple(args,
"O", &addr2obj))
466 if (self->vm_mngr.addr2obj != NULL){
467 Py_DECREF(self->vm_mngr.addr2obj);
471 self->vm_mngr.addr2obj = addr2obj;
480 self->vm_mngr.sex = __BIG_ENDIAN;
488 self->vm_mngr.sex = __LITTLE_ENDIAN;
518 self->ob_type->tp_free((PyObject*)
self);
527 self = (
VmMngr *)type->tp_alloc(type, 0);
528 return (PyObject *)
self;
534 return PyLong_FromUnsignedLongLong((uint64_t)&(self->vm_mngr));
540 PyErr_SetString(PyExc_TypeError,
"immutable vmmngr");
557 {
"set_mem", (PyCFunction)
vm_set_mem, METH_VARARGS,
563 {
"get_mem", (PyCFunction)
vm_get_mem, METH_VARARGS,
583 {
"set_alarm", (PyCFunction)
set_alarm, METH_VARARGS,
601 memset(&(self->vm_mngr), 0,
sizeof(self->vm_mngr));
614 PyObject_HEAD_INIT(NULL)
634 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
657 {NULL, NULL, 0, NULL}
668 if (PyType_Ready(&VmMngrType) < 0)
671 m = Py_InitModule(
"VmMngr", VmMngr_Methods);
675 Vm_Mngr_Error = PyErr_NewException(
"VmMngr.error", NULL, NULL);
676 Py_INCREF(Vm_Mngr_Error);
677 PyModule_AddObject(m,
"error", Vm_Mngr_Error);
679 Py_INCREF(&VmMngrType);
680 PyModule_AddObject(m,
"Vm", (PyObject *)&VmMngrType);
static PyTypeObject VmMngrType
void reset_memory_breakpoint(vm_mngr_t *vm_mngr)
#define EXCEPT_CODE_AUTOMOD
PyObject * vm_get_all_memory(VmMngr *self, PyObject *args)
static void sig_alarm(int signo)
static PyMethodDef VmMngr_methods[]
#define LIST_FOREACH(var, head, field)
PyObject * vm_reset_memory_page_pool(VmMngr *self, PyObject *args)
PyObject * vm_get_exception(VmMngr *self, PyObject *args)
static PyObject * Vm_Mngr_Error
void init_memory_page_pool(vm_mngr_t *vm_mngr)
void add_memory_breakpoint(vm_mngr_t *vm_mngr, uint64_t ad, uint64_t size, unsigned int access)
#define RAISE(errtype, msg)
#define EXCEPT_UNK_MEM_AD
void reset_code_bloc_pool(vm_mngr_t *vm_mngr)
PyObject * vm_add_code_bloc(VmMngr *self, PyObject *args)
void add_memory_page(vm_mngr_t *vm_mngr, struct memory_page_node *mpn_a)
PyObject * vm_set_exception(VmMngr *self, PyObject *args)
static PyObject * vm_set_little_endian(VmMngr *self, PyObject *value, void *closure)
static PyObject * VmMngr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject * vm_init_memory_breakpoint(VmMngr *self, PyObject *args)
void reset_memory_page_pool(vm_mngr_t *vm_mngr)
static PyMethodDef VmMngr_Methods[]
PyObject * vm_set_addr2obj(VmMngr *self, PyObject *args)
int vm_write_mem(vm_mngr_t *vm_mngr, uint64_t addr, char *buffer, uint64_t size)
PyObject * vm_init_code_bloc_pool(VmMngr *self, PyObject *args)
PyObject * vm_get_mem(VmMngr *self, PyObject *args)
PyObject * vm_dump_code_bloc_pool(VmMngr *self)
PyObject * vm_get_mem_base_addr(VmMngr *self, PyObject *item)
PyMODINIT_FUNC initVmMngr(void)
int is_mem_mapped(vm_mngr_t *vm_mngr, uint64_t ad)
PyObject * vm_is_mem_mapped(VmMngr *self, PyObject *item)
#define PyGetInt(item, value)
static PyMemberDef VmMngr_members[]
void check_write_code_bloc(vm_mngr_t *vm_mngr, uint64_t my_size, uint64_t addr)
struct memory_page_list_head memory_page_pool
PyObject * _vm_get_exception(unsigned int xcpt)
static PyGetSetDef VmMngr_getseters[]
static void VmMngr_dealloc(VmMngr *self)
static int VmMngr_set_vmmngr(VmMngr *self, PyObject *value, void *closure)
PyObject * vm_init_memory_page_pool(VmMngr *self, PyObject *args)
static PyObject * vm_set_big_endian(VmMngr *self, PyObject *value, void *closure)
PyObject * set_alarm(VmMngr *self)
void remove_memory_breakpoint(vm_mngr_t *vm_mngr, uint64_t ad, unsigned int access)
struct code_bloc_list_head code_bloc_pool
PyObject * vm_dump(PyObject *self)
void dump_memory_breakpoint_pool(vm_mngr_t *vm_mngr)
uint64_t get_mem_base_addr(vm_mngr_t *vm_mngr, uint64_t ad, uint64_t *addr_base)
PyObject * vm_dump_memory_breakpoint(VmMngr *self, PyObject *args)
struct memory_page_node * create_memory_page_node(uint64_t ad, unsigned int size, unsigned int access)
PyObject * vm_add_memory_breakpoint(VmMngr *self, PyObject *args)
int is_mpn_in_tab(vm_mngr_t *vm_mngr, struct memory_page_node *mpn_a)
static PyObject * VmMngr_get_vmmngr(VmMngr *self, void *closure)
void dump_code_bloc_pool(vm_mngr_t *vm_mngr)
PyObject * vm_set_mem_access(VmMngr *self, PyObject *args)
void init_code_bloc_pool(vm_mngr_t *vm_mngr)
static int VmMngr_init(VmMngr *self, PyObject *args, PyObject *kwds)
PyObject * vm_reset_code_bloc_pool(VmMngr *self, PyObject *args)
PyObject * vm_set_mem(VmMngr *self, PyObject *args)
PyObject * vm_add_memory_page(VmMngr *self, PyObject *args)
PyObject * vm_remove_memory_breakpoint(VmMngr *self, PyObject *args)
void add_code_bloc(vm_mngr_t *vm_mngr, struct code_bloc_node *cbp)
char * dump(vm_mngr_t *vm_mngr)
struct memory_page_node * get_memory_page_from_address(vm_mngr_t *vm_mngr, uint64_t ad)
struct code_bloc_node * create_code_bloc_node(uint64_t ad_start, uint64_t ad_stop)
PyObject * vm_reset_memory_breakpoint(VmMngr *self, PyObject *args)
void init_memory_breakpoint(vm_mngr_t *vm_mngr)
int vm_read_mem(vm_mngr_t *vm_mngr, uint64_t addr, char **buffer_ptr, uint64_t size)