Python源码示例:idaapi.dt_dword()
示例1
def by_indextype(self, index, dtype):
"""Lookup a register according to its `index` and `dtype`.
Some examples of dtypes: idaapi.dt_byte, idaapi.dt_word, idaapi.dt_dword, idaapi.dt_qword
"""
res = idaapi.ph.regnames[index]
name = self.__cache__[res, dtype]
return getattr(self.__register__, name)
示例2
def dt_to_width(self, dt):
'''
returns OOFW_xxx flag given a dt_xxx
'''
return {
idaapi.dt_byte: idaapi.OOFW_8,
idaapi.dt_word: idaapi.OOFW_16,
idaapi.dt_dword: idaapi.OOFW_32,
idaapi.dt_qword: idaapi.OOFW_64,
}[dt]
示例3
def _emulate_arm64(start, end, on_BL=None, on_RET=None):
"""A very basic partial Arm64 emulator that does just enough to find OSMetaClass
information."""
# Super basic emulation.
reg = _Regs()
def load(addr, dtyp):
if not addr:
return None
if dtyp == idaapi.dt_qword:
size = 8
elif dtyp == idaapi.dt_dword:
size = 4
else:
return None
return idau.read_word(addr, size)
def cleartemps():
for t in ['X{}'.format(i) for i in range(0, 19)]:
reg.clear(t)
for insn in idau.Instructions(start, end):
_log(11, 'Processing instruction {:#x}', insn.ea)
mnem = insn.get_canon_mnem()
if mnem == 'ADRP' or mnem == 'ADR':
reg[insn.Op1.reg] = insn.Op2.value
elif mnem == 'ADD' and insn.Op2.type == idc.o_reg and insn.Op3.type == idc.o_imm:
reg[insn.Op1.reg] = reg[insn.Op2.reg] + insn.Op3.value
elif mnem == 'NOP':
pass
elif mnem == 'MOV' and insn.Op2.type == idc.o_imm:
reg[insn.Op1.reg] = insn.Op2.value
elif mnem == 'MOV' and insn.Op2.type == idc.o_reg:
reg[insn.Op1.reg] = reg[insn.Op2.reg]
elif mnem == 'RET':
if on_RET:
on_RET(reg)
break
elif (mnem == 'STP' or mnem == 'LDP') and insn.Op3.type == idc.o_displ:
if insn.auxpref & _MEMOP_WBINDEX:
reg[insn.Op3.reg] = reg[insn.Op3.reg] + insn.Op3.addr
if mnem == 'LDP':
reg.clear(insn.Op1.reg)
reg.clear(insn.Op2.reg)
elif (mnem == 'STR' or mnem == 'LDR') and not insn.auxpref & _MEMOP_WBINDEX:
if mnem == 'LDR':
if insn.Op2.type == idc.o_displ:
reg[insn.Op1.reg] = load(reg[insn.Op2.reg] + insn.Op2.addr, insn.Op1.dtyp)
else:
reg.clear(insn.Op1.reg)
elif mnem == 'BL' and insn.Op1.type == idc.o_near:
if on_BL:
on_BL(insn.Op1.addr, reg)
cleartemps()
else:
_log(10, 'Unrecognized instruction at address {:#x}', insn.ea)
reg.clearall()