Android系统视角下对APK的分析(1)- 静态分析APK文件

news2024/11/16 21:32:27

声明

  • 以Android手机用户角度来看,安装各式各样的APP,基本就是从应用市场上 “搜索->下载->安装” 三连。而对Android系统来说,这就是个大工程了,因为对Android系统来说APK是“外来户”,如何安装它、有限制地支持它的运行、如何防着它干坏事等问题就来了。
  • 写此专栏的起因是为了给客户在定制的Android系统中实现 大型APK快速安装的功能
  • 本专栏就来从Android系统的角度来分析下APK的整个生命周期(安装-运行-卸载),包含对APK的静态/动态分析、PackageManagerService、pm命令、PackageInstaller、Installd
  • 此篇代码基于LineageOS 14.1(Android 7.1.1),参考一些博客和书籍,不方便逐一列出,仅供学习、知识分享。

1 APK的文件结构

  Android 应用均是以 APK 文件格式进行发布和安装的。APK 文件同时包含应用程序的代码和资源,包括应用程序的 manifest 文件。它们还可以包含一个代码签名文件。APK 文件格式是 JavaJAR 的一种扩展格式,当然也是广为流行的 ZIP 文件格式的扩展格式,可以使用 ZIP 格式的压缩工具对其进行解压。如下是一个典型 APK 文件解压后的内容:

pedro@x86:$ tree -L 2
.
├── AndroidManifest.xml										APP属性定义文件
├── classes2.dex											Java源码编译后的代码文件
├── classes.dex
├── asserts													声音、字体、网页....资源
├── lib														应用中调用到的库
│   ├── armeabi
│   ├── arm64-v8a
├── META-INF												APK的签名文件(*.RSA、*.SF、*.MF 文件)
│   ├── androidx.activity_activity.version
│   ├── ...省略...
│   ├── androidx.viewpager2_viewpager2.version
│   ├── androidx.viewpager_viewpager.version
│   ├── CERT.RSA
│   ├── CERT.SF
│   ├── com
│   └── MANIFEST.MF
├── res														APP中使用到的资源目录
│   ├── anim												动画资源
│   ├── animator
│   ├── animator-v21
│   ├── anim-v21
│   ├── color												颜色资源
│   ├── color-v23
│   ├── drawable											可绘制的图片资源
│   ├── drawable-hdpi-v4
│   ├── drawable-ldrtl-hdpi-v17
│   ├── drawable-ldrtl-mdpi-v17
│   ├── drawable-ldrtl-xhdpi-v17
│   ├── drawable-ldrtl-xxhdpi-v17
│   ├── drawable-ldrtl-xxxhdpi-v17
│   ├── drawable-mdpi-v4
│   ├── drawable-v21
│   ├── drawable-v23
│   ├── drawable-v24
│   ├── drawable-watch-v20
│   ├── drawable-xhdpi-v4
│   ├── drawable-xxhdpi-v4
│   ├── drawable-xxxhdpi-v4
│   ├── interpolator
│   ├── interpolator-v21
│   ├── layout												页面布局文件
│   ├── layout-land
│   ├── layout-sw600dp-v13
│   ├── layout-v21
│   ├── layout-v26
│   ├── layout-watch-v20
│   ├── mipmap-anydpi-v26
│   ├── mipmap-hdpi-v4
│   ├── mipmap-mdpi-v4
│   ├── mipmap-xhdpi-v4
│   ├── mipmap-xxhdpi-v4
│   ├── mipmap-xxxhdpi-v4
│   └── xml													应用属性配置文件
└── resources.arsc											编译后的资源文件,如 strings.xml

  APK 中的 AndroidManifest.xml 文件中注册着 APK 所有的重要信息(四大组件、包名、META等),通过分析AndroidManifest.xml 更有助于我们了解整个应用的架构。APK 解压后的几个重要文件,classes.dex 文件、AndroidManifest.xml文件、so 文件(c/c++代码文件,存在JNI的情况下会有此文件 )、resources.arsc ( 资源文件)。

