/apkShell

使用ChatGPT4实现的安卓应用加固壳DEMO(基于整体加固内存加载)

Primary LanguageJava

ApkShell

使用ChatGPT4实现的安卓应用加固壳DEMO(基于整体加固内存加载),外壳的代码全部是ChatGPT生成的。

ShellApp是外壳的工程,ShellTester是待加固的测试用的工程。

为了简化流程,外壳代码基本上是固定的,不需要在加固阶段反编译后修改再回编译,实际上也并没有对dex进行加密和压缩,如果实际使用可以自行拓展代码。外壳通过以下方式读取宿主的原始Application的类名:

  1. AndroidManifest.xmlmeta-data配置:

    <meta-data
               android:name="originApp"
               android:value="com.bigsing.shelltest.MyApp" />
  2. assets目录下的shell_config配置文件

    originApp=com.bigsing.shelltest.MyApp
  3. 反射获取宿主应用里com.bigsing.shell.config类的originApp字符串值。也即想要使用本加固方案的应用,可以在工程里创建一个该类,以告知外壳需要加载的Application类名。

外壳通过运行时获取当前应用的包名来判断是外壳自己的工程应用还是在宿主应用里,这样设计是为了方便测试。在开发阶段可以通过以下方式来调试代码:

  1. 手动修改代码让isRunningInHostApp返回true
  2. 在工程的assets目录下放好一个加固后的encrypted_dex.dex文件
  3. 在外壳自己的AndroidManifest.xml里也添加上一个meta-data配置,这个Application的类名一定要是encrypted_dex.dex文件里的Application类名
  4. 运行AndroidStudio就能够跟踪调试文件的解密和加载了

这样可以极大地提高外壳的代码编写速度。

当外壳代码编写完成后打出一个包出来,例如:Shell.apkShellTester也打出一个包,例如:ShellTester.apk。然后按照以下的流程加壳:

  1. ShellTester.apk里提取出classes.dex,加固处理为encrypted_dex.dex
  2. Shell.apk里把classes.dex提取出来,塞到ShellTester.apk里。
  3. 使用axml修改工具(例如:xml2axml: encode xml to axml AND decode axml to xml--Hack Android Manifest easily)把ShellTester.apkAndroidManifest.xmlApplication修改为外壳的Application(这里是:com.bigsing.shellapp.ShellApp),修改后记得塞回apk文件里。并参考前文配置meta-data告知原始Application类名。
  4. ShellTester.apk签名,安装运行。

由于以上流程比较简单,我就没有使用Python脚本处理了,纯手动就做了验证。所以ChatGPT生成的Python文件我没有经过验证,如果不满足需要自己自行修改,最后一并上传到GitHub上,见doc\packer.py。与ChatGPT的对话部分记录在doc\ChatGPT_Talk.mdapk文件也存放在doc目录下了,其中ShellTester_packed.apk就是加固处理后的包。