cython: raise error when accessing irrelevant data in diet mode
This commit is contained in:
parent
43befa06a3
commit
79b6cc7727
|
@ -4,6 +4,8 @@ cimport pyx.ccapstone as cc
|
||||||
import capstone, ctypes
|
import capstone, ctypes
|
||||||
from capstone import arm, x86, mips, ppc, arm64, CsError
|
from capstone import arm, x86, mips, ppc, arm64, CsError
|
||||||
|
|
||||||
|
_diet = cc.cs_support(capstone.CS_SUPPORT_DIET)
|
||||||
|
|
||||||
class CsDetail:
|
class CsDetail:
|
||||||
|
|
||||||
def __init__(self, arch, raw_detail = None):
|
def __init__(self, arch, raw_detail = None):
|
||||||
|
@ -69,14 +71,26 @@ cdef class CsInsn(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def mnemonic(self):
|
def mnemonic(self):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
return self._raw.mnemonic
|
return self._raw.mnemonic
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def op_str(self):
|
def op_str(self):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
return self._raw.op_str
|
return self._raw.op_str
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def regs_read(self):
|
def regs_read(self):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
if self._detail:
|
if self._detail:
|
||||||
detail = self._detail
|
detail = self._detail
|
||||||
return detail.regs_read[:detail.regs_read_count]
|
return detail.regs_read[:detail.regs_read_count]
|
||||||
|
@ -85,6 +99,10 @@ cdef class CsInsn(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def regs_write(self):
|
def regs_write(self):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
if self._detail:
|
if self._detail:
|
||||||
detail = self._detail
|
detail = self._detail
|
||||||
return detail.regs_write[:detail.regs_write_count]
|
return detail.regs_write[:detail.regs_write_count]
|
||||||
|
@ -93,6 +111,10 @@ cdef class CsInsn(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def groups(self):
|
def groups(self):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
if self._detail:
|
if self._detail:
|
||||||
detail = self._detail
|
detail = self._detail
|
||||||
return detail.groups[:detail.groups_count]
|
return detail.groups[:detail.groups_count]
|
||||||
|
@ -105,22 +127,42 @@ cdef class CsInsn(object):
|
||||||
|
|
||||||
# get the register name, given the register ID
|
# get the register name, given the register ID
|
||||||
def reg_name(self, reg_id):
|
def reg_name(self, reg_id):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
return cc.cs_reg_name(self._csh, reg_id)
|
return cc.cs_reg_name(self._csh, reg_id)
|
||||||
|
|
||||||
# get the instruction string
|
# get the instruction string
|
||||||
def insn_name(self):
|
def insn_name(self):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
return cc.cs_insn_name(self._csh, self.id)
|
return cc.cs_insn_name(self._csh, self.id)
|
||||||
|
|
||||||
# verify if this insn belong to group with id as @group_id
|
# verify if this insn belong to group with id as @group_id
|
||||||
def group(self, group_id):
|
def group(self, group_id):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
return group_id in self._detail.groups
|
return group_id in self._detail.groups
|
||||||
|
|
||||||
# verify if this instruction implicitly read register @reg_id
|
# verify if this instruction implicitly read register @reg_id
|
||||||
def reg_read(self, reg_id):
|
def reg_read(self, reg_id):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
return reg_id in self._detail.regs_read
|
return reg_id in self._detail.regs_read
|
||||||
|
|
||||||
# verify if this instruction implicitly modified register @reg_id
|
# verify if this instruction implicitly modified register @reg_id
|
||||||
def reg_write(self, reg_id):
|
def reg_write(self, reg_id):
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
return reg_id in self._detail.regs_write
|
return reg_id in self._detail.regs_write
|
||||||
|
|
||||||
# return number of operands having same operand type @op_type
|
# return number of operands having same operand type @op_type
|
||||||
|
@ -179,6 +221,10 @@ cdef class Cs:
|
||||||
# TODO: dont need detail, so we might turn off detail, then turn on again when done
|
# TODO: dont need detail, so we might turn off detail, then turn on again when done
|
||||||
cdef cc.cs_insn *allinsn
|
cdef cc.cs_insn *allinsn
|
||||||
|
|
||||||
|
if _diet:
|
||||||
|
# Diet engine cannot provide @mnemonic & @op_str
|
||||||
|
raise CsError(capstone.CS_ERR_DIET)
|
||||||
|
|
||||||
cdef res = cc.cs_disasm_ex(self.csh, code, len(code), addr, count, &allinsn)
|
cdef res = cc.cs_disasm_ex(self.csh, code, len(code), addr, count, &allinsn)
|
||||||
|
|
||||||
for i from 0 <= i < res:
|
for i from 0 <= i < res:
|
||||||
|
|
Loading…
Reference in New Issue