2 APP的种类

  Android 应用程序开发使用 Java 语言,若还使用 NDK 的话还需要 C/C++ 进行JNI调用。目前,市面上也存在着多种 Android 应用开发的语言。比如:PhoneaGap 提供使用 HTML5+JavaScript 进行开发,Cocos2dX 也是提供 C/C++ 语言进行跨平台开发等。

目前主流应用程序开发方式大体分为3类(如下图所示):

  • Web App (网页 App )
  • Hybrid App (混合App)
  • Native App(原生App)。
    在这里插入图片描述

2.1 原生 APP

  基于 Google 的 SDK 使用 Java 语言或 C/C++语言进行开发,称为Native App。Native App 指的是原生程序,一般依托于操作系统,有很强的交互,是一个完整的App,可拓展性强,需要用户下载安装使用。

  • 优点:打造完美的用户体验;性能稳定;操作速度快,上手流畅;访问本地资源(通讯录,相册);设计出色的动效,转场;拥有系统级别的贴心通知或提醒;用户留存率高。
  • 缺点:分发成本高(不同平台有不同的开发语言和界面适配);维护成本高(例如一款 App 已更新至V4 版本,但仍有用户在使用 V2、V3版本,需要更多的开发人员维护之前的版本 );更新缓慢,根据不同平台,提交-审核-上线等不同的流程,需要经过的流程较复杂。

2.2 Web APP

  采用 Html5 语言写的 App,不需要下载安装,类似于现在所说的轻应用,是生存在浏览器中的应用,可以理解为触屏版的网页应用。当然,也有些应用是将网页再通过Android SDK打包成APK文件的形式上传到市场上的。主要开发方式就是使用的HTML5+JavaScript,使用 WebView 作为本地接口进行开发,其架构如下图所示。

  • 优点:开发成本低;更新快;更新无需通知用户,不需要手动升级;能够跨多个平台和终端。因为开发与使用成本都比较低,所以很多巨头公司都推出了自己的 WebApp 搭建平台,又称为轻应用。
  • 缺点:临时性的人口,无法获取系统级别的通知、提醒、动效等用户留存率低,设计受限制诸多,体验较差。
    在这里插入图片描述

