转载

如何在Mac上进行Android反编译

反编译别人的程序不是什么值得炫耀的事,希望大家最好只是兴趣探索,而不是利益驱动。本文主要目的是绕开一个简单的激活程序。

什么是反编译

我们知道,Android的程序打包后会生成一个APK文件,这个文件可以直接安装到任何Android手机上,因此,反编译就是对这个APK进行反编译。Android的反编译分成两个部分:

  1. 一个是对 代码 反编译,也就是java文件的反编译。
  2. 一个是对 资源 反编译,也就是res文件的反编译。

所需的工具

如何在Mac上进行Android反编译

  • Android Studio:安卓开发IDE

    下载地址: https://developer.android.com/studio/index.html

反编译代码的工具:

  • dex2jar: 把dex文件转成jar文件

    下载地址: https://sourceforge.net/projects/dex2jar/files/

  • jd-gui: 这个工具用于将jar文件转换成java代码

    下载地址: http://jd.benow.ca/

反编译资源的工具:

  • APKTool: 本文重要工具,APK逆向工具,使用简单

    下载地址: http://ibotpeaches.github.io/Apktool/install/

热身准备

首先我们需要一个APK,这里我自己写了一个,源码下载地址: http://download.csdn.net/detail/u012891055/9563180 ,打包成APK后下载到手机上。

它的主要功能是模拟邮箱激活,如果我们输入了错误的数据则无法通过激活。所以我们的目的很简单,就是让这个判断逻辑失效。

如何在Mac上进行Android反编译

主要源码说明:

第51行 存储的正确的两个激活号码,通过 : 将账号密码隔开,如下

private static final String[] DUMMY_CREDENTIALS = new String[]{
"foo@163.com:20135115",
"bar@163.com:20135115"
};

现在只有激活码正确才能通过激活。

第331行 是Execute函数,逻辑判断的部分。

    @Override     protected void onPostExecute(final Boolean success) {         mAuthTask = null;         showProgress(false);          if (success) {             new AlertDialog.Builder(LoginActivity.this)                     .setTitle("恭喜您")                     .setMessage("成功激活!")                     .show(); //                finish();         } else {             mPasswordView.setError(getString(R.string.error_incorrect_password));             mPasswordView.requestFocus();         }     } 

反编译代码

dex2jar解压下来文件很多,在mac上我们需要用到dex2jar的是这三个东西(windows上对应用bat文件):

  • d2j_invoke.sh
  • d2j-dex2jar.sh
  • lib

如何在Mac上进行Android反编译

AndroidStudio 打包好的 APK文件 的后缀,需改为 .zip ,然后 解压 。从解压的文件中找到 classes.dex 文件,并将其放入 dex2jar 同一目录下,如下:

如何在Mac上进行Android反编译

并在cmd中也进入到同样的目录,然后执行:

sh d2j-dex2jar.sh classes.dex 

执行如下:

如何在Mac上进行Android反编译

然后我们会得到一个classes-dex2jar.jar文件,我们借助JD-GUI工具打开即可,打开如下:

如何在Mac上进行Android反编译

可以看到代码非常清晰,这样我们就可以看到整个APP的代码逻辑了。

反编译资源

apktool下载完成后有一个.sh文件和.jar文件,我们把APK放进来,如下:

如何在Mac上进行Android反编译

在cmd中进入apktool目录,执行命令:

sh apktool.sh apktool d FooApp.apk 

d是decode的意思,表示我们要对FooApp解码,结果如下:

如何在Mac上进行Android反编译

然后你会惊喜的发现多了一个FooApp文件夹。

如何在Mac上进行Android反编译

主要目录说明:

  • AndroidManifest.xml:描述文件
  • res:资源文件
  • smail:反编译出来的所有代码,语法与java不同,类似汇编,是Android虚拟机所使用的寄存器语言

修改App icon

打开我们的描述文件,高清无码:

如何在Mac上进行Android反编译

可以看到我们的App icon名称为ic_launcher,我们找到所有mipmap开头的文件夹,替换成下图即可:

如何在Mac上进行Android反编译

如何在Mac上进行Android反编译

在最后重新打包后我们的App icon就会被修改了,不过在重新打包之前,我们还有最重要的一件事没有做,那就是修改激活码判断逻辑。

修改逻辑

我们通过源码或者JD-GUI查看反编译的代码可以看到激活码判断逻辑如下:

    @Override     protected void onPostExecute(final Boolean success) {         mAuthTask = null;         showProgress(false);          if (success) {          // 激活码正确             new AlertDialog.Builder(LoginActivity.this)                     .setTitle("恭喜您")                     .setMessage("成功激活!")                     .show(); //                finish();         } else {             mPasswordView.setError(getString(R.string.error_incorrect_password));             mPasswordView.requestFocus();         }     } 

所以我们只需要找到反编译后的 if(success) 的语句,并将其修改成 if(!success) 即可,如下:

if (success)//修改成if(!success) { ... } else { ... } 

这样我们就成功的颠倒了以前的逻辑,我们输入一个错误的激活码,就会被判断成正确的。挺简单的,是吧。

现在我们来动手修改:

  1. 打开smail里的 LoginActivity$UserLoginTask.smali 文件.
  2. 全局搜索 if-eqz ,通过 AlertDialog 关键字辅助定位,发现在 第228行

    如何在Mac上进行Android反编译
  3. ok,就是这里了,然后将 if-eqz 修改成 if-nez ,他们对应 Java 的语法如下:

Smail 语法 Java 语法
if-eqz v0, if(v0 == 0)
if-nez v0, if(v0 != 0)

ok,大功告成,现在就可以重新打包了。关于smail语法,有兴趣的直接Google就行了。

重新打包

我们大概修改后两个地方,其实重新打包也十分简单,在cmd中执行以下命令即可:

sh apktool.sh b FooAPP -o NewFooApp.apk 

其中b是build的意思,表示我们要将FooAPP文件夹打包成APK文件,-o用于指定新生成的APK文件名,这里新的文件叫作NewFooApp.apk。执行结果如下图所示:

如何在Mac上进行Android反编译

然后你会发现同级目录下生成了新的apk文件:

如何在Mac上进行Android反编译

但是要注意,这个apk现在还是不能安装的,因为我们没有对它进行签名,重新签名后它就是个名副其实的盗版软件了,大家一定要强烈谴责这种行为。

重新签名

重新签名也是很简单的,我直接用的一个已有签名文件,使用Android Studio或者Eclipse都可以非常简单地生成一个签名文件。

在cmd中执行格式如下:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名 

然后我们就可以用这个apk进行安装了,为了追求更快的运行速度,我们可以对其进行一次字节对齐,这里就不说了。

使用盗版APK

我们用 NewFooApp.apk 安装好盗版app后,发现图标变成了篮球,并且随便输入数据都能通过激活了:

如何在Mac上进行Android反编译

怎么样?总的来说还是挺有意思的吧,不过别用歪了。

参考链接:

Android安全攻防战,反编译与混淆技术完全解析(上)- 郭霖

Android安全技术解密与防范 - 周圣韬

原文  http://www.iosxxoo.com/2016/06/29/2016-06-29/
正文到此结束
Loading...