更改 segment 来自动消除死代码(好像没有用) import ida_segment import ida_bytes seg = ida_segment.get_segm_by_name('.bss') for ea in range(seg.start_ea, seg.end_ea,4): ida_bytes.patch_bytes(ea, int(2).to_bytes(4,'little')) ''' seg.perm: 由三位二进制数表示,例如一个segment为可读,不可写,不可执行,则seg.perm = 0b100 (seg.perm >> 2)&1: Read (seg.perm >> 1)&1: Write (seg.perm >> 0)&1: Execute ''' seg.perm = 0b100 把比较的对象 mov 到 eax 过程中改成 0 mov 到 eax,批量脚本 import ida_segment import ida_xref import ida_idaapi from ida_bytes import get_bytes, patch_bytes def do_patch(ea): if get_bytes(ea, 1) == b"\x8b": reg = (ord(get_bytes(ea+1, 1)) & 0b00111000) >> 3 patch_bytes(ea, (0xb8+reg).to_bytes(1, 'little') + b'\x00\x00\x00\x00\x90\x90') elif get_bytes(ea, 1) == b"\x44": reg = (ord(get_bytes(ea+2, 1)) & 0b00111000) >> 3 patch_bytes(ea, b"\x41"+(0xb8+reg).to_bytes(1, 'little')+b"\x00\x00\x00\x00\x90\x90") else: print("error") seg = ida_segment.get_segm_by_name('.bss') start = seg.start_ea end = seg.end_ea for addr in range(start, end, 4): ref = ida_xref.get_first_dref_to(addr) print(hex(addr).center(20, '-')) while ref != ida_idaapi.BADADDR: do_patch(ref) print('patch at'+hex(ref)) ref = ida_xref.get_next_dref_to(addr, ref) print('-'*20) 使用 d810 去除 BCF d810 中内置了很多的不透明谓词表达式,它的匹配器也是非常的厉害完全可以做到去除虚假控制流