2.3 混合 APP

  半原生半 Web 的混合类App,需要下载安装,看上去类似 Native App,但只有很少的 UI WebView,访问的内容是 Web。常见的有新闻类App、视频类 App,普遍采取的是Native的框架、Web 的内容。
  Hybrid App 也包括使用其他语言(C#、JavaScript)进行开发的 App。使用第三方语言进行开发的原理基本都是将其编译为 so 文件,再通过JNI的方式调用其逻辑。

3 Android 代码签名

  Android 为何需要代码签名? 原因通常是:为了 完整性 和 可靠性。在执行任何第三方程序之前,你希望确保该程序没有被篡改(完整性),并且该程序确实由它所声称的创建者所创建(可靠性)。AOSP 的 build/ 目录中包含一个叫 signapk 的Android专用工具。
  Android 代码签名机制是基于Java JAR 签名机制,所以它跟许多代码签名方案一样,使用公钥加密和 X.509 证书。实际上,代码签名证书必须由一个信任平台 CA 颁发。虽然有很多颁发证书的 CA,然而仍然很难获取一个受所有目标设备信任的证书。Android 非常简单地解决了这个问题:它不关心证书的内容和签发者。因此你的证书不需要必须由 CA 颁发,实际上所有 Android 里使用的代码签名,均是自签名的。
  签名验证过程,既验证代码是否被篡改,同时又验证签名确实由所预期的密钥生成但是存在一个问题,代码签名不能直接解决代码签名者(软件发布者)能否被信任的问题。通常建立信任关系的方法是,要求代码签名者持有数字证书,并且将其附加到被签名的代码中去。验证者决定是否信任,可以基于一种信任模型(例如 PKI或信任网),或者具体案例具体对待。
  代码签名的另一个问题是,它不能解决被签名的代码是否确定是安全的

4 DEX文件

  Dex文件是Android上的可执行文件,由Java 虚拟机JVM编译后再由 Android 中的虚拟机 Dalvik 所编译后而成。
在这里插入图片描述

5 so文件

  Android平台的底层就是 Linux 系统,而 Linux 系统原本就是使用 C/C++语言的。只是Android在上面使用了一个 Dalvik/ART 虚拟机才使得应用程序的开发使用 Java语言。虚拟机 Dalvik/ART 本身支持JNI编程方式。
  NDK(Native Development Kit) 就是为了 “Java+C” 开发而提出来的工具库,使得在使用 C/C++ 开发时能够保证程序的兼容性、调试性与调用 API 的方便性。使用 NDK 进行应用程序开发也能够避免掉 Java 中的一些不足:

目的说明
代码的保护APK中的Java代码很容易被反编译、阅读和篡改,而对C/C++开发出来 so库进行反汇编难度较大
可以方便地使用现存的开源库大部分现存的开源库(OpenCV、OpenGL等)都是用 C/C++代码编写的
提高程序的执行效率将要求高性能的应用逻辑使用 C开发,从而提高应用程序的执行效率
便于移植用 C/C++写的 so 库可以方便地在其他的入式平台上再次使用

6 APK逆向工程

  APK的逆向破解也是个大学问,我工作不涉及这个,所以就不研究了。

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

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

相关文章

【用户认证】密码加密,用户状态保存,cookie,session,token

相关概念 认证与授权 认证(authentication )是验证你的身份的过程,而授权(authorization)是验证你有权访问的过程 用户认证的逻辑 获取用户提交的用户名和密码根据用户名,查询数据库,获得完…

redis知识复习

redis知识复习 redis基础知识redis的认识一. 非关系型数据库 与 传统数据库 的区别二. 安装redis并设置自启动三. 熟悉命令行客户端四.熟悉图形化工具RDM redis的命令与数据结构一. 数据结构介绍二. redis通用命令(熟练掌握) redis的Java客户端一. Jedis…

文心一言 VS 讯飞星火 VS chatgpt (38)-- 算法导论5.4 2题

二、假设我们将球投入到b个箱子里,直到某个箱子中有两个球。每一次投掷都是独立的并且每个球落入任何箱子的机会均等。请问投球次数期望是多少? 文心一言: 这是一个典型的鸽巢原理(Pigeonhole Principle)问题。假设每次投球时&…

2023年上半年系统分析师下午真题及答案解析

试题一(25分) (试题一为必答题,试题二~五选答两题) 某软件公司拟开发一套汽车租赁系统,科学、安全和方便的管理租赁公司的各项业务,提高公司效率,提升利用率。注册用户在使用系统进行车辆预约时需执行以下操作:(a)用…

从0-1一起学习live555设计思想之二 RTSP交互过程

流媒体服务系列 文章目录 流媒体服务系列前言一、OPTION二、DESCRIBE三、SETUP四、PLAY总结前言 本篇文章通过代码去分析rtsp交互过程与工作原理。由于live555的继承关系太过复杂,所以做了个图简单记录一下与h264文件传输相关的类继承关系。 一、OPTION OPTION比较简单,就…

【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

ARM学习(22)断点认识以及调试

笔者来聊聊断点以及断点的调试 1、断点原理 断电的原理一般分为两种,插入断点指令或者利用硬件调试寄存器进行断点。 前者程序如果在RAM(SRAM、DDR)上,则调试器可以直接在断点地址处插入断点指令,例如BKPT&#xff0…

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情,必须要有扎实的计算机理论基础,才能看到深层次的本质东西。 …

家用电器-空调制冷、制热、除霜、除湿、换新风的基本原理及实现讲解

目录 一、空调历史 二、空调的作用 三、空调类型 四、基本原理 4.1 制冷过程 4.2 制热过程 4.3 除霜过程 4.4 除湿过程 4.5 换气过程 五、电路控制系统 六、核心部件 七、基本指标 1)气候类型 2)额定制冷量 3)能效比 八、市场…

