Android反编译

#前言

一晃两个多月过去了,眼瞅着网站一直没更新,有点对不起这买来的两个域名,最近把xxhong.com给收了,我可是惦记了好几个月,就等着它过注册保护期

“ 这站长一定是个假的技术狗 ”

今天要跟大家聊聊Android应用的反编译

FBI WARNING
本博文仅供学习交流请勿用于非法用途,后果自负

#工具

  • apktool
    反编译和回编的主要工具,但是反编译后的代码是Smali语言!
  • jadx
    可直接查看APK源码,而且是Java!
  • smalidea(Android Studio插件)
    利用此插件可方便地分析Smali,而且可调试!

#步骤

1. 反编译

运行命令

1
$ apktool d test.apk

如果顺利的话,会输出一堆如下信息

1
2
3
4
5
6
7
8
9
10
11
I: Using Apktool 2.2.2 on test.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: 1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

所有文件默认都在应用同名文件夹中,我们需要关注里面的:

  • AndroidManifest.xml 应用配置文件
  • smali 源码目录
  • res 资源目录

2. 初步回编

运行命令

1
$ apktool b test

如果顺利的话,会输出一堆信息

1
2
3
4
5
6
7
I: Using Apktool 2.2.2 on test
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...
I: Copying unknown files/dir...

回编比较常见的几个错误及修复方法:

  1. 图片格式错误,修改相应图片
  2. 资源id找不到,实际是res/values/public.xml里面的id顺序不对,修改之

3. 分析及修改

这个时候你有两个选择:

  1. 功能性分析及修改
    你可以替换或修改res中的资源,修改smali代码

    tips:
    1.修改AndroidManifest.xml中的debuggable属性为true;
    2.在关键代码处插入日志打印,俗称插桩;
    3.利用smalidea插件在Android Studio中调试smali代码

  2. 代码级分析及修改
    使用jadx打开APK,然后选择保存,这时java代码就保存下来了,再利用前面apktool反编译出来的其他文件,你就可以在IDE中重新创建一个同名应用了。
    这种方式的好处是,你已经有了一份这个应用的源码,不过困难之处在于如果应用代码混淆了,你得到的源码比较难看懂,而且在IDE中会报各种语法错误,这些是需要你慢慢解决的问题。

4. 打包回编

基于smali的修改,请查看步骤2
基于代码级的修改及分析,可直接利用IDE
最后别忘了给应用签名

#然而

当你从应用市场下载了一个APK,漏出邪恶的笑容准备反编译的时候,你很可能没法用上述的方法来反编译,因为APP加壳了,这时候你需要学习另外一种技术—脱壳(就不给链接)