import struct, re EXES = ['/Users/jing/Documents/yutong/yutongapp/TP5(En).exe', '/Users/jing/Documents/yutong/yutongapp/TP5(Cn).exe'] def crc_table16(poly, reflect): t=[] for i in range(256): if reflect: c=i for _ in range(8): c = (c>>1) ^ (poly if c&1 else 0) else: c=i<<8 for _ in range(8): c = ((c<<1)^poly)&0xffff if c&0x8000 else (c<<1)&0xffff t.append(c&0xffff) return t def crc_table32(poly, reflect): t=[] for i in range(256): if reflect: c=i for _ in range(8): c = (c>>1) ^ (poly if c&1 else 0) else: c=i<<24 for _ in range(8): c = ((c<<1)^poly)&0xffffffff if c&0x80000000 else (c<<1)&0xffffffff t.append(c&0xffffffff) return t polys16 = [0x1021,0x8408,0x8005,0xa001,0x3d65,0xa6bc,0xc867,0x0589,0x8bb7,0x8d95,0x1DCF,0x755B] for path in EXES: d=open(path,'rb').read() print('===', path, len(d)) for p in polys16: for refl in (0,1): t = crc_table16(p, refl) blob = b''.join(struct.pack(' %s' % (p,refl, hex(i) if i>=0 else '-')) # generic immediate search for 16-bit polys used in bitwise loop: # look for "xor ax, imm16" = 66 35 xx xx or "xor eax, imm32" = 35 xx xx xx xx for m in re.finditer(rb'\x66\x35(..)', d, re.S): pass