热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手把手教你搞懂Android反编译

手把手教你搞懂Android反编译转载时请必须注明出处:http:www.iosxxoo.com201606292016-06-29前言反编译别人的程序不是什么值得炫耀的事,希望大
手把手教你搞懂Android反编译

转载时请必须注明出处:http://www.iosxxoo.com/2016/06/29/2016-06-29/

前言

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

什么是反编译

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

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

所需的工具

《手把手教你搞懂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/9671973,打包成APK后下载到手机上。

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

《手把手教你搞懂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

《手把手教你搞懂Android反编译》

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

《手把手教你搞懂Android反编译》

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

sh d2j-dex2jar.sh classes.dex

执行如下:

《手把手教你搞懂Android反编译》

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

《手把手教你搞懂Android反编译》

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

反编译资源

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

《手把手教你搞懂Android反编译》

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

sh apktool.sh apktool d FooApp.apk

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

《手把手教你搞懂Android反编译》

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

《手把手教你搞懂Android反编译》

主要目录说明:

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

修改App icon

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

《手把手教你搞懂Android反编译》

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

《手把手教你搞懂Android反编译》 ic_launche
《手把手教你搞懂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行

    《手把手教你搞懂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。执行结果如下图所示:

《手把手教你搞懂Android反编译》

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

《手把手教你搞懂Android反编译》

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

重新签名

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

在cmd中执行格式如下:

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

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

使用盗版APK

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

《手把手教你搞懂Android反编译》 1

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

参考链接:

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

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

Done

作者: @biggergao
个人博客: Mr.码了戈壁

2016年06月29日


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
author-avatar
广交天下友V笑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有