Android apk安装包反编译——apktool工具

目录

  • 一、apk 文件结构
  • 二、下载 apktool
  • 三、 使用 apktool 反编译 apk
  • 四、编译为apk
  • 五、apk签名
    • 1.生成密钥库
    • 2.使用 v1 签名
    • 3.使用 v2 签名
  • 六、Dex 加解密原理

一、apk 文件结构

首先是 apk,即安卓程序的安装包。Apk 是一种类似于 Symbian Sis 或 Sisx 的文件格式。通过将 APK 文件直接传到 Android 模拟器或 Android 手机中执行即可安装。
而 apk 文件实际上就是一个 MIME 为 ZIP 的压缩包,只不过后缀名进行了更改。

我们可以直接把 .apk 后缀的文件修改成 .zip 后缀的压缩包格式,然后解压后就可以看到内部的文件结构,就像下面这样:

在这里插入图片描述

文件夹结构说明:

  • assets 文件夹: 保存一些额外的资源文件,如游戏的声音文件,字体文件、图片等等,在代码中可以用 AssetManager 获取 assets 文件夹的资源。
  • lib 文件夹: 存放用 C/C++ 编写的,用NDK编译生成的 so 文件,供 java 端调用。
  • META-INF 文件夹: 存放 apk 签名信息,用来保证apk包的完整性和系统的安全。在 IDE 编译生成一个 apk 包时,会对里面所有的文件做一个校验计算,并把计算结果存放在 META-INF 文件夹内,apk 在安装的时候,系统会按照同样的算法对 apk 包里面的文件做校验,如果结果与 META-INF 里面的值不一样,系统就不会安装这个 apk,这就保证了 apk 包里的文件不能被随意修改和替换。比如拿到一个 apk 包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
  • res文件夹: 存放资源文件,包括icon,xml布局文件
  • AndroidManifest.xml文件: 应用程序的清单文件,每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等信息。
  • classes.dex文件: 传统 Class 文件是由一个 Java 源码文件生成的 .Class 文件,而 Android 是把所有 Class 文件进行合并优化,然后生成一个最终的 class.dex 文件。它包含 APK 的可执行代码,是分析 Android 软件时最常见的目标。由于 dex 文件很难看懂,可通过 apktool 反编译得到.smali文件,smali文件是对Dalvik虚拟机字节码的一种解释(也可以说是翻译),并非一种官方标准语言。通过对smali文件的解读可以获取源码的信息。当然 你也可以通过dex2jar工具将 classes.dex 文件转化为 jar 包,然后再通过 jadx 或者 jd-gui 可以查看 jar 包里面的代码。一般软件开发者会对 classes.dex 进行加固,防止别人轻易反编译
  • resources.arsc文件: 二进制资源文件,如:字符串常量就会存放在 strings.xml 中。
  • smali: smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为 Android 字节码的反汇编语言。利用 apktool 或者 Android Killer,反编classes.dex文件,就可以得到以smali为后缀的文件,这些 smali 文件就是 Dalvik 的寄存器语言。
    简单的说,smali就是Dalvik VM内部执行的核心代码,andorid逆向分析的关键点。

二、下载 apktool

可在下面两种下载中选择一种方式下载:

apktool github发下页面
apktool 下载

(我这里使用的是 apktool_2.9.1.jar 版本)

三、 使用 apktool 反编译 apk

将 apk 安装包和下载的 apktool 放在同一目录。
假如我的安装包叫 base.apk ,我想把它反编译到 test 文件夹下,反编译命令如下:

java -jar apktool_2.9.1.jar d base.apk -o test

该命令将会自动新建一个 test 文件夹, 反编译后的所有文件都将被放到里面。

说明:
与 jadx 不同,apktool 反编译 apk 后,你在反编译后的 AndroidManifest.xml 里是找不到 versionCode 内部版本号 和 versionName 版本名称 的,因为 apktool 把它放到了 apktool.yml 文件里,如果你要修改 versionCode 、versionName ,可以在 apktool.yml 文件里修改。

四、编译为apk

假如你修改了 test 文件夹里的代码 或者 修改了 versionCode 、versionName 等其他内容,可用下面的命令将 test 文件夹编译为 apk 。

java -jar apktool_2.9.1.jar b test -o test.apk

该命令将 test 文件夹编译为 test.apk 。

到这里你已经得到了一个修改后的 apk,但是这个编译后的 apk 还无法安装到手机上,因为修改了文件,在安装时手机会对安装包里的签名进行比对签名,如果签名对不上说明apk被篡改了,就不会进行安装。

