专栏首页QA一隅App安全测试——Android APK反编译

App安全测试——Android APK反编译

什么是Android 反编译

我们下载到的Android App 安装包是 Apk文件(Android Application Package) 。通过 Apk 文件,我们也可以得到这个应用的代码和资源文件,对应用进行修改。

那么我们如何获取这些文件呢?这就需要 Android 反编译技术。

计算机逆向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、等要素,某些特定情况下可能推导出源代码。

Android 反编译工具

Android应用程序只是一个数据和资源的归档文件。即使这样,我们不能简单地解压缩归档包.apk来获得可读的源代码。对于这些情况,我们必须依赖于将字节代码(如在classes.dex中)转换为可读源代码。

什么是dex文件

dexAndroid系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。

由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别。

java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是使其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加紧凑,实验表明,dex文件是传统jar文件大小的50%左右

dex2jar

简介

dex2jar可以将字节码.dex文件转换为可读的.jar文件。

下载安装

电脑上首先必须安装配置好Java环境,点击下载地址:dex2jar下载地址 ,下载后直接解压即可,解压后可以看到如下图所示文件内容:

执行编译

1.用压缩软件打开apk包,然后将classes.dex文件解压出来放置到我们解压的dex2jar目录中。

如果包中有classes.dex classes2.dex classes3.dex classes4.dex...等文件,这是因为 apk 中方法数超过了 65536个,使用了multidex support library将一个 apk 中的 dex 文件分割成多个 dex 文件的缘故。相关知识可以搜索 android 65k 来进行了解。

  1. 打开cmd进入dex2jar目录中,执行命令d2j-dex2jar.bat classes.dex即可完成编译。
C:\Users\Shuqing
λ cd C:\Users\Shuqing\Desktop\dex2jar-2.0


C:\Users\Shuqing\Desktop\dex2jar-2.0
λ d2j-dex2jar.bat classes.dex  
dex2jar classes.dex -> .\classes-dex2jar.jar

如果想覆盖已经生成的classes-dex2jar.jar文件,可以添加参数--force

3.解压完成之后我们可以看到多了一个文件classes-dex2jar

JD-GUI

JD-GUI是一个独立的图形实用程序,显示.class文件的Java源代码。您可以使用JD-GUI浏览重建的源代码,以立即访问方法和字段。

下载地址:http://java-decompiler.github.io/

安装完成之后启动JD-GUI,将上面生成的classes-dex2jar导入进来,依次点击File-Openfile 加载之后可以看到如下所示界面:

一般App为了保障安全都会进行代码混淆或加密,所以一般反编译的代码都是经过混淆的代码不能直接看到原始代码。

apktool

简介

apktool主要用于逆向apk文件,是将.dex文件转换为 smali 文件。smali语言是Dalvik的反汇编语言。

JD-GUI 相比,Apktool的主要优点是它是双向的。这意味着如果你反编译一个应用程序并修改它,然后使用 Apktool重新编译它,它能重新编译,并生成一个新的.apk文件。然而,dex2jarJD-GUI 不能做类似功能,因为它提供近似代码,而不是准确的代码。

下载安装

这里以Windows为例,其他环境请参考:https://ibotpeaches.github.io/Apktool/install/

  • 下载 apktool.bat 打开页面后另外为文件名命名为:apktool.bat 保存类型选择所有文件。
  • 下载 apktool.jar 选择最新版本下载然后重命名为apktool.jar
  • 创建文件夹自定义名称,如apktool,然后将apktool.batapktool.jar放置在该文件夹中。
  • 安装JDK1.8以上版本。

验证是否安装成功可以打开cmd进入到apktool文件目录,然后输入命令apktool看到如下 提示说明安装成功。

Apktool v2.4.1 - a tool for reengineering Android apk files
with smali v2.3.4 and baksmali v2.3.4
Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
Updated by Connor Tumbleson <connor.tumbleson@gmail.com>

usage: apktool
 -advance,--advanced   prints advance information.
 -version,--version    prints the version then exits
usage: apktool if|install-framework [options] <framework.apk>
 -p,--frame-path <dir>   Stores framework files into <dir>.
 -t,--tag <tag>          Tag frameworks using <tag>.
