Ejemplo n.º 1
0
PyObject *
PyBuffer_FromMemory(void *data, Py_ssize_t len)
{
    Py_buffer buffer;
    PyObject *mv;

    PyBuffer_FillInfo(&buffer, NULL, data, len, 1, PyBUF_CONTIG_RO);
    mv = PyMemoryView_FromBuffer(&buffer);
    PyBuffer_Release(&buffer);
    return mv;
}
Ejemplo n.º 2
0
static int py_anal(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len, RAnalOpMask mask) {
	PyObject *tmpreg = NULL;
	int size = 0;
	int seize = -1;
	int i = 0;
	if (!op) return -1;
	if (py_anal_cb) {
		memset(op, 0, sizeof (RAnalOp));
		// anal(addr, buf) - returns size + dictionary (structure) for RAnalOp
		Py_buffer pybuf = {
			.buf = (void *) buf, // Warning: const is lost when casting
			.len = len,
			.readonly = 1,
			.ndim = 1,
			.itemsize = 1,
		};
		PyObject *memview = PyMemoryView_FromBuffer (&pybuf);
		PyObject *arglist = Py_BuildValue ("(NK)", memview, addr);
		PyObject *result = PyEval_CallObject (py_anal_cb, arglist);
		if (result && PyList_Check (result)) {
			PyObject *len = PyList_GetItem (result, 0);
			PyObject *dict = PyList_GetItem (result, 1);
			if (dict && PyDict_Check (dict)) {
				seize = PyNumber_AsSsize_t (len, NULL);
				op->type = getI (dict, "type");
				op->cycles = getI (dict, "cycles");
				op->size = seize;
				op->addr = getI (dict, "addr");
				op->jump = getI (dict, "jump");
				op->fail = getI (dict, "fail");
				op->stackop = getI (dict, "stackop");
				op->stackptr = getI (dict, "stackptr");
				op->ptr = getI (dict, "ptr");
				op->eob = getB (dict, "eob");
				// Loading 'src' and 'dst' values
				// SRC is is a list of 3 elements
				PyObject *tmpsrc = getO (dict, "src");
				if (tmpsrc && PyList_Check (tmpsrc)) {
					for (i = 0; i < 3; i++) {
						PyObject *tmplst = PyList_GetItem (tmpsrc, i);
						// Read value and underlying regs
						READ_VAL(tmplst, op->src[i], tmpreg)
					}
				}
				PyObject *tmpdst = getO (dict, "dst");
				// Read value and underlying regs
				READ_VAL(tmpdst, op->dst, tmpreg)
				// Loading 'var' value if presented
				r_strbuf_set (&op->esil, getS (dict, "esil"));
				// TODO: Add opex support here
				Py_DECREF (dict);
			}
			Py_DECREF (result);
		} else {
Ejemplo n.º 3
0
PyObject *memory_as_pybuffer(void *ptr, Py_ssize_t buf_len, int readonly) {
    Py_buffer pybuf;
    Py_ssize_t shape[] = {buf_len};
    int ret;
    if (readonly)
    	ret = PyBuffer_FillInfo(&pybuf, NULL, ptr, buf_len, 0, PyBUF_SIMPLE);
    else
        ret = PyBuffer_FillInfo(&pybuf, NULL, ptr, buf_len, 0, PyBUF_WRITABLE);
    if (ret!=0)
    	return NULL;
    pybuf.format = "B";
    pybuf.shape = shape;
    return PyMemoryView_FromBuffer(&pybuf);
}
Ejemplo n.º 4
0
PyObject *PyBuffer_FromMemory(void *buf, Py_ssize_t size){
	// buf is not freed by returned object !!!!!!!
	Py_ssize_t shape0 = size;
	Py_buffer info={
		buf,
		NULL,			// obj added in 3.0b3
		size,			// len
		1,			// itemsize
		TRUE,			// readonly
		1,			// ndim
		NULL,			// format
		&shape0,		// shape
		NULL,			// strides
		NULL,			// suboffsets
		NULL,			// internal
		};
	return PyMemoryView_FromBuffer(&info);
}
 PyObject* make_mview(const TCPStream::payload_type& payload) {
     // make a python memoryview corresponding to the vector<uint8_t> payload
     const uint8_t* buf = &(payload[0]);
     size_t buf_size = payload.size();
     Py_buffer* viewinfo = (Py_buffer*) PyMem_Malloc(sizeof(Py_buffer));
     if (viewinfo == 0) {
         throw std::bad_alloc();     // malloc error
     }
     if (PyBuffer_FillInfo(viewinfo, 0, (void*) buf, (Py_ssize_t) buf_size, 1, PyBUF_FULL_RO) != 0) {
         PyMem_Free((void*) viewinfo);
         throw std::runtime_error("PyBuffer_FillInfo failed in TCPStreamPyFunctor::make_mview");
     }
     PyObject* mview = PyMemoryView_FromBuffer(viewinfo);       // new reference
     if (mview == 0) {
         PyMem_Free((void*) viewinfo);
         throw std::runtime_error("PyMemoryView_FromBuffer failed in TCPStreamPyFunctor::make_mview");
     }
     return mview;
 }