0x00 前言
在 Android 渗透和逆向分析中,经常要对app进行反编译,进而查看应用的程序逻辑,以及更改源码重新打包等。本文从一个简单demo入手,分享安卓应用的反编译和重新打包相关的内容。
本章将要解决的相关问题:
- 如何反编译查看Java源码?
- 如何反编译资源文件?
- 如何修改 smali 代码?
- 如何重新签名和打包?
0x01 编写一个Demo
首先动手写一个简单的demo app
实现的功能很简单,app中有一个按钮,点击按钮之后弹出一个Toast消息提示: “Hello world!!!“,编辑完成代码后,生成一个 release 版本的 apk 文件
然后复制这个 app-release.apk 出来,我们就改名为 demo.apk 吧,接着使用adb 安装到手机中:
adb install demo.apk
到此我们的demo 程序就准备好了,接下来我们开始反编译这个demo.apk
0x02 反编译代码
我们可以使用 dex2jar工具来将 dex 文件转换为 jar 文件,使用 jd-gui工具来将 jar 文件转换成 Java 代码
- dex2jar下载:wget https://onboardcloud.dl.sourceforge.net/project/dex2jar/dex2jar-2.0.zip
- jd-gui 安装: apt install jd-gui ,或者手动下载:http://java-decompiler.github.io/
解压 demo.apk 文件
unzip demo.apk -d demo1
使用 dex2jar中的 d2j-dex2jar.sh 对上面解压出来的 classes.dex 文件进行反编译
dex2jar-2.0/d2j-dex2jar.sh demo1/classes.dex
此时已经得到 jar 文件,接下来可以使用 jd-gui 工具阅读 Java 源码
jd-gui classes-dex2jar.jar
此时已经完成了 classes.dex 的反编译,并且可以阅读 Java 的源码,可以看到反编译的效果还是非常好的,基本逻辑看的非常清晰。
接下里我们看下如何反编译资源文件
0x03 反编译资源文件
前面我们已经将 demo.apk 解压出来了,但是查看 AndroidManifest.xml 文件,发现里面是乱码:
因此,我们直接解压 apk 文件时无法直接得到原始资源文件的,我们需要对资源文件进行反编译。可以使用 apktool工具还原 apk 文件中图片、布局、字符串等资源内容
首先,使用 apktool 对 apk 文件进行解码
apktool d demo.apk -o demo2
此时在解压的目录 demo2 下已经看到 资源文件和smali目录,apktool 对apk 解码后得到的是 smali代码,smali代码类似于汇编代码,可以查看下资源文件
已经可以看到AndroidMainfest.xml 里面的明文内容,再看看smali代码:
cat demo2/smali/com/act0rn/demo1/MainActivity\$1.smali
可以看到这里是我们之前定义的消息字符串
0x04 修改smali代码
接下来我们直接修改smali 代码,然后重新打包,这个就相当于修改了apk 的源码,然后生成一个破解后的 apk 文件了
vim demo2/smali/com/act0rn/demo1/MainActivity\$1.smali
将原先显示的“Hello world!!!” 消息字符串改为 ”This app is hacked by act0rn!!!”,然后保存
0x05 重新打包
接下来,我们就对修改后的资源进行重新打包,我们还是使用 apktool 工具进行打包
apktool b demo2 -o hack_demo.apk
执行之后,就生成了 hack_demo.apk 文件,此时我们还不能将这个apk 安装到手机上,因为还没有进行签名。我们没办法拿到源apk的签名文件,但是我们可以自己生成签名文件,然后对这个 apk 进行重新签名
首先使用 apktool 生成签名文件:
keytool -genkey -keystore my.keystore -alias my-alias -keyalg RSA -keysize 4096 -validity 10000
执行之后,在当前目录生成 my.keystore,接下来我们使用 jarsigner对 hack_demo.apk 文件进行重新签名:
jarsigner -verbose -keystore my.keystore -signedjar hack_demo_signed.apk hack_demo.apk my-alias
此时就生成了一个签名后的apk文件 hack_demo_signed.apk,接下来我们将这个apk 文件安装到手机
adb install hack_demo_signed.apk
0x06 结语
本文我们通过 dex2jar 对 classes.dex 进行反编译,得到 jar 文件,再结合 jd-gui 工具阅读 Java 源码,使用 apktool 反编译资源文件,得到 smali 代码。除了以上介绍的工具之外,如今还有很多好用的反编译工具,比如 Jadx-gui、Jeb、GDA、AndroidKiller 等,这些工具集成了多个工具,使用起来更加方便,大家可行下载尝试。
评论前必须登录!
注册