欢迎光临
我们一直在努力

安卓应用反编译和重打包

0x00 前言

在 Android 渗透和逆向分析中,经常要对app进行反编译,进而查看应用的程序逻辑,以及更改源码重新打包等。本文从一个简单demo入手,分享安卓应用的反编译和重新打包相关的内容。

本章将要解决的相关问题:

  • 如何反编译查看Java源码?
  • 如何反编译资源文件?
  • 如何修改 smali 代码?
  • 如何重新签名和打包?

0x01 编写一个Demo

首先动手写一个简单的demo app

1660048665_62f25519427b8fd34e1bb.png!small?1660048664670

实现的功能很简单,app中有一个按钮,点击按钮之后弹出一个Toast消息提示: “Hello world!!!“,编辑完成代码后,生成一个 release 版本的 apk 文件

1660048957_62f2563d494e3efabe53e.png!small?1660048956862

然后复制这个 app-release.apk 出来,我们就改名为 demo.apk 吧,接着使用adb 安装到手机中:

adb install demo.apk

1660048969_62f25649333375c686581.png!small?1660048968743

到此我们的demo 程序就准备好了,接下来我们开始反编译这个demo.apk

0x02 反编译代码

我们可以使用 dex2jar工具来将 dex 文件转换为 jar 文件,使用 jd-gui工具来将 jar 文件转换成 Java 代码

解压 demo.apk 文件

unzip demo.apk -d demo1

1660048979_62f25653c8db3ca15d198.png!small?1660048979129

使用 dex2jar中的 d2j-dex2jar.sh 对上面解压出来的 classes.dex 文件进行反编译

dex2jar-2.0/d2j-dex2jar.sh demo1/classes.dex

1660048989_62f2565d622dd687b2c31.png!small?1660048988746

此时已经得到 jar 文件,接下来可以使用 jd-gui 工具阅读 Java 源码

jd-gui classes-dex2jar.jar

1660048996_62f25664714e9c244ca14.png!small?1660048995827

此时已经完成了 classes.dex 的反编译,并且可以阅读 Java 的源码,可以看到反编译的效果还是非常好的,基本逻辑看的非常清晰。

接下里我们看下如何反编译资源文件

0x03 反编译资源文件

前面我们已经将 demo.apk 解压出来了,但是查看 AndroidManifest.xml 文件,发现里面是乱码:

1660049006_62f2566e88ea0923288ed.png!small?1660049006222

因此,我们直接解压 apk 文件时无法直接得到原始资源文件的,我们需要对资源文件进行反编译。可以使用 apktool工具还原 apk 文件中图片、布局、字符串等资源内容

首先,使用 apktool 对 apk 文件进行解码

apktool d demo.apk -o demo2

1660049016_62f2567826bf140af7602.png!small?1660049015722

此时在解压的目录 demo2 下已经看到 资源文件和smali目录,apktool 对apk 解码后得到的是 smali代码,smali代码类似于汇编代码,可以查看下资源文件

1660049030_62f256864e223d2b9af0c.png!small?1660049029822

已经可以看到AndroidMainfest.xml 里面的明文内容,再看看smali代码:

cat demo2/smali/com/act0rn/demo1/MainActivity\$1.smali

1660049039_62f2568f22776af315a96.png!small?1660049038637

可以看到这里是我们之前定义的消息字符串

0x04 修改smali代码

接下来我们直接修改smali 代码,然后重新打包,这个就相当于修改了apk 的源码,然后生成一个破解后的 apk 文件了

vim demo2/smali/com/act0rn/demo1/MainActivity\$1.smali

1660049047_62f2569781562b1e5629c.png!small?1660049047528将原先显示的“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

1660049100_62f256ccc913af53bca4d.png!small?1660049100482

执行之后,在当前目录生成 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

1660049112_62f256d8a0ba18f54b9c3.png!small?1660049112184

0x06 结语

本文我们通过 dex2jar 对 classes.dex 进行反编译,得到 jar 文件,再结合 jd-gui 工具阅读 Java 源码,使用 apktool 反编译资源文件,得到 smali 代码。除了以上介绍的工具之外,如今还有很多好用的反编译工具,比如 Jadx-gui、Jeb、GDA、AndroidKiller 等,这些工具集成了多个工具,使用起来更加方便,大家可行下载尝试。

赞(0)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!