所以,如果现在要对修改后的 apk 重新进行签名,才能安装。

五、apk签名

关于 apk 签名的具体细节说明,可参考这篇文章:Android apk之v1、v2、v3签名

1.生成密钥库

使用如下命令生成 keystore 格式的密钥库:

keytool -genkey -alias new.keystore -keyalg RSA -validity 20000 -keystore new.keystore

输入两次密钥口令,一直回车,最后输入y
在这里插入图片描述

2.使用 v1 签名

使用如下命令进行签名:

jarsigner -verbose -keystore new.keystore -signedjar D:\fanbiany\sign1.apk D:\fanbiany\test.apk new.keystore

说明:
该命令使用上面生成的 new.keystore 密钥库对 D:\fanbiany\test.apk 进行签名,最后生成 D:\fanbiany\sign1.apk

3.使用 v2 签名

先找到你的 apksigner.jar 所在路径,我的是在C:\Users\kingdee\AppData\Local\Android\Sdk\build-tools\33.0.2\lib\apksigner.jar

执行如下命令进行 v2 签名:

java -jar C:\Users\kingdee\AppData\Local\Android\Sdk\build-tools\33.0.2\lib\apksigner.jar sign --ks new.keystore --out sign2.apk  sign1.apk

说明:
使用 apksigner.jar 然后用 new.keystore 密钥库对 sign1.apk进行签名,最后生成 sign2.apk

六、Dex 加解密原理

一般 apk 都会进行加固,即对 Dex 加密,Dex 就是格式的文件里是 apk 的代码,加密后反编译是看不到项目主要代码的,从而保证了 apk 的安全性。

关于 Dex 加解密原理,可参考如下文章查看细节:
性能优化专题七–Apk加固之Dex文件的加密与解密
Dex 加解密与多 Dex 加载
APK 加固之 Dex 加解密,反编译都看不到项目主要代码。


本文参考:
Android 逆向入门保姆级教程
静态分析android程序之阅读smali代码
为什么有些APK解包后没有DEX文件?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink实时电商数仓之DWS层

需求分析 关键词 统计关键词出现的频率 IK分词 进行分词需要引入IK分词器&#xff0c;使用它时需要引入相关的依赖。它能够将搜索的关键字按照日常的使用习惯进行拆分。比如将苹果iphone 手机&#xff0c;拆分为苹果&#xff0c;iphone, 手机。 <dependency><grou…

createElement, parentNode, removeChild, appendChild

1获取父节点 var childNode document.getElementById("child"); var parentNode childNode.parentNode; // 获取父节点利用dom获取元素要嵌套 引出&#xff1a;利用父子兄节点关系获取元素 标签&#xff0c;元素&#xff0c;元素节点空格&#xff0c;文本节点属性…

32个关于FPGA的学习网站

语言类学习网站 1、HDLbits 网站地址&#xff1a;https://hdlbits.01xz.net/wiki/Main_Page 在线作答、编译的学习Verilog的网站&#xff0c;题目很多&#xff0c;内容丰富。非常适合Verilog初学者&#xff01;&#xff01;&#xff01; 2、牛客网 网站地址&#xff1a;https:…

简述Redis备份策略以及对应的实现机制

引言 Redis作为高性能的内存数据库&#xff0c;数据的安全性至关重要。一旦数据丢失&#xff0c;可能会对业务造成重大影响。因此&#xff0c;备份Redis数据是每个Redis使用者都必须考虑的问题。本文将介绍Redis的备份策略以及对应的实现机制。 一、备份策略 1.1 定期备份 …

【华为OD机试真题2023CD卷 JAVAJS】测试用例执行计划

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 测试用例执行计划 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品当前迭代周期内有N个特性()需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用…

FileZilla的使用以及主动模式跟被动模式

目录 FileZilla的安装 下载路径 安装 FileZilla的基本使用 添加组 添加用户 设置权限 测试 开始测试 FileZilla的主动模式及被动模式 主动模式&#xff08;Active Mode&#xff09; 被动模式&#xff08;Passive Mode&#xff09; 思维导图 ​编辑 FileZilla的安装 下载…

【基础】【Python网络爬虫】【3.chrome 开发者工具】(详细笔记)

Python网络爬虫基础 chrome 开发者工具元素面板&#xff08;Elements)控制台面板&#xff08;Console&#xff09;资源面板&#xff08;Source&#xff09;网络面板&#xff08;Network&#xff09;工具栏Requests Table详情 chrome 开发者工具 ​ 当我们爬取不同的网站是&…

