├── README.md └── repairdex.py /README.md: -------------------------------------------------------------------------------- 1 | # FART_repirdex 2 | 修复通过FART dump下来的dex 3 | 4 | python repairdex.py -d 3925368_dexfile.dex -i 3925368_ins_5029.bin 5 | 6 | 没问题的话,3925368_dexfile.dex可能就会被修复了 7 | 8 | -------------------------------------------------------------------------------- /repairdex.py: -------------------------------------------------------------------------------- 1 | import getopt,sys,re,base64 2 | 3 | def parse_inst(name): 4 | """ 5 | parse & format .bin 6 | """ 7 | code = list() 8 | with open(name,"r") as f: 9 | data = f.read() 10 | insts = data.split(';') 11 | for inst in insts: 12 | offset = re.search(r'offset:(\d*),',inst) 13 | if not offset: 14 | continue 15 | #print offset.group(1) 16 | name = re.search(r'name:([^)]*\)),',inst) 17 | if not name: 18 | continue 19 | #print len.group(1) 20 | ins = re.search(r'ins:(\S*)}',inst) 21 | if not ins: 22 | continue 23 | #print ins.group(1) 24 | len = re.search(r'len:(\d*),',inst) 25 | if not len: 26 | continue 27 | #print len.group(1) 28 | code.append({"offset":offset.group(1),"name":name.group(1),"ins":ins.group(1),"len":len.group(1)}) 29 | return code 30 | 31 | def repir_dex(name,code): 32 | """ 33 | repir dex 34 | """ 35 | dex_file = open(name,"r+b") 36 | for inst in code: 37 | if dex_file.seek(int(inst["offset"])) == -1: 38 | continue 39 | inst_bytes = base64.b64decode(inst["ins"]) 40 | dex_file.write(inst_bytes) 41 | print inst["name"]," repired" 42 | #print inst["name"]," offset:",inst["offset"],"len:",inst["len"],":".join("{:02x}".format(ord(c)) for c in inst_bytes) 43 | dex_file.close() 44 | 45 | def init(): 46 | global filename 47 | global insfilename 48 | try: 49 | opts, args = getopt.getopt(sys.argv[1:], "h:d:i:", ["dumpdexfile=", "insfile="]) 50 | except getopt.GetoptError: 51 | print 'Fart.py -d -i ' 52 | sys.exit(2) 53 | if len(opts)<=0: 54 | print 'Fart.py -d -i ' 55 | sys.exit() 56 | for opt, arg in opts: 57 | if opt in ("-h", "--help"): 58 | print 'Fart.py -d -i ' 59 | sys.exit() 60 | if opt in ("-d", "--dumpdexfile"): 61 | filename = arg 62 | elif opt in ("-i", "--insfile"): 63 | insfilename = arg 64 | print 'dumpdex file:', filename 65 | print 'ins file:', insfilename 66 | 67 | def main(): 68 | code = parse_inst(insfilename) 69 | dex = repir_dex(filename,code) 70 | 71 | if __name__ == "__main__": 72 | init() 73 | main() 74 | --------------------------------------------------------------------------------