Android逆向入门教程

前言

什么是 Android 逆向开发?

Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。逆向开发可以帮助开发人员了解他人的代码实现,也可以帮助黑客攻击应用程序。

1 APKTool 介绍

        APKTool 是一个开源的、跨平台的反编译、回编译 Android 应用程序的工具。它能够将 APK 文件解压并还原成 Android 应用程序的资源文件和 Smali 代码,还能将修改后的资源文件和 Smali 代码重新打包成 APK 文件。APKTool 是 Android 应用程序开发和逆向开发的重要工具之一,它能够帮助开发者对 APK 文件进行修改、分析和定制,也能够帮助安全研究人员和黑客对应用程序进行逆向工程和漏洞分析。

APKTool 的主要功能包括

  1. 解压 APK 文件:APKTool 能够将 APK 文件解压为应用程序的源代码和资源文件。解压后的资源文件包括 AndroidManifest.xml、res 目录、assets 目录等;解压后的源代码包括 Java 代码和 Smali 代码。
  2. 反编译 APK 文件:APKTool 能够将 APK 文件反编译为 Java 代码和 Smali 代码。反编译后的 Java 代码和 Smali 代码能够帮助开发者了解应用程序的逻辑和实现方式,也能够帮助安全研究人员和黑客分析应用程序的漏洞和安全性。
  3. 重打包 APK 文件:APKTool 能够将修改后的源代码和资源文件重新打包成 APK 文件。重打包后的 APK 文件可以直接安装到 Android 设备上运行,也可以用于二次开发、分析和测试。
  4. 支持多语言:APKTool 能够处理多语言的应用程序,它支持多种语言的资源文件,可以方便地进行多语言的应用程序开发和本地化。
  5. 支持自定义:APKTool 提供了多种配置选项,可以根据需要自定义应用程序的打包和解包过程,也可以定制应用程序的资源文件和 Smali 代码。

2安装apktool

APKtool官网:https://ibotpeaches.github.io/Apktool/

APKtool下载:https://bitbucket.org/iBotPeaches/apktool/downloads/

APKtool源码:GitHub - iBotPeaches/Apktool: A tool for reverse engineering Android apk files

2.1 官方安装说明(Windows版本)

2.1.1下载Windows包装脚本

    打开一个新的浏览器窗口。

    复制以下链接:

https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/windows/apktool.bat

右键点击,选择“另存为”,并将其保存为一个名为apk_run.bat的文件。

作者已经整理了一份:放在:软件包/apktool目录下

2.1.2下载最新版本的Apktool

访问apktool的GitHub页面:

https://github.com/iBotPeaches/Apktool

    在页面上,您通常会看到一个“下载”或“releases”选项。点击它,然后选择最新版本的apktool

    下载zip文件或tar文件。

Github 直达链接:github.com/iBotPeaches…]