usage: apktool d[ecode] [options] <file_apk>
 -f,--force              Force delete destination directory.
 -o,--output <dir>       The name of folder that gets written. Default is apk.out
 -p,--frame-path <dir>   Uses framework files located in <dir>.
 -r,--no-res             Do not decode resources.
 -s,--no-src             Do not decode sources.
 -t,--frame-tag <tag>    Uses framework files tagged by <tag>.
usage: apktool b[uild] [options] <app_path>
 -f,--force-all          Skip changes detection and build all files.
 -o,--output <dir>       The name of apk that gets written. Default is dist/name.apk
 -p,--frame-path <dir>   Uses framework files located in <dir>.

For additional info, see: http://ibotpeaches.github.io/Apktool/
For smali/baksmali info, see: https://github.com/JesusFreke/smali

逆向编译

apktool编译命令 apktool d [path] [app-name].apkd标志表示反编译(decode)。

C:\Users\Shuqing\Desktop\apktool
λ apktool  d kaoyan.apk
I: Using Apktool 2.4.1 on kaoyan3.1.0.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Shuqing\AppData\Local\apktool\framework\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...

编译完成后会生成和apk包名一样的文件夹,文件夹里面包含资源文件和代码的文件。

打包编译

当修改反编译后的文件或者代码之后,我们可以调用命令apktool b [path] [target-app-name].apk重新打包生成apk文件。

C:\Users\Shuqing\Desktop\apktool
λ apktool b kaoyan -o  new_kaoyan.apk
I: Using Apktool 2.4.1
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
  • b表示build
  • kaoyan3.1.0 表示上面反编译的文件名称
  • o表示指定生成的apk文件名称

签名

生成签名文件

上面打包编译生成的apk还不能直接安装,因为没有签名。因此还需要签名,我们可以自己生成一个签名文件,首先需要安装好jdk环境。

使用keytool命令可以生成签名文件,操作如下:

  • -genkey 产生证书文件
  • -alias 产生别名
  • -keystore 指定密钥库的.keystore文件
  • -keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
  • -validity 为证书有效天数,这里我们写的是20000
λ keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  51zxw
您的组织单位名称是什么?
  [Unknown]:  51zxw.net
您的组织名称是什么?
  [Unknown]:  51zxw2020
您所在的城市或区域名称是什么?
  [Unknown]:  beijing
您所在的省/市/自治区名称是什么?
  [Unknown]:  beijing
该单位的双字母国家/地区代码是什么?
  [Unknown]:  86
CN=sutune, OU=sutune.me, O=sutune2020, L=changsha, ST=hunan, C=86是否正确?
  [否]:  y

输入 <android.keystore> 的密钥口令
        (如果和密钥库口令相同, 按回车):
再次输入新口令:

执行完成之后会生成android.keystore签名文件。

执行签名

执行签名操作如下:

jarsigner -verbose -keystore android.keystore -signedjar  new_kaoyan-signed.apk  new_kaoyan.apk  android.keystore
输入密钥库的密码短语:
....(此处省略N行)
  正在签名: assets/newsdetail/ky_article.html
  正在签名: assets/newsdetail/newsdetail.html
  正在签名: assets/newsdetail/newsdetail_1.html
  正在签名: assets/ShareSDK.xml
  正在签名: assets/share_logo.png
  正在签名: manifest
  正在签名: com/tencent/mm/sdk/platformtools/rep5402863540997075488.tmp
jar signed.

  • -verbose 指定生成详细输出
  • -keystore 指定数字证书存储路径
  • -signedjar指定要签名的apk文件
  • new_kaoyan-signed.apk 指签名后的apk文件名
  • new_kaoyan.apk 原来的apk文件名
  • android.keystore 别名

这样,就完成了对一个apk的签名过程,然后就可以安装使用了。

注意:如果你的手机上原来就有这个apk,需先卸载,不然签名冲突无法安装。

