Mac下反编译apk与浅谈Android应用安全

通过反编译 我们可以获得layout,源代码,资源等。反编译我们感兴趣的apk,可以查看对应的内容,借鉴人家的代码。另外,有时候我们为了检验自己的应用是否混淆成功,通过反编译可以查看混淆情况。

1.工具

  • apktool(可以提取布局文件,图片等资源文件)
  • dex2jar(将classes.dex转化为jar文件)
  • jd-gui(查看jar文件中的Java文件)
注意:这些工具的正常使用要先搭好Java开发环境

下载后如下:

全部.png

2.工具安装与使用

  • apktool的使用
    下载后放到新建的apktool文件夹下,将我们要反编译的apk文件放入此文件夹下,命令行进入此文件夹,输入java -jar apktool.jar d test.apk进行反编译,编译后在此文件夹下生成了我们需要的文件,在里面我们可以看到layout等一些资源
apktool编译后.png
生成的文件.png
layout.png
  • dex2jar的使用
    下载后解压,把我们要反编译的安装包格式改为zip或rar,解压后会得到classes.dex文件,把此文件放入dex2jar文件夹,命令行切换到此文件夹,输入chmod +x d2j-dex2jar.sh 赋予可执行权限,输入sudo sh d2j-dex2jar.sh classes.dex 即可生成我们所需要的jar文件
    注意:如果生成jar文件时出现异常,主要是Java版本太低(不小于7.0),通过升级Java版本或者降低dex2jar版本可以解决
生成classes.dex文件.png
生成jar文件.png
  • jd-gui使用
    打开jd-gui解压包中的JD-GUI应用,打开后用此应用打开我们刚才生成的jar文件,然后可查看apk文件中的源代码了
启动JD-GUI.png

源代码.png

注意:打开jar文件时JD_GUI可能会出现 Invalid input fileloader错误,在命令行输入:sudo chmod +xr classes-dex2jar.jar即可解决

屏幕快照 2017-06-02 14.58.54.png

3.重新打包签名

  • 将AndroidManifest.xml文件中channel值改为10001(如果没有,就不用修改)
  • 命令行到apktool文件夹下,输入:java -jar apktool.jar b apkName -o apkName_new.apk,进行重新打包
  • 签名使用:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
  • 签名完成后,最好对APK文件进行对齐操作,这样可以使得程序在Android系统中运行得更快,对齐操作使用的是zipalign工具,该工具在<Android SDK>/build-tools/<version> (我的路径为:/Users/cxg/Library/Android/sdk/build-tools/25.0.2/zipalign)目录下,需要将这个目录配置到系统环境变量当中也可以在任何位置执行此命令。zipalign 4 new_name.apk new_name_aligned.apk

4.关于应用安全

通过反编译我们看到了程序源代码,布局等资源文件,有时候就需要对我们自己的应用进行保护,主要方法如下:

  • 使用ProGuard进行混淆处理,可以增加反编译的难度(这是最基本保护代码的方法,还可以做到压缩,优化我们的代码)
  • 应用加固(可以防篡改,防反编译,但也不是绝对的)
  • 应用加密(同样可以达到反编译效果,可以使用第三方提供的相应服务)

5.后记

后期发现使用jadx方法也可以进行反编译,此方法更简单,更好用,反编译出来的.class文件中的资源引用不是ID值,而是文件名。使用方法如下:

  • git clone https://github.com/skylot/jadx.git
  • cd jadx/
  • ./gradlew dist
  • ./jadx/build/jadx/bin/jadx-gui
  • 如果安装了之后在jadx目录下运行./build/jadx/bin/jadx-gui即可

推荐阅读更多精彩内容