def run(self, arg):
comms = {}
for addr in ida.addresses():
comm = idaapi.get_cmt(addr, 0)
if comm:
try:
parsed = bap_comment.parse(comm)
if parsed:
for (name, data) in parsed.items():
comms[(addr, name)] = data
except:
idc.Message("BAP> failed to parse string {0}\n{1}".
format(comm, str(sys.exc_info()[1])))
comms = [(name, addr, data)
for ((addr, name), data) in comms.items()]
attrs = Attributes(comms)
choice = attrs.Show(modal=True)
if choice >= 0:
idc.Jump(comms[choice][1])
python类Jump()的实例源码
def jump_click(self):
global cur_selection, last_off
if cur_selection != (None, None, None, None):
off = self.off_edit.text()
if off == "":
off = "0"
try:
off = long(off, 16)
except:
pass
if isinstance(off, long):
last_off = hex(off).upper()
idc.Jump(cur_selection[1] + off)
self.close()
self.deleteLater()
return
print "wrong format offset:" + off
def doubleClickEvent(self, event):
index = event.pos()
try:
item = self.model.itemFromIndex(self.view.indexAt(event.pos()))
column = item.column()
ea = item.ea
except:
return
if ea != -1:
idc.Jump(ea)
def OnSelectLine( self, n ):
row = ReefConfig.CHOOSER_ROW( *self.items[n] )
to = row.Address
idc.Jump( int(to, 16) )
# ------------------------------------------------------------------------------
def go_to_instruction(self, item):
table = self.index_map[self.traces_tab.currentIndex()]
addr_item = table.item(item.row(), 1)
addr_s = addr_item.text()
try:
addr = int(addr_s, 0)
idc.Jump(addr)
except Exception:
print "Cannot jump to the selected location"
def disassemble_from_trace(self):
try:
index = self.traces_tab.currentIndex()
trace = self.core.traces[self.id_map[index]]
self.disassemble_button.setFlat(True)
found_match = False
for k, inst in trace.instrs.items():
if k in trace.metas:
for name, arg1, arg2 in trace.metas[k]:
if name == "wave":
self.parent.log("LOG", "Wave n°%d encountered at (%s,%x) stop.." % (arg1, k, inst.address))
prev_inst = trace.instrs[k-1]
idc.MakeComm(prev_inst.address, "Jump into Wave %d" % arg1)
self.disassemble_button.setFlat(False)
return
# TODO: Check that the address is in the address space of the program
if not idc.isCode(idc.GetFlags(inst.address)):
found_match = True
# TODO: Add an xref with the previous instruction
self.parent.log("LOG", "Addr:%x not decoded as an instruction" % inst.address)
if idc.MakeCode(inst.address) == 0:
self.parent.log("ERROR", "Fail to decode at:%x" % inst.address)
else:
idaapi.autoWait()
self.parent.log("SUCCESS", "Instruction decoded at:%x" % inst.address)
if not found_match:
self.parent.log("LOG", "All instruction are already decoded")
self.disassemble_button.setFlat(False)
except KeyError:
print "No trace found to use"
def OnSelectLine(self, n):
item = self.items[n]
jump_ea = int(item[0], 16)
# Only jump for valid addresses
if idaapi.IDA_SDK_VERSION < 700:
valid_addr = idc.isEnabled(jump_ea)
else:
valid_addr = idc.is_mapped(jump_ea)
if valid_addr:
idc.Jump(jump_ea)