反编译APK 发表于 2019-07-01 | 更新于 2020-03-15 | 评论数: | 阅读次数: APK反编译脚本同目录下放一个bin文件夹 里边放dex2jar apktool相关文件 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192# coding=utf-8import osimport shutilimport sysimport zipfilereload(sys)sys.setdefaultencoding('utf8')def extract_to(z_file, path): for p in z_file.namelist(): extract(z_file, p, path)def extract(z_file, filename, path): try: if not filename.endswith('/'): f = os.path.join(path, filename) dir = os.path.dirname(f) if not os.path.exists(dir): os.makedirs(dir) file(f, 'wb').write(z_file.read(filename)) except BaseException: passfile_name_postfix = ["_Jar", "_Res", "_Rar"]file_name_dict = {}def reverse_apk(): # 1.反编译APK 获取res AndroidManifest.xml assets资源 # 2.读取APK 解压缩获取相关签名信息 # 3.反编译APK 获取Jar资源文件 if os.path.exists("out"): shutil.rmtree("out") os.mkdir("out") for file_name in os.listdir(os.getcwd()): if file_name.endswith("apk"): print file_name # 创建该项目的输出目录 parent_dir = "out\\" + file_name.replace(".apk", "") if os.path.exists(parent_dir): shutil.rmtree(parent_dir) os.mkdir(parent_dir) # 创建该项目各个资源的输出路径 for postfix in file_name_postfix: file_dir = parent_dir + "\\" + file_name.replace(".apk", "") + postfix if os.path.exists(file_dir): shutil.rmtree(file_dir) os.mkdir(file_dir) file_name_dict[postfix] = parent_dir + "\\" + file_name.replace(".apk", "") + postfix # 反编译APK 获取res AndroidManifest.xml assets资源 os.system("bin\\apktool\\apktool.bat d -f " + file_name) shutil.rmtree(file_name_dict["_Res"]) os.rename(file_name.replace(".apk", ""), file_name_dict["_Res"]) # 读取APK 解压缩获取相关签名信息 try: z_file = zipfile.ZipFile(file_name, mode='r') extract_to(z_file, file_name_dict["_Rar"]) for rsa_file_name in os.listdir(file_name_dict["_Rar"] + "\\META-INF"): if rsa_file_name.endswith("RSA") or rsa_file_name.endswith("rsa"): os.rename(file_name_dict["_Rar"] + "\\META-INF\\" + rsa_file_name, file_name_dict["_Rar"] + "\\META-INF\\CERT.p7b") except BaseException, e: print e continue # 反编译APK 获取Jar资源文件 for dex_file in os.listdir(file_name_dict["_Rar"]): # 多dex处理 if dex_file.endswith("dex"): cmd = "bin\\dex2jar\\d2j-dex2jar.bat --force " + file_name_dict[ "_Rar"] + "\\" + dex_file + " -o " + file_name_dict[ "_Jar"] + "\\" + dex_file.replace(".dex", ".jar") print cmd os.system(cmd)# androi反编译if __name__ == "__main__": try: reverse_apk() except BaseException, e: print eraw_input('Press enter to exit...')