| # |
| # IDAPython script for IDA Pro |
| # Slightly modified from https://github.com/googleprojectzero/p0tools/blob/master/TrapFuzz/findPatchPoints.py |
| # |
| |
| import idautils |
| import idaapi |
| import ida_nalt |
| import idc |
| |
| # See https://www.hex-rays.com/products/ida/support/ida74_idapython_no_bc695_porting_guide.shtml |
| |
| from os.path import expanduser |
| |
| home = expanduser("~") |
| |
| patchpoints = set() |
| |
| max_offset = 0 |
| for seg_ea in idautils.Segments(): |
| name = idc.get_segm_name(seg_ea) |
| # print("Segment: " + name) |
| if name != "__text" and name != ".text": |
| continue |
| |
| start = idc.get_segm_start(seg_ea) |
| end = idc.get_segm_end(seg_ea) |
| first = 0 |
| subtract_addr = 0 |
| # print("Start: " + hex(start) + " End: " + hex(end)) |
| for func_ea in idautils.Functions(start, end): |
| f = idaapi.get_func(func_ea) |
| if not f: |
| continue |
| for block in idaapi.FlowChart(f): |
| if start <= block.start_ea < end: |
| if first == 0: |
| if block.start_ea >= 0x1000: |
| subtract_addr = 0x1000 |
| first = 1 |
| |
| max_offset = max(max_offset, block.start_ea) |
| patchpoints.add(block.start_ea - subtract_addr) |
| # else: |
| # print("Warning: broken CFG?") |
| |
| # Round up max_offset to page size |
| size = max_offset |
| rem = size % 0x1000 |
| if rem != 0: |
| size += 0x1000 - rem |
| |
| print("Writing to " + home + "/Desktop/patches.txt") |
| |
| with open(home + "/Desktop/patches.txt", "w") as f: |
| f.write(ida_nalt.get_root_filename() + ":" + hex(size) + "\n") |
| f.write("\n".join(map(hex, sorted(patchpoints)))) |
| f.write("\n") |
| |
| print("Done, found {} patchpoints".format(len(patchpoints))) |
| |
| # For headless script running remove the comment from the next line |
| # ida_pro.qexit() |