apk一键加固(JAVA层加密DEX,防反编译)

createh52个月前 (02-01)技术教程15

简介

Java层DEX一键加固脚本

使用说明

python -f xxx.apk

加固原理

准备一个壳DEX文件(源码位置:
shellApplicationSourceCode),将原APK的DEX文件加密保存到壳DEX尾部,然后将原APK文件中的原DEX文件替换为壳DEX,并修改原APK文件里AndroidManifest.xml的applicationandroid:name字段,实现从壳DEX启动。

解密和加载原DEX的任务交给壳DEX,这样就实现了APK文件防编译保护

一键加固脚本实现步骤

  1. 准备原DEX加密算法以及隐藏位置(壳DEX尾部)
        """
        1. 第一步:确定加密算法
        """
        inKey = 0xFF
        print("[*] 确定加密解密算法,异或: {}".format(str(inKey)))
  1. 生成壳DEX。(壳Application动态加载原application中需要原application的name字段)
        """
        2. 第二步:准备好壳App
        """
        # 反编译原apk
        decompAPK(fp)
        # print("[*] 反编译原的apk文件{}完成".format(fp))
        # 获取Applicaiton name并保存到壳App源码中
        stSrcDexAppName = getAppName(fp)
        # print("[*] 获取原apk文件的Application Android:name=\"{}\" 完成".format(stSrcDexAppName))
        save_appName(stSrcDexAppName)
        # print("[*] 保存原apk文件的Application Android:name=\"{}\" 到壳App源码的配置文件完成".format(stSrcDexAppName))
        # 编译出壳DEX
        compileShellDex()
        print("[*] 壳App的class字节码文件编译为:shell.dex完成")
  1. 修改原APK文件中的AndroidManifest.xml文件的applicationandroid:name字段,实现从壳application启动
        """
        3. 第三步:修改原apk AndroidManifest.xml文件中的Application name字段为壳的Application name字段
        """
        # 替换壳Applicaiton name到原apk的AndroidManifest.xml内
        replaceTag(fp, "cn.yongye.stub.StubApp")
        print("[*] 原apk文件AndroidManifest.xml中application的name字段替换为壳application name字段完成")
  1. 加密原DEX到壳DEX尾部并将壳DEX替换到原APK中
        """
        4. 替换原apk中的DEX文件为壳DEX
        """
        replaceSDexToShellDex(os.path.join(stCurrentPt, "result.apk"))
        print("[*] 壳DEX替换原apk包内的DEX文件完成")
  1. 自动签名
        """
        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简单保护 :
https://xz.aliyun.com/t/5789

[2] DexShell:https://github.com/Herrrb/DexShell

[3] dexshellerInMemory:https://github.com/yongyecc/dexshellerInMemory

相关文章

这几个开源的Java、Apk反编译工具,你可曾用过

Java开发神器IDEA,有自带class反编译功能,而且调试也非常方便。那么,除了IDEA可以反编译之外,还有其它的反编译工具吗?这里就分享几个Github中开源的反编译工具。jadxJadx可以将...

达内java培训专家:7款开源Java反编译工具

反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程。达内java培训(java.tedu.cn)专家今天要来分享一些关于Java的反编译...

Java反编译工具 JD-GUI安装使用(jdgui反编译jar)

我们知道,将源代码转换成二进制执行代码的过程叫“编译”,那么反编译就是将二进制执行代码转换成源代码。在java开发里,源代码是.java文件,然后经过编译后生成计算机识别的.class文件,但是.cl...

如何反编译jar包,修改后再重新打包成jar包

一、下载反编译工具下载地址:http://java-decompiler.github.io/选择jd-gui-1.6.6.jar包,然后下载到电脑的目录中,直接运行就可以了二、运行jd-gui-1....

Fury:一个基于JIT动态编译的高性能多语言原生序列化框架

Fury是一个基于JIT动态编译的多语言原生序列化框架,支持Java/Python/Golang/C++等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。引...

爬虫中的那些反爬虫措施以及解决方法

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理1、UserAgent UserAgent的设置能使服务器能够识别客户使用的操作系统及版本、CPU...