我们从Python开源项目中,提取了以下13个代码示例,用于说明如何使用idc.BADADDR。
def get_bad_addresses(verbose=True): """ gets all the unmapped addressed from IDA's database """ ret = [] curEa = idc.MinEA() while True: if verbose: print "[+] getting more bad addresses 0x%08X" % (curEa) # the regex "(DC[DQ]| B.*) +0x" will retrieve the following: # 1. DCD 0x... # 2. DCQ 0x... # 3. B 0x..... # 4. BL 0x.... curEa = get_next_bad_addr(curEa, "(DC[DQ]| B.*) +0x") if curEa == idc.BADADDR: break if verbose: print "[+] found bad address at 0x%08X" % (curEa) dcd = idc.GetDisasm(curEa) res = re.findall("0x\w{8,}", dcd) for r in res: ret.append(int(r, 16)) if verbose: print "[+] found %d bad addresses" % len(ret) return ret
def map_exports(exports, verbose=True): """ gets an array of [(vaddress, name),..] and writes it to db""" if verbose: print "[+] going for %d exports" % (len(exports)) for addr, export_name in exports: print "[+] creating export", export_name # check that there are no existing segments in that address if idc.SegStart(addr) == idc.BADADDR: print "[+] creating seg: 0x%08X: %d" % (addr, 4) idc.AddSegEx(addr, addr + 4, 0, 0, idaapi.saRelPara, idaapi.scPub, idc.ADDSEG_FILLGAP) elif verbose: print "[!] Skipping creation of existing segment.." # set it as execuable idc.SetSegmentAttr(addr, idc.SEGATTR_PERM, SEGPERM_EXEC) if verbose: print "[+] making name: %s" % (export_name) make_name(addr, export_name)
def nextMnemonic(ea, mnem, maxaddr=0xc0*0x1000000): res = idc.GetMnem(ea) if res == "": return idc.BADADDR if res == mnem: return ea return nextMnemonic( idc.NextHead(ea, maxaddr), mnem, maxaddr )
def prevMnemonic(ea, mnem, minaddr=0): res = idc.GetMnem(ea) #print "%x -> %s"% (ea, res) if res == "": return idc.BADADDR if res == mnem: return ea return prevMnemonic( idc.PrevHead(ea, minaddr), mnem, minaddr )
def getMinorDispatchTableAddress(ea): """find address of last lea in function""" start = idc.GetFunctionAttr(ea, idc.FUNCATTR_START) end = idc.PrevHead( idc.GetFunctionAttr(ea, idc.FUNCATTR_END), start) res = prevMnemonic(end, 'lea', start) assert res != idc.BADADDR return idc.GetOperandValue(res, 1)
def getMajorDispatchTableAddress(): """find quicktime major dispatch table""" res = idc.LocByName('theQuickTimeDispatcher') res = nextMnemonic(res, 'lea', idc.GetFunctionAttr(res, idc.FUNCATTR_END)) assert res != idc.BADADDR return idc.GetOperandValue(res, 1)
def get_next_bad_addr(curEa, regex_query): """ gets the next unmapped address offset for given EA in IDA """ toJump = 0 ea = curEa while ea <= curEa and ea != idc.BADADDR: toJump += 4 ea = idc.FindText(curEa+toJump, idc.SEARCH_DOWN | idc.SEARCH_REGEX, 0, 0, regex_query) if toJump >= 0x100: return idc.BADADDR return ea
def map_segments(segments, dsc_file, verbose=True): for segaddr, segsize, segdata in segments: print "[+] creating seg: 0x%08X: %d" % (segaddr, segsize) # check that there are no existing segments in that address if idc.SegStart(segaddr) == idc.BADADDR: idc.AddSegEx(segaddr, segaddr + segsize, 0, 0, idaapi.saRelPara, idaapi.scPub, idc.ADDSEG_FILLGAP) # set it as read-only idc.SetSegmentAttr(segaddr, idc.SEGATTR_PERM, SEGPERM_READ) else: print "[!] Skipping creation of existing segment.." # after mapping the segment, write the data to the db. try: for addr, size, macho_offset in segdata: dsc_file.seek(macho_offset) memcpy(addr, dsc_file.read(size)) if verbose: print "0x%X, 0x%06X, 0x%06X: %s" % (addr, size, macho_offset, dsc_file.read(size)) except Exception: print segdata raise
def serialize(self): s = str(self.target_field.text()) if self.radio_addr.isChecked(): try: int(s, 16) except ValueError: print "Bad address given" return None elif self.radio_routine.isChecked(): addr = idc.LocByName(s) if addr == idc.BADADDR: print "Bad function name given" return None return specific_parameters_t()
def run(self): # -- GUI stuff self.result_widget.set_actions_visible_and_enabled(False) self.set_progress_visible(True) # ----------- # Refill the configuration file if self.configuration.ksteps != 0 and self.config_widget.radio_path_routine.isChecked(): self.k = self.configuration.ksteps # Use the ksteps given if making the path on the whole routine self.result_widget.webview.append("### Opaque predicates Detection ###\n") self.configuration.analysis_name = "static opaque" self.configuration.additional_parameters.typeid = self.configuration.additional_parameters.STANDARD target_val = str(self.config_widget.target_field.text()) start_tps = time.time() if self.config_widget.radio_addr.isChecked(): addr = utils.to_addr(target_val) self.process_routine(idaapi.get_func(addr).startEA, pred_addr=addr) elif self.config_widget.radio_routine.isChecked(): addr = idc.LocByName(target_val) if addr == idc.BADADDR: addr = utils.to_addr(target_val) self.process_routine(addr) elif self.config_widget.radio_program.isChecked(): self.process_program() else: pass self.exec_time_total = time.time() - start_tps - self.exec_time_dep self.analyse_finished = True self.broker.terminate() # -- GUI stuff self.result_widget.set_actions_visible_and_enabled(True) self.set_progress_visible(False) # ------------ self.analysis_terminated()
def _fill_instrs(self): cur_addr = self.startEA while cur_addr != idc.BADADDR: self.instrs.append(cur_addr) cur_addr = idc.NextHead(cur_addr, self.endEA)
def GetNextModuleBase(): global g_NextLibBase g_NextLibBase = FirstSeg() while SegStart(g_NextLibBase) != BADADDR: g_NextLibBase += kModuleAlignment fl_log("FridaLink: next module base = " + ("0x%012x" % g_NextLibBase) + "\n")
def main(): base_addr = 0 ea = 0 idc.MakeFunction(ea) # heuristic while(true): mnemonic = idc.GetMnem(ea) if "LDR" in mnemonic: base_str = idc.GetOpnd(ea, 1) base_addr = int(base_str.split("=")[1], 16) break ea += 4 print("[+] rebasing to address 0x%x" % (base_addr)) idc.rebase_program(base_addr, idc.MSF_FIXONCE) idaapi.autoWait() segment_start = base_addr segment_end = idc.GetSegmentAttr(segment_start, idc.SEGATTR_END) ea = segment_start print("[+] searching and defining functions") while ea != idc.BADADDR: ea = idc.FindBinary(ea, idc.SEARCH_DOWN, "BF A9", 16) if ea != idc.BADADDR: ea = ea - 2 if (ea % 4) == 0 and idc.GetFlags(ea) < 0x200: # print("[+] defining a function at 0x%x" % (ea)) idc.MakeFunction(ea) ea = ea + 4 idc.AnalyzeArea(segment_start, segment_end) idaapi.autoWait()