4年功能庸庸碌碌,进阶自动化测试拿到了24k,测试之路不再平凡...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 手工测试如何进阶…

多业务聚合查询设计思路与实践

文章目录 [toc] 1.需求2.方案2.1 方案架构图2.2 选用flink-cdc的原因 3.实践3.1 环境准备3.3 es集群搭建3.4 flink1.14.0环境搭建3.5 准备sql和jar包3.5.1[创建mysql的flink用户并授权](https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc…

【树形DP+直径思想】代码源每日一题div1 三进制循环

三进制循环 - 题目 - Daimayuan Online Judge 题意: 思路: 有点像树的直径 回顾一下我们是怎么求直径的:维护根节点到其子树上的点的最大距离和次大距离,然后答案就是统计所有结点的次大值最大值 的 最大值 这道题也是一样的&a…

C盘爆满时的几个救命无害清理技巧

其实网上也有很多清理C盘的方法 但是很多就是为了弄成空间 不讲原理 也不计后果 很可能坑惨小伙伴 可以看到 我电脑的C盘都已经读红条了 非常危险 对了 可能有些朋友的电脑上没有此电脑的选项 我们可以在桌面上右键选择 个性化 找到 主题 并选择 向下拉 找到 桌面图标设置 …

经验总结:13 条自动化测试框架设计原则!

1.代码规范 测试框架随着业务推进,必然会涉及代码的二次开发,所以代码编写应符合通用规范,代码命名符合业界标准,并且代码层次清晰。特别在大型项目、多人协作型项目中,如果代码没有良好的规范,那么整个框…

微服务之负载均衡

Informal Essay By English I wish the students of the college entrance examination can win the gold toad and win the title of the gold list 参考书籍:“凤凰架构” 负载均衡(load balance) 负载平衡是指在一组后端服务器&#xf…

《计算机网络——自顶向下方法》精炼——4.4.1-4.4.2

敬教劝学,建国之大本;兴贤育才,为政之先务。——《朱舜水集。劝学》 文章目录 IPv4编址接口IP地址子网 无类别域间路由选择(CIDR)获取一块地址获取主机地址网络地址转换 IPv4编址 接口 主机或路由器与物理链路的边界称作接口。一…

深度学习卷积神经网络CNN之ResNet模型网络详解说明(超详细理论篇)

1.ResNet背景 2. ResNet论文 3. ResNet模型结构 4. ResNet优缺点 一、ResNet背景 ResNet 在2015 年由微软研究院提出的一种深度卷积神经网络结构,在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)中取得了冠军(分类…

python - kubernetes中grpc服务健康检查实现

概述 kubernetes本身不支持gRPC健康检查,本文记录使用 ‘grpc-health-probe’ 实现grpc服务的健康检查 ‘grpc-health-probe’,这是 Kubernetes 原生的健康检查 gRPC 应用程序的方法 官方参考文档:https://kubernetes.io/zh-cn/blog/2018/1…

45--Django-项目实战-全栈开发-基于django+drf+vue+elementUI企业级项目开发流程-纯手工安装部署和docker一键部署

前期准备: 购买服务器,公网地址访问 服务器有多种选择,阿里云,腾讯云,华为云(可以免费试用几个月) 买阿里云就当成你去电脑市场组装了一台电脑。阿里云按时间计费(账户余额要大于100)。 购买流程: 搜索云服务器 开始创建你的云服务器 按量付费:用多少扣多少 地域…

ORACLE PL/SQL编程总结(一)

目录 1.1 SQL与PL/SQL 1.2 PL/SQL的优点或特征 1.3 PL/SQL 可用的SQL语句 1.4 运行PL/SQL程序 2.1 PL/SQL块 2.2 PL/SQL结构 2.3 标识符 2.4 PL/SQL 变量类型 2.5 运算符和表达式(数据定义) 2.6 变量赋值 2.7 变量作用范围及可见性 2.8 注释 2.9 简单例子 3.1 条件…