天天看点

Android APP反编译之开篇与工具

背景

反编译人家的程序并不是一件光彩的事情,我们也不推荐。这里仅仅从技术角度来探讨这一技能目前主要的使用场景、所需掌握的工具和技能,以及对我们保护自己APP的启发。这里,我结合自己逆向工程的一些经验,准备用以下一序列的博文来进行阐述:

  1. Android APP逆向工程之开篇与工具
  2. Android DEX之smali语法篇(TODO)
  3. Android DEX之寄存器篇(TODO)
  4. Android DEX之指令集篇(TODO)
  5. Android APP实战一:篡改广告ID(TODO)
  6. Android APP实战二:添加插屏广告(TODO)
  7. Android APP开发之如何保护(TODO)

Android APP逆向工程的使用场景

逆向工程这一技能在以下一些工作场合可能会有广泛的应用,如:

  1. 竞品分析

    在我们项目成立之初,市面上可能已经有竞品存在了,这时候技术人员可能会对其进行逆向工程,以尽可能获取其数据模型、接口、技术选型、协议等等方面的进行参考,为我所用或辩证优化。

  2. 窃取资源

    通过反编译APK获取人家的图片资源、布局文件和自定义View等等。

  3. 功能修改

    这个主要在我们项目成立初期做产品原型的时候会用到。比如我前段时间做一个TV产品时候原型时候用到沙发管家,因其欢迎界面的Activity在AndroidManifest.xml并未配置FullScreen,导致从Launcher启动时候会有会显示StatusBar,从而影响了DemoShow。这时候逆向工程就派上用场了,我们反编译后给其欢迎界面的Activity添加FullScreen属性再打包,问题圆满解决。当然这是在项目的原型开发阶段,到产品化时候是不能这么做的。

  4. 恶意篡改

    这个和上述“功能修改”最大的区别是以损害原开发商或者原开发者的利益而达到自己不可告人的目的。这种恶意行为最常见于所谓的“打包党”。打包党主要有2种行为的人:

    • 通过窃取别人源码,添加自己的广告,从而获利;
    • 反编译别人的APP,篡改其广告为自己的广告并从中获利;

      我们应该为这种人感到不耻。

工具篇

本文所说的逆向工程仅仅涉及资源文件和DEX文件,并不包含.so文件的反编译。通常情况下我们可以:

  • 通过ApkTool工具反编译得到资源和smali文件;也是通过ApkTool把反编译编辑后的资源和smali再打包成Apk文件;
  • 通过dex2jar把Apk或dex文件反编译成jar文件
  • 利用jd-gui查看dex2jar生成的jar文件。

下面我们以Android Studio的Empty Activity模板所对应的Apk重点介绍一下这3个工具:

ApkTool

截至目前,ApkTool的最新版本是2.2.2,我们可以从Apktool install下载相应的版本安装,注意jdk版本必须是Java 7+。Apktool的详细使用说明在这:Apktool Documentation。这里简单说明下反编译解包、再打包和签名。

  • 反编译解包

    命令是:apktool d apk文件路径,如

    Android APP反编译之开篇与工具
    从截图可以看出,我所使用的apktool版本是2.1.1。 解包结果如图:
    Android APP反编译之开篇与工具
    其中smali文件夹存放dex文件反编译后所对应的smali文件。这里看下MainActivity.smali的内容:
.class public Lcom/baidusoso/decompilationdemo/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java"


# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 6
    invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V

    return-void
.end method


# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .locals 1
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .prologue
    .line 10
    invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    .line 11
    const v0, 0x7f04001a

    invoke-virtual {p0, v0}, Lcom/baidusoso/decompilationdemo/MainActivity;->setContentView(I)V

    .line 12
    return-void
.end method
           
  • 再打包

    命令:apktool b 反编译后的文件夹,如:

    Android APP反编译之开篇与工具
    这个命令生成的apk文件在dist文件夹下。当然你可以通过-o选项修改输出apk的路径和名称。
  • 重签名

    很不幸的是再打包后生成的apk是还没签名的,也就是说这样的逆向工程会丢失原始的签名信息。这时候我们可以通过jarsigner工具重新签名apk,前提是你有了一份keystore。jarsigner签名命令如下:

jarsigner.exe -digestalg SHA1 -sigalg MD5withRSA -keystore cert.keystore -storepass yourstorepass -signedjar app_signed.apk app_unsigned.apk certalias           

如果您看不懂这段代码没关系,关于smali的语法,我会在下一个博文重点介绍,在这里知道有smali文件,对其有个印象就可以。

dex2jar

dex2jar主要是apk或dex文件转为jar文件。当前最新版本是2.0,您可以从官网sourceforge dex2jar下载到。下载后解压到如D:\program\dex2jar

Android APP反编译之开篇与工具

我们可以使用d2j-dex2jar把apk反编译为jar:

Android APP反编译之开篇与工具

app-debug-dex2jar.jar就是生成的jar文件。

jd-gui

jd-gui工具主要用于查看.class文件和jar文件。jd-gui可以从官网jd-gui下载到。用其打开上述的app-debug-dex2jar.jar,如

Android APP反编译之开篇与工具

好了,工具篇就先介绍到这里。如果您在反编译过程中出错,您可以试试把工具升级到最新版本,也许问题就解决了。

我下篇重点介绍smali的语法。