以太网转RS485通讯类库封装

最近选用有人科技的以太网转RS485模块做项目&#xff0c;设备真漂亮&#xff0c;国货之光。调通了通讯的代码&#xff0c;发到网上供大家参考&#xff0c;多多交流。 以下分别是配套的头文件与源文件&#xff1a; /*******************************************************…

软件测试/测试开发丨Pytest测试用例生命周期管理-Fixture

1、Fixture 用法 Fixture 特点及优势 1&#xff64;命令灵活&#xff1a;对于 setup,teardown,可以不起这两个名字2&#xff64;数据共享&#xff1a;在 conftest.py 配置⾥写⽅法可以实现数据共享&#xff0c;不需要 import 导⼊。可以跨⽂件共享3&#xff64;scope 的层次及…

扫雷(c语言)

先开一个test.c文件用来游戏的逻辑测试&#xff0c;在分别开一个game.c文件和game.h头文件用来实现游戏的逻辑 主要步骤&#xff1a; 游戏规则&#xff1a; 输入1&#xff08;0&#xff09;开始&#xff08;结束&#xff09;游戏&#xff0c;输入一个坐标&#xff0c;如果该坐…

MFC消息机制详细剖析

易语言程序的破解99%的时候都需要用到FF55FC5F5E这个特征码 新建一个MFC应用程序&#xff1a; 去编辑MFC的.rc资源文件来DIY窗体 静态编译的&#xff0c;把很多静态库的代码都添加进去了 &#xff0c;所以速度很慢 消息机制针对的是GUI程序&#xff08;比如窗口程序&#xf…

有道翻译web端 爬虫, js

以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…

快速部署supervisord详解

Supervisor是一个用于监控和管理进程的工具。它可以在Unix-like系统中启动、停止、重启和管理后台进程&#xff0c;确保这些进程始终保持运行状态。 yum check-update 更新yum软件包索引 yum install epel-release -y 下载eprl源 yum install supervisor -y 直接yu…

给多行文本的每行添加指定的前缀textwrap.indent()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 给多行文本的每行添加指定的前缀 textwrap.indent() [太阳]选择题 请问以下代码输出的第一行结果是&#xff1f; import textwrap text welcome to China! print("【显示】text\n&quo…

WEB 3D技术 three.js通过 GLTFLoader 导入并应用 gltf/glb 3D资源

上文 WEB 3D技术 three.js 雾 基础使用讲解我们讲了雾的基本使用方法 但是 如果我们要做一个树林 一颗一颗树去加 那真的是要累死了 我们一定是在建模软件上 建模好这样的模型 然后将模型导入到场景中 官网中搜索 GLTFLoader 在我们日常WEB开发中 用的最多的3D格式 就是 GLTF…

Linux---进程控制

一、进程创建 fork函数 在Linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程&#xff0c;原进程为父进程 fork函数的功能&#xff1a; 分配新的内存和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统的进程列表中fork返…

B+树的插入删除

操作 插入 case2的原理,非叶子节点永远和最右边的最左边的节点的值相等。 case3:的基本原理 非叶子节点都是索引节点 底层的数据分裂之后 相当于向上方插入一个新的索引(你可以认为非叶子节点都是索引),反正第二层插入160 都要分裂,然后也需要再插入(因为索引部分不需要重…

x-cmd pkg | openssl - 密码学开源工具集

目录 简介首次用户技术特点竞品分析进一步阅读 简介 OpenSSL 是一个开源的密码库和 SSL/TLS 协议实现&#xff0c;它提供了一组密码学工具和加密功能&#xff0c;用于保护数据通信的安全性。项目发展历史可以追溯到 1998 年&#xff0c;源自 Eric A. Young 和 Tim J. Hudson 开…

【后端】Docker学习笔记

文章目录 Docker一、Docker安装&#xff08;Linux&#xff09;二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台&#xff0c;主要基于Go语言构建&#xff0c;它使开发者能够将应用程序及其依赖项打包到一个轻…

java零拷贝zero copy MappedByteBuffer

目录 调用操作系统的 mmap 未使用 mmap 的文件通过网络传输的过程 使用 mmap 的文件通过网络传输的过程 使用例子 调用操作系统的 sendfile() 在 java 中的具体实现 mmap的优劣 mmap 的不足 mmap 的优点 mmap 的使用场景 对于零拷贝&#xff08;zero copy&#xff09…