本文分享自微信公众号 - QA一隅(sutune2020),作者:Sutune

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android之APP安全测试篇

    反编译 apk 文件,在AndroidManifest.xml 中查找Activity组件

    厦门-安仔
  • Android之APP安全测试篇

    反编译 apk 文件,在AndroidManifest.xml 中查找Activity组件

    洛米唯熊
  • APP安全检测手册

    随着运营商新技术新业务的发展,运营商层面对安全的要求有所变化,渗透测试工作将会面临内容安全、计费安全、业务逻辑及APP等方面的挑战。随着运营商自主开发的移动AP...

    FB客服
  • Android应用签名、反编译与防止二次签名

    我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行。签名就代表着自己的身份即keystore。小编所在项目,遇到应用被...

    用户5521279
  • 破解第一个Android程序

    破解Android程序的方法通常是:使用ApkTool反编译APK文件,生成smali格式的反汇编代码;通过阅读smali文件的代码来理解程序的运行机制,找到突...

    用户1631416
  • APP端测试系列(3)——客户端安全

    在APP测试的第三部分之前插播一个新闻《自学黑客薅羊毛,薅出玫瑰金手镯》,一个通过测试APP客户端,绕过验证注册二十万账号,从而获利六万余元最终喜获金手镯的...

    Jayway
  • 一篇文章带你入门移动安全

    这篇文章集合了一些入门移动安全的基础渗透知识,希望可以能给想入门移动安全小伙伴们一些收获。

    重生信息安全
  • Android 插件化与测试

    插件化技术最初源于免安装运行apk的想法,支持插件化的app可以在运行时加载和运行插件,这样便可以将app中一些不常用的功能模块做成插件,一方面减小了安装包的...

    用户5521279
  • 安全测试工具(连载9)

    APP反向编译工具是APP安全领域很重要的工具,本节介绍Dex2jar、和jd-gui。秀一节介绍apktool。

    小老鼠
  • 学习 Android Application Security Series 时需要注意的一些点

    最近想扩展学习下 Android 应用安全,找到一份入门指引  ,大概走了一遍,有一些注意的点且记下。 1. 建议下载的 Appie 版本为 2.0,因为作者写...

    s1mba
  • 软件安全性测试(连载24)

    对于安卓源代码是Java文件,正向编译过程是把.java->.jar->.apk。而反编译过程正好相反.apk ->.jar->.java。获取了Java源代码...

    小老鼠
  • 反编译一款APP然后重新打包(MacOS环境)

    最近公众号后台有小伙伴留言,怎么把一款APP改成自己的信息呀,咳咳,这又来送题材了,今天水一把APP反编译+回编译,文中会针对一款APP进行简单的修改信息,问问...

    niceyoo
  • [转]Android应用安装包apk文件的反编译与重编译、重签名

    背景介绍:最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-p...

    战神伽罗
  • Unity编译Android的原理解析和apk打包分析

    最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用A...

    张坤
  • Android 逆向工具篇—反编译工具的选择与使用

    在过去,当我们想要了解一个 app 内部运作细节时,往往先通过 ApkTool 反编译 APK,生成 smali 格式的反汇编代码[1],然后大佬和老手直接阅读...

    Python编程与实战
  • 9.5.3 Android Apk 反编译 & 9.5.4 Android Apk 加密

    首先说一下,何为反编译,简单地说,从源码开始,经过集成开发环境编译以及签名之后得到apk文件的这个过程,我们称之为“编译”;“反编译”的话,顾名思义,粗略地说就...

    凌川江雪
  • 写给小白的android基础面试笔试题(一)

    序言:由于公司的某些方面原因,LZ最近都处于找工作的状态,年关了,最关键的LZ还只是个没毕业的孩子,所以工作越来越不好找了,到哪里投简历都是动不动就好几年经验,...

    用户2802329
  • Android 安全分析和漏洞挖掘|工具集

    @tanprathan 最近在Github上放出了一份移动应用安全分析工具的清单(Cheat Sheet),里边工具比较齐全。Security Toolkit翻...

    7089bAt@PowerLi
  • Android组件安全

    组件是一个Android程序至关重要的构建模块。Android有四种不同的应用程序组件:Activity、Service、Content Provider和Br...

    信安之路

扫码关注云+社区

领取腾讯云代金券