apk脱壳-重打包

Android 应用脱壳

Posted by Tan Lin on December 1, 2020

环境

MacOS Catalina 10.15.7
Android Studio 4.1.1 Android Emulator 30.0.26 Android Virtual Device, api-24-1280x768-arm VirtualXposed_0.18.0.apk FDex.2_1.1.apk Apktool-2.3.4.jar backsmali-2.4.0.jar jdx-1.1.0

开始反编译

java -jar ~/bin/decompile/apktool-2.3.4.jar d target.apk

查看直接查看smali文件夹 发现里面是 com/tencent/xx, com/wrapper/proxapplication.

怎么跟平常反编译后的apk怎么不一样?! 是的,加固了解一下。既然apk被加固/壳了,我们怎么 才能获取到源代码呢?答案是脱壳!

脱壳

需要准备一台拥有root权限的手机,等访问/data/user/*路径即可。 如果没有在厂商待过,那拥有绝对root权限的手机只有去二手市场去淘。 如果不想花钱,那就通过Android的模拟器,只是速度有点慢,但还没有到不能忍受的地步。下面我们介绍模拟器的方式。

创建模拟器,ARM架构

由于市面上大部分的应用为了将apk文件大小最小化,都删减了x86的动态库,又由于PC的CPU用inter居多,在创建模拟器的时候都推荐x86的镜像, 运行速度将得到很好的保障,但是并不能安装市面上的大部分应用,所以需要创建 arm 架构的模拟器

创建模拟器 AVD manager -> create virtual device -> next -> other images -> api-level 24 -> next -> finish

安装应用到模拟器上

运行刚刚创建的模拟器,将VirtualXposed_0.18.0.apk FDex.2_1.1.apk拖入模拟器界面里,开始安装。 再安装需要脱壳的目标应用

开始脱壳

启动 VirtualXposed,在VirtualXposed里安装FDex2,在模块中启用FDex2(注意提示,重启生效,是重启VirtualXposed,注意底部点重启即可) 在VirtualXposed里安装目标应用,可能比较久要稍微有点耐心。

都装好之后,回到 VirtualXposed 主页面,上滑动就能看到 VirtualXposed 内已安装的应用。
打开FDex2,点击目标应用,配置dex的输出路径,记住这个路径,后面需要。

返回到 VirtualXposed 主页,上滑打开目标应用直到看到应用主页

获取dev文件

还记得上一步配置的dex文件路径吗,把它从模拟器里 pull 电脑上进行下一步分析

adb pull /data/user/0/io.va.exposed/virtual/data/user/0/{pkg-name-of-target-app} ./

此时,已经获取到目标应用的全部代码了(当然是指混淆过的代码),Java 代码即将复现在你眼前,是不是有些激动!
可能会出现多个dex文件,其中有的dex是壳的,这些可以忽略,怎么知道是不是壳程序的dex呢?
型如这种格式的{pkg-name}-ush39192988.dex文件

JDX-直接查看dex

打开JDX,将dex挨个拖到jdx里,查看source code,当看到 com.tencent 或者 proxy 之类的名字时,就可以大胆认为这个是壳了,可以忽略掉。 还有个办法是壳程序的包很少,所以source code里只有少量的几个文件。

排除壳之后,剩下的几个就是目标应用的代码了,开始反编译dex

backsmali 登场

网上好多反编译工具 apktool 版本还是 dex2jar-2.0.0,这个工具比较老了,新编译出来的apk使用的是较新的编译工具。因此需要更新apktool。 其中 d2j-backsmali.sh 直接反编译 dex 就会报代码无法识别的错误。 此时你就应该是去下载新版本的 backsmali

java -jar ~/bin/apktool/baksmali-2.4.0.jar d {pkg-name}-ush39192988.dex

会在当前目录下生成一个out目录,这个目录就是该dex文件的所有的smali了,同理,将其他几个属于目标应用的dex文件反编译成smali,注意后面的dex 反编译的输出目录最好指定一下或者主动将生成的out重命名为 smali-classes2 / smali-classes3 …
这样方便重新打包的时候识别

重打包

假设目标应用的包名是 com.ten.cent

cd work-dir
adb pull /data/user/0/io.va.exposed/virtual/data/user/0/com.ten.cent/ ./
...

// 打包的时候
cd work-dir
java -jar ~/bin/apktool/apktool-2.3.4.jar b com.ten.cent -o new-target.apk
// 签名
jarsigner -verbose -keystore your.jks -signedjar new-target-signed.apk new-target.apk alias

打包签名脚本

下面是本机环境的一些简单脚本,你可以将里面的参数替换成你自己的

第1个是[signapk] 是用你指定的jks文件来将 inFile 签名成 outFile,aliasKey 就是jks文件的别名
第2个是[build] 是直接将指定的反编译后的目录生成apk,然后进行签名

```shell signapk #!/bin/bash

jks=”$1” inFile=”$2” outFile=”$3” aliasKey=”$4”

jarsigner -verbose -keystore “${jks}” -signedjar “${outFile}” “${inFile}” “${aliasKey}”%


```shell build
#!/bin/bash

set -e
echo 'building apk...'

apktool b zym -o aa.apk > /dev/null

echo 'sige the output apk file'

echo -e "cmptcdsl\ncdslcmpt\n" | signapk ../tempary/ety/cd.jks aa.apk aa.signed.apk cmpt > /dev/null

echo -e '\ncall adb install'

adb install -r aa.signed.apk