APP-Android脱壳的dex文件回编译APK

项目背景

  • 脱壳后拿到.dex文件后,如何重新打包APK并发布。

脱壳回编译

  • 思路

    • 脱壳拿到DEX —> 替换smali源码 —> 修复AndroidManifest.xml —> 重打包 —> 签名运行

一、脱壳获取DEX文件

  • 上篇我们已经成功脱掉腾讯乐固的壳,得到5个dex文件,但只有两个dex文件包含核心代码文件,我们可以通过文件大小也可以看出,所以我们只需要使用baksmali反编译这个两个dex:

二、反编译DEX文件

  • 对两个dex文件,分别改名classes.dex,classes2.dex。使用baksmali进行反编译。没有的话自行安装,我这里使用mobsf框架的baksmali.jar进行反编译:

    • 命令#java -jar baksmali.jar /path/classes.dex

    • 命令#java -jar baksmali.jar /path/classes2.dex

    • 默认回输出一个out文件,并重命名文件名为smali,同样的操作,再生成一个并重命名文件名为smali_classes2。因为我们要与反编译apk的文件名要一致。

    • 之前我们已将apk用apktool反编译,这里注意反编译时,加上-r的参数,不然apktool重打包会失败。-r参数的意思是不对资源文件进行编译。

    • 加上 -r 参数反编译时,AndroidManifest.xml也是无法修改的。

    • 我们不加-r 参数,再次反编译一次,替换刚才的AndroidManifest.xml文件。

  • 一切准备就绪,开始修复AndroidManifest.xml文件

三、修复AndroidManifest.xml

  • 修改AndroidManifest.xml中application中的android:name,这是apk的入口,因为壳已经去掉了,因此入口需要修改。怎么找呢?

    • 1、打开原包(加固之后的),查看apk,查看classes.dex 使用jadx,在com.wrapper.proxyapplication.WrapperProxyApplication这里找这个入口信息。

    • 2、修改AndroidManifest.xml文件中” application”节点”android:name”:(未修改之前)

    • 3、删除腾讯相关so文件,那我们应该删除那些文件呢?我自己登陆腾讯移动应用安全平台,上传了一个apk做了一个对比,结果如下:

    • 打开反编译文件的lib目录:

    • 新增如下3个文件:

四、重打包、并签名运行

  • 修改替换后,我们得到以下目录【标注的是修改之后的】:

  • 使用apktool重新打包

  • 签名方式太多了,这里用的是Android助手:

  • 我们再次使用jadx反编译查看,是否成功: