/* Used to inject value into memory */ void PINContextHandler::setMemValue(uint64 mem, uint32 writeSize, uint128 value) const { if (PIN_CheckWriteAccess(reinterpret_cast<void*>(mem)) == false) { std::cout << "[Bugs] Invalid write at " << std::hex << mem << std::endl; exit(0); } switch(writeSize){ case BYTE_SIZE: *((char *)mem) = value; break; case WORD_SIZE: *((short *)mem) = value; break; case DWORD_SIZE: *((uint32 *)mem) = value; break; case QWORD_SIZE: *((uint64 *)mem) = value; break; case DQWORD_SIZE: *((uint128 *)mem) = value; break; default: throw std::runtime_error("Error: PINContextHandler::setMemValue() - Invalid write size"); } }
static PyObject *Triton_setMemValue(PyObject *self, PyObject *args) { PyObject *addr; PyObject *value; PyObject *writeSize; uint128 va; // value uint64 ad; // address uint64 ws; // write size /* Extract arguments */ PyArg_ParseTuple(args, "O|O|O", &addr, &writeSize, &value); if (!PyLong_Check(addr) && !PyInt_Check(addr)) return PyErr_Format(PyExc_TypeError, "setMemValue(): expected an address (integer) as first argument"); if (!PyLong_Check(writeSize) && !PyInt_Check(writeSize)) return PyErr_Format(PyExc_TypeError, "setMemValue(): expected an integer as second argument"); if (!PyLong_Check(value) && !PyInt_Check(value)) return PyErr_Format(PyExc_TypeError, "setMemValue(): expected an integer as third argument"); ad = PyLong_AsLong(addr); ws = PyLong_AsLong(writeSize); if (ws != DQWORD_SIZE && ws != QWORD_SIZE && ws != DWORD_SIZE && ws != WORD_SIZE && ws != BYTE_SIZE) return PyErr_Format(PyExc_TypeError, "setMemValue(): The writeSize argument must be: DQWORD, QWORD, DWORD, WORD or BYTE"); if (PIN_CheckWriteAccess(reinterpret_cast<void*>(ad)) == false) return PyErr_Format(PyExc_TypeError, "setMemValue(): Can not write into the targeted address memory"); va = PyLongObjectToUint128(value); ap.setMemValue(ad, ws, va); return Py_None; }
static PyObject *Triton_checkWriteAccess(PyObject *self, PyObject *addr) { uint64 ad; if (!PyLong_Check(addr) && !PyInt_Check(addr)) return PyErr_Format(PyExc_TypeError, "checkWriteAccess(): expected an address (integer) as argument"); ad = PyLong_AsLong(addr); if (PIN_CheckWriteAccess(reinterpret_cast<void*>(ad)) == true) Py_RETURN_TRUE; Py_RETURN_FALSE; }
VOID MmapAfter(ADDRINT ret) { TraceFile << dec << PIN_CheckReadAccess((void * )ret); TraceFile << dec << PIN_CheckWriteAccess((void * )ret); TraceFile << endl; }