(https://github.com/iBotPeaches/Apktool)

找到 Releases 选项并点击

我们可以看到 apktool 最新版本是 2.7.0 版本

找到 Assets 区域,找到 apktool_2.7.0.jar Jar 包进行下载

2.1.3重命名下载的jar文件为apktool.jar

    解压您刚下载的文件(如果需要)。

    在解压后的文件中,找到jar文件。

    将其重命名为apktool.jar。

2.1.4 将apktool.jar和apktool.bat移动到Windows目录

(任意目录都可以)

    打开文件资源管理器。

    导航到C:\Windows目录(这通常是Windows的安装目录)。

    将apktool.jar和apktool.bat复制或移动到这个目录中。

2.1.5添加环境变量

    如果您没有直接访问C:\Windows的权限,或者想在其他位置安装apktool,您可以将其添加到系统的PATH环境变量中。这样,您就可以在任何目录下访问它。

    按Win + Pause/Break键打开系统属性。

    选择“高级”选项卡,然后点击“环境变量”。

    在“系统变量”部分,找到名为“Path”的变量,然后点击“编辑”。

    在值的末尾添加apktool的目录(例如,如果它在C:\Users\YourUsername\Documents\apktool,那么添加C:\Users\YourUsername\Documents\apktool)。确保在值的末尾添加分号(;)作为分隔符。

2.1.6运行apktool

   打开命令提示符(CMD)。

输入apktool并按Enter键。如果一切正常,您应该看到apktool的帮助信息。

3 apk 反编译

下载完 jar 后找一个你想要反编译apk,然后输入以下命令即可

.\apk_run.bat d .\5_base.apk -o .\5_base

java -jar xxx/apktool-2.7.0.jar d xxx/test.apk -o xxx/test

这句命令的意思是,将 test.apk 进行反编译,然后输出到 test 目录下

然后我们看到到命令行输出完以下指令就证明反编译成功了

I: Using Apktool 2.7.0 on test.apk

I: Loading resource table...

I: Decoding AndroidManifest.xml with resources...

I: Loading resource table from file: /Users/xxx/Library/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...

然后我们看到 test 目录就生成了以下这些文件

那么 apktool 生成这些文件和目录分别是什么呢?

  1. original 目录:保存了原始的 AndroidManifest.xml 和签名信息
  2. res 目录:应用程序的资源文件目录,包含了应用程序的布局文件、字符串资源、图片资源等。
  3. smali 目录:应用程序的 Smali 代码目录,包含了应用程序的所有 smali 代码文件(Smali 就是字节码)
  4. assets 目录:应用程序的 assets 目录,包含了应用程序需要使用的各种资源文件,例如音频、视频、图片、配置文件等。
  5. lib 目录:应用程序的库目录,包含了应用程序需要使用的库文件,例如 so 文件等。
  6. AndroidManifest.xml:应用程序的清单文件,包含应用程序的名称、包名、版本号、权限等信息。
  7. apktool.yml:是 APKTool 工具使用的配置文件,用于指定反编译和打包 APK 文件时的各种参数和选项。

4 apk 回编译

反编译完成后,我们可以尝试修改 apk 内容了,我们这里尝试修改 App 名字,方法也简单,在直接修改清单文件的属性值

<?xml version="1.0" encoding="utf-8" standalone="no"?>

<manifest

    xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.xxx.xxx"

    platformBuildVersionCode="25"

    platformBuildVersionName="7.1.1">

    

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

    

    <application

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="我是被反编译修改过的名字"

        android:supportsRtl="true"

        android:theme="@android:style/Theme.Holo.Light.DarkActionBar">

    </application>

</manifest>

然后输入以下命令进行回编译

.\apk_run.bat b .\5_base -o .\6_base.apk

java -jar xxx/apktool-2.7.0.jar b xxx/test -o xxx/test2.apk

这句命令的意思是,对 test 目录进行回编译,然后输出到 test.apk 文件

I: Using Apktool 2.7.0

I: Checking whether sources has changed...

I: Smaling smali folder into classes.dex...

W: Unknown file type, ignoring: xxx/test/smali/.DS_Store

W: Unknown file type, ignoring: xxx/test/smali/com/.DS_Store

W: Unknown file type, ignoring: xxx/test/smali/com/toshiba/.DS_Store

I: Checking whether resources has changed...

I: Building resources...

I: Building apk file...

I: Copying unknown files/dir...

I: Built apk into: xxx/test2.apk

这个时候我们就可以看到 apk 已经回编译完成了,过程十分简单

Ps:如果无法进行反编译或者回编译,可以尝试以下方法

  1. 检查路径包含中文
  1. 检查当前电脑用户文件夹包含中文
  2. 检查当前反编译或者回编译输入和输出的路径包含中文
  1. 更换 apktool jar 包版本
  2. 指定 framework-res.apk

1提取高版本的 framework-res.apk(存放在 /system/framework 目录下)

2提取完后放到某个文件夹中并且重名为 1.apk,这里示例放在了 framework-res/1.apk

3在反编译或者回编译的时候,在命令尾处加入 -p xxx/framework-res/ 来指定 framework-res.apk 文件

5 apk 签名(apksigner工具)

这个时候回编译出来的 apk 还不能安装到手机上面,因为它还有没有签名,需要先进行签名,说到签名,就必须要介绍的两个工具

  1. jarsigner:是 JDK 自带的工具,用于给 Java 程序的 jar 包进行数字签名。该工具可以对 jar 包进行签名、验证签名、查看签名信息等操作,可以用于保证 Java 程序的完整性和安全性。

apksigner:是 Android SDK 自带的工具,用于给 Android 应用程序进行数字签名。该工具可以对 APK 文件进行签名、验证签名、查看签名信息等操作,可以用于保证 Android 应用程序的完整性和安全性。

这两者不同之处在于,jarsigner 只能进行 v1 签名,而 apksigner 可以进行 v1 + v2 + v3 签名,那么这几种签名方式分别有什么区别呢?

  1. v1 签名:基于签名的 Jar 包的方案,但是有如下两个缺陷:
  1. 有篡改的风险:META-INF 目录用来存放签名,自然此目录本身是不计入签名校验过程的,可以随意在这个目录中添加文件,比如一些快速批量打包方案就选择在这个目录中添加渠道文件。
  2. apk 校验速度慢:校验过程中需要对 apk 中所有文件进行解压和摘要计算( SHA-256 ),在 APK 资源很多、性能较差的机器上签名校验会花费较长时间,导致安装速度慢。

  1. v2 签名(Android 7.0 引入):对整个 apk 进行签名(通过二进制流运算出哈希值),解决了 v1 带来的问题。v2 签名会在 apk 块中新增一个签名块,里面中存储了签名、签名算法、摘要等。一个签名块还可以包含多个 id 和 value,apk 的签名信息会存放在 ID 为 0x7109871a 的键值对里,而 美团多渠道打包(瓦力) 正是直接将渠道信息通过添加到签名块的 id 和 value 中。
  1. v3 签名(Android 9.0 引入):在 v2 的签名块里面添加了一个 ID 为 0xf05368c0 的新块(证书块),在这里支持添加多个签名证书(可以看成单链表),由此来做证书替换和升级。

  1. 签名兼容过程:为了最大限度地提高兼容性,会按照 v1、v2、v3 的先后顺序采用所有方案对应用进行签名,系统验证签名方案是从高往低走,如果没有 v2 签名,才会用 v1 签名对 apk 进行校验。另外如果 targetSdk 已经适配 Android 11 版本及以上,那么如果 apk 不签名 v2 会无法安装到 Android 11 的机型上面,需要注意的是,对于覆盖安装的情况,签名校验只支持升级,而不支持降级。也就是说设备上安装了一个使用 v1 签名的 APK,可以使用 v2 签名的 APK 进行覆盖安装,反之则不允许。

了解了 Android 相关的知识点,所以我们这里选择 apksigner 来签名。

5.0 apksigner工具从哪里找?

打开Android Studio软件

点击:file > project structure...

在Android Studio本地SDK目录中查找签名工具

5.1签名命令

java -jar C:\Users\Lenovo\AppData\Local\Android\Sdk\build-tools\34.0.0\lib\apksigner.jar sign --ks "密钥库文件路径" --ks-pass pass:"密钥库密码" --ks-key-alias "密钥别名" --key-pass pass:"密钥别名密码" --out 签名后输出的文件.apk 需要被签名的文件.apk

上面的命令解释如下:

sign:使用 apksigner 工具进行数字签名操作

--ks:指定签名证书的 keystore 文件路径

Keystore的用法,详见《安全加密基础-基础概念、keytool、openssl》

--ks-pass pass:指定签名证书的 keystore 密码

--ks-key-alias:指定签名证书的别名

--key-pass pass:指定签名证书的别名密码

--out:指定签名后的 APK 文件名

那么我如果想指定 apksigner 签名方案,需要怎么做呢?我们可以在 Android 官网 找到答案

5.2同时签名 v1 + v2 + v3 的命令

如果我要同时签名 v1 + v2 + v3 方案,那么可以将上面的命令修改成下面这样

java -jar C:\Users\Lenovo\AppData\Local\Android\Sdk\build-tools\34.0.0\lib\apksigner.jar sign --v1-signing-enabled true --v2-signing-enabled true --v3-signing-enabled true --ks "密钥库文件路径" --ks-pass pass:"密钥库密码" --ks-key-alias "密钥别名" --key-pass pass:"密钥别名密码" --out 签名后输出的文件.apk 需要被签名的文件.apk

5.3验证apk签名

我如果签名完了,如何去验证 apk 签名?可以输入以下命令进行验证

java -jar C:\Users\Lenovo\AppData\Local\Android\Sdk\build-tools\34.0.0\lib\apksigner.jar sign verify -verbose -print-certs 需要验证签名的文件.apk


Verified using v1 scheme (JAR signing): true

Verified using v2 scheme (APK Signature Scheme v2): true

Verified using v3 scheme (APK Signature Scheme v3): true

Verified using v3.1 scheme (APK Signature Scheme v3.1): false

Verified using v4 scheme (APK Signature Scheme v4): false

当然还有另外一种土方子,就是在知道 apk 有签名的情况下,但是你只想知道 apk 有没有用 v2 以上的签名方案,又嫌输入命令行太麻烦,可以通过这种方式来判断:可以在 apk 根目录找到 META-INF/CERT.SF 文件,如果其文件头有 X-Android-APK-Signed 字段,证明使用了 v2 以上的签名方式,如果没有则可能使用了 v1 的签名或者没有签名。

6总结

经过上面的反编译、修改 apk 应用名称、回编译、apk 签名,我们就可以进行安装了

是不是灰常简单呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java网络编程之IP,端口号,通信协议(UDP,TCP)

目录 1.软件架构2.网络编程三要素3.IP1.IPV42.IPV6 4.端口号5.协议1.UDP协议1.单播2.组播3.广播 2.TCP协议1.三次握手2.四次挥手 1.软件架构 ①C/S&#xff1a;客户端/服务器 在用户本地需要下载安装客户端程序&#xff0c;在远程有一个服务器端程序。 优点&#xff1a;画面精美…

Python学习笔记之(一)搭建Python 环境

搭建Python 环境 1. 使用工具准备1.1 Python 安装1.1.1 下载Python 安装包1.1.2 安装Python 1.2 VScode 安装1.2.1 下载VScode安装包1.2.2 给VScode安装Python 扩展 2. 第一次编写Python 程序 本篇文章以Windows 系统为例。 1. 使用工具准备 1.1 Python 安装 1.1.1 下载Pytho…

【设计模式】策略模式

文章目录 前言一、概述结构 二、实现案例三、优缺点使用场景 四、JDK源码分析总结 前言 【设计模式】策略模式——行为型设计模式。 一、概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为…

性能测评高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘

阿里云服务器系统盘或数据盘支持多种云盘类型&#xff0c;如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等&#xff0c;阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

​如何把图片里背景的路人P掉?教你四种方法消除路人

在日常生活中&#xff0c;我们经常会遇到需要将图片中背景的路人P掉的情况。有时候&#xff0c;这些路人会破坏图片的整体美感&#xff0c;或者我们只想要图片中的某些元素&#xff0c;而路人的出现会分散注意力。那么&#xff0c;如何才能有效地将图片中的背景路人P掉呢&#…

天津大数据培训机构 大数据时代已到来!

大数据时代已经来临&#xff0c;越来越多的人开始关注大数据&#xff0c;并且准备转行大数据。但是&#xff0c;对于一个外行人或者小白来说&#xff0c;大数据是什么&#xff1f;大数据需要学什么&#xff1f;什么样的大数据培训机构是靠谱的&#xff1f;这几个简单的问题就足…

Ubuntu无网络解决办法

1.进入root并输入密码 sudo su 2.更新NetworkManager的配置 用vim打开NetworkManager.conf vim /etc/NetworkManager/NetworkManager.conf 将第五行 managedFalse 改为 managedTrue 。 如果本身就是True就不用改了。 3.删除NetworkManager配置 service NetworkManager st…

服务器终端快速下载coco数据集

######解压到当前文件夹 sudo apt-get install aria2 aria2c -c <url> #<url>即为官网下载地址# url # download images http://images.cocodataset.org/zips/train2017.zip http://images.cocodataset.org/zips/val2017.zip# download annotations http://i…

Python等高线图的绘制(Matplotlib篇-11)

Python等高线图的绘制(Matplotlib篇-11)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

力扣hot100 对称二叉树 递归 队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f468;‍&#x1f3eb; 参考思路 递归的难点在于&#xff1a;找到可以递归的点 为什么很多人觉得递归一看就会&#xff0c;一写就废。 或者说是自己写无法写出来&#xff0c;关键就是你对递归理解的深不深。 对于此题&#xf…

蓝桥杯单片机进阶教程2——简单模块

第一章 温度模块DS18B20 1、比赛过程中的参考资料&#xff08;比赛会提供&#xff0c;按照这个就不用记忆了&#xff09; 原理图 文章第四页 文章第十到十二页 2、分析考题 &#xff08;1&#xff09;只考最简单的温度转换&#xff0c;温度读取 3、实验 进行最简单…

Servlet中常用的三大API

HttpServlet 我们写 Servlet 代码的时候&#xff0c;首先第一步就是先创建类&#xff0c;继承自 HttpServlet&#xff0c;并重写其中的某些方法。我们实际开发的时候主要重写 doXXX 方法&#xff0c;很少会重写 init / destory / service。 因为这一些方法的调用时机&#xf…

如何在Windows 10中扩展分区,这里提供步骤

一些PC制造商提供的电脑硬盘分为多个分区&#xff0c;一个用于Windows操作系统&#xff0c;另一个用于个人文件的空“数据”分区。如果你愿意&#xff0c;可以将这些分区合并为一个分区。 此技巧还可以用于删除恢复分区&#xff0c;从而释放通常用于恢复数据的空间。或者&…

【Qt之Quick模块】7. Quick基础、常用组件Item、Rectangle、Text、TextInput、TextEdit等

1. 概述 Qt Quick模块是编写QML应用程序的标准库。Qt QML模块提供QML引擎和语言基础结构&#xff0c;Qt Quick模块提供用QML创建用户界面所需的所有基本类型。它提供了一个可视化画布&#xff0c;包括用于创建和动画化可视化组件、接收用户输入、创建数据模型和视图以及延迟对…

简易五子棋的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

day7--java高级编程:泛型,集合:集合数组互转,迭代器,增强for循环,集合工具类

4. 泛型 4.1 泛型概述 4.1.1 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就…

Cytoscape3.8安装下载及安装教程

Cytoscape3.8下载链接&#xff1a;https://docs.qq.com/doc/DUmhZQ1lqTWhuSXJC 1.选中下载好的安装包右键选择“解压到 Cytoscape3.8.0”文件夹 2.打开解压好的”Cytoscape3.8.0“文件夹 3.选中“Cytoscape_3_8_0_windows_64bit.exe“右键以管理员身份运行 4.点击”Download“&…

网工内推 | 网络工程师,NP认证优先,上市公司,包吃,最高15薪

01 无锡先导智能装备股份有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1.依据项目规划方案提供硬件及网络方案设计&#xff1b; 2.面向客户提供网络技术支持&#xff0c;包括故障的解决、性能的优化、日常维护等&#xff1b; 3.和合作伙伴、供应商的技术…

2024.1.3 Spark on Yarn部署方式与工作原理

目录 Spark集群类型有以下几种&#xff1a; Spark的部署方式有以下几种&#xff1a; Spark on YARN的部署方式有两种&#xff1a;client模式和cluster模式。 Spark底层的工作原理,执行流程 Spark集群类型有以下几种&#xff1a; Standalone模式&#xff1a;这是Spark自带的…

产品Axure的安装以及组件介绍

Axure介绍&#xff1a; Axure是一款用户体验设计工具&#xff0c;可以用于创建交互式原型、线框图和设计文档。它支持快速原型开发、界面设计、信息架构、流程图和注释等功能&#xff0c;可以帮助设计师快速地创建和共享交互式原型&#xff0c;从而更好地与客户和团队协作。 …