Java层DEX一键加固脚本
准备一个壳DEX文件(源码位置:shellApplicationSourceCode),将原APK的DEX文件加密保存到壳DEX尾部,然后将原APK文件中的原DEX文件替换为壳DEX,并修改原APK文件里AndroidManifest.xml的applicationandroid:name字段,实现从壳DEX启动。
解密和加载原DEX的任务交给壳DEX,这样就实现了APK文件防编译保护
""" 1. 第一步:确定加密算法 """ inKey = 0xFF print("[*] 确定加密解密算法,异或: {}".format(str(inKey)))
""" 2. 第二步:准备好壳App """ decompAPK(fp) stSrcDexAppName = getAppName(fp) save_appName(stSrcDexAppName) compileShellDex() print("[*] 壳App的class字节码文件编译为:shell.dex完成")
""" 3. 第三步:修改原apk AndroidManifest.xml文件中的Application name字段为壳的Application name字段 """ replaceTag(fp, "cn.yongye.stub.StubApp") print("[*] 原apk文件AndroidManifest.xml中application的name字段替换为壳application name字段完成")
""" 4. 替换原apk中的DEX文件为壳DEX """ replaceSDexToShellDex(os.path.join(stCurrentPt, "result.apk")) print("[*] 壳DEX替换原apk包内的DEX文件完成")
""" 5. apk签名 """ signApk(os.path.join(stCurrentPt, "result.apk"), os.path.join(stCurrentPt, "demo.keystore")) print("[*] 签名完成,生成apk文件: {}".format(os.path.join(stCurrentPt, "result.apk")))
【1】libpng error: Not a PNG file:apktool.jar编译smali项目时,如果出现png结尾的GIF文件时,会编译失败,这里我的解决方法时将GIF强行转换成PNG,解决问题。
中途解决该问题时,曾尝试使用AXMLEditor修改二进制Androidmanifest.xml的开源工具直接修改,然后想绕过编译资源步骤,实际不能成功,因为更改过后的application name字段在编译资源过程中,会被记录下来,而直接修改导致没有被记录,android系统是识别不到修改后的这个字段值
[1] Dex简单保护
[2] DexShell