我的编程空间,编程开发者的网络收藏夹
学习永远不晚

第四章 常见的 Android 文件格式(三)(AndroidManifest.xml)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

第四章 常见的 Android 文件格式(三)(AndroidManifest.xml)

文章目录AndroidManifest.xmlAndroidManifest.xml 文件的格式AXML 文件格式AXML 文件的修改 AndroidManifest.xml 其中存放了 APK 的大量配置信息:软件名称、图标、主题、包名、组件配置等 合理、安全地配置组件是安全开发中最重要的一课 AndroidManifest.xml 文件的格式 采用 XML 文本格式,在开发阶段,所有的配置信息都可直接以可视化的方式编辑。Crackme0201 的内容:

所有的配置都属于 manifest 标签,与程序配置相关的部分属于 Android 标签,程序中使用的四大组件也在这里声明 App Manifest 的详细信息可在 Android 的 API Guides(https://developer.android.google.cn/guide/topics/manifest/application-element )中找到
android:allowBackup="true"
android:allowBackup 允许系统在进行备份操作时备份程序的应用数据,典型的操作是在终端执行 adb backup 命令,或点击手机设置界面上的“备份操作”按钮。对数据安全比较敏感的话,可设置为“false”
android:supportsRtl="true"
这个标签的作用:让 APK 支持 RTL(Right-to-Left)视图。将此值设为“true”,并将 targetSdkVersion 的值设为 17 及以上,即可开启 RTL 视图支持 AXML 文件格式 AS 在编译 APK 时,会将 AndroidManifest.xml 处理后打包进去。打包进去的 AndroidManifest.xml 被编译成二进制格式的文件。解压 APK 后,用文本编辑器打开它,会发现内容是乱码。这个打包后的 AndroidManifest.xml 称“AXML”,其格式称“AXML 文件格式” APK 用 AXML 而非纯文本格式 XML 存放数据,主要目的应是解决 APK 加载时的性能问题。在 Android 设备内存资源与能耗极其有限的情况下,二进制的 AXML 在分析处理速度和内存占用方面都比纯文本的 XML 有明显优势。但 AXML 的内容不能直接显示,因此,逆向分析 APK 时,对其格式有所了解,才能知道它原来的内容 Android 官方没明确给出 AXML 的二进制布局规范,可通过阅读 APK 打包流程和系统加载 APK 的代码掌握它的文件格式。在 Android 系统源码文件 frameworks/base/include/androidfw/ResourceType.h 中列举了 AXML 使用的大部分数据结构和常量定义 学习 AXML 文件格式过程中,在了解数据结构的同时,可使用 010 Editor 辅助分析 AXML 文件格式模板可通过 010 Editor 的模板库来安装,如下:
接着是 ResXMLTree,它用于表示 XML 的具体内容。他是一个线性的 XML 字节数据集合,由多个 XML 节点数据组成,每个 XML 节点数据由基本结构体 ResXMLTree_node 和扩展结构体组成 ResXMLTree_node 定义:
struct ResXMLTree_node {
    struct ResChunk_header header;
    uint32_t lineNumber;
    struct ResStringPool_ref comment;
};
对第一个节点来说,header 的 type 字段必须是 RES_XML_START_NAMESPACE_TYPE,表示这是一个 namespace 开始节点。与此对应的是 ResXMLTree 部分的最后一个 ResXMLTree_node,它的 header 的 type 字段必须是 RES_XML_END_NAMESPACE_TYPE,表示 namespace 节点的结束。lineNumber 字段表示节点数据在 AndroidManifest.xml 中的行号,占用 4 字节。comment 字段表示节点数据关联的注释内容,它的结构是 ResStringPool_ref,定义:
struct ResStringPool_ref {
    uint32_t index;
};
index 字段是字符串在字符串池中的偏移索引。若节点数据没有对应的注释,由 comment 字段取值 -1。对类型为 RES_XML_START_NAMESPACE_TYPE 与 RES_XML_END_NAMESPACE_TYPE 的节点数据来说,它的扩展结构体用 ResXMLTree_namespaceExt 表示,定义:
struct ResXMLTree_namespaceExt {
    struct ResStringPool_ref prefix;
    struct ResStringPool_ref uri;
};
prefix 字段表示 namespace 的前缀,对 AXML 来说,它的值通常为“android”。uri 字段表示 namespace 的 URI,对 AXML 来说,它的值通常为“http://schemas.android.com/apk/res/android” 在 RES_XML_START_NAMESPACE_TYPE 和 RES_XML_END_NAMESPACE_TYPE 类型的节点数据中间是一系列以 RES_XML_START_ELEMENT_TYPE 开头且以 RES_XML_END_ELEMENT_TYPE 结束的成对的 ResXMLTree_node 节点数据。这些节点数据虽然可嵌套,但必须成对出现,与 XML 的语法格式一样 RES_XML_START_ELEMENT_TYPE 类型的节点数据表示一个节点 TAG 的开始。它除了可包含多个子 TAG,还可包含多个属性值。它的扩展结构部分用 ResXMLTree_attrExt 表示,定义:
struct ResXMLTree_attrExt {
    struct ResStringPool_ref ns;
    struct ResStringPool_ref name;
    uint16_t attributeStart;
    uint16_t attributeSize;
    uint16_t attributeCount;
    uint16_t idIndex;
    uint16_t classIndex;
    uint16_t styleIndex;
};
ns 和 name 字段分别表示节点数据所在的 namespace 与节点的名称。attributeStart 字段表示属性的初始地址,它的位置是相对于本结构体的文件偏移。attributeSize 字段表示单个属性的大小。attributeCount 字段表示属性的总个数。idIndex、classIndex、styleIndex 字段分别表示 id 属性、class 属性、style 属性的索引(以 1 为下标,为 0 表示空值) 若 attributeStart 字段指向的偏移量不为 -1,且 attributeCount 字段指定的个数大于 0,接下来就是具体的属性数据。属性数据由 ResXMLTree_attribute 表示,定义:
struct ResXMLTree_attribute {
    struct ResStringPool_ref ns;
    struct ResStringPool_ref name;
    struct ResStringPool_ref rawValue;
    struct Res_value typedValue;
};
ns 和 name 字段分别表示属性所在的 namespace 与属性的名称。rawValue 字段表示该属性的原始字符串值。typedValue 字段的类型是 Res_value。Res_value 是一个复杂的类型,可存放各种类型的属性值。Res_value 定义如下,data_type 字段表示可存储的数据类型
struct Res_value {
    uint16_t size;
    uint8_t res0;
    uint8_t dataType;
    typedef uint32_t data_type;
    data_type data;
};
size 字段描述了属性占用的总字节数。res0 字段的值目前必须是 0。dataType 字段表示数据的类型,它的取值可以是如下形式:
enum {
    TYPE_NULL        = 0x00,
    TYPE_REFERENCE    = 0x01,
    TYPE_ATTRIBUTE    = 0x02,
    TYPE_STRING        = 0x03,
    TYPE_FLOAT        = 0x04,
    TYPE_DIMENSION    = 0x05,
    TYPE_FRACTION    = 0x06,
    TYPE_DYNAMIC_REFERENCE    = 0x07,
    TYPE_DYNAMIC_ATTRIBUTE    = 0x08,
    TYPE_FIRST_INT    = 0x10,
    TYPE_INT_DEC    = 0x10,
    TYPE_INT_HEX    = 0x11,
    TYPE_INT_BOOLEAN    = 0x12,
    TYPE_FIRST_COLOR_INT    = 0x1c,
    TYPE_INT_COLOR_ARGB8    = 0x1c,
    TYPE_INT_COLOR_AGB8        = 0x1d,
    TYPE_INT_COLOR_ARGB4    = 0x1e,
    TYPE_INT_COLOR_AGB4        = 0x1f,
    TYPE_LAST_COLOR_INT        = 0x1f,
    TYPE_LAST_INT            = 0x1f
};
data 字段中存放具体的数据,根据 dataType 指定的不同的数据类型,它的值的类型也不同。如,当 dataType 为 TYPE_STRING 时,data 字段中存放的是字符串的索引,前面的 rawValue 字段指向的也是字符串的索引值 对 RES_XML_END_ELEMENT_TYPE 类型的节点来说,它表示要给节点 TAG 的结束,它的扩展结构用 ResXMLTree_endElementExt 表示,定义:
struct ResXMLTree_endElementExt {
    struct ResStringPool_ref ns;
    struct ResStringPool_ref name;
};
ns 和 name 字段同前面的 ResXMLTree_attrExt 结构体所对应的字段,分别表示属性所在的 namespace 和属性的名称 至此,AXML 的格式介绍完毕。完整分析一个 AXML 的内容,关键在于解析后面一系列以 RES_XML_START_ELEMENT_TYPE 开始且以 RES_XML_END_ELEMENT_TYPE 结束的 ResXMLTree_node 节点数据 AXML 文件的修改 部分 APK 保护工具及一些厂商的加固方案利用 Android 系统解析 AXML 的漏洞,在编译 APK 时构造畸形的 AXML,是系统能正常安装 APK,但无法运行 ApkTool 等反编译工具。这时就要对 AXML 进行修改。最直接的修改方式:配合使用 010 Editor 及 AXML 模板查看文件格式,找到异常部分进行修改 对一些已出现的 AXML 加固方案,可用现成的工具修改: AmBinaryEditor:https://github.com/ele7enxxh/AmBinaryEditor AndroidManifestFix:https://github.com/zylc369/AndroidManifestFix
作者:zlmm741


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

第四章 常见的 Android 文件格式(三)(AndroidManifest.xml)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

第四章 常见的 Android 文件格式(三)(AndroidManifest.xml)

文章目录AndroidManifest.xmlAndroidManifest.xml 文件的格式AXML 文件格式AXML 文件的修改 AndroidManifest.xml 其中存放了 APK 的大量配置信息:软件名称、图标、主题、包名、
2022-06-06

逆向基础-------常见的Android文件格式

记笔记,写总结的意义就在于,它们是你掌控这些知识的证明,即使有一天你记不住它们了,但是一翻笔记,知识又能很快回到你脑子里。 一、库文件 1.1 jar包 包含一系列class文件的压缩包,class文件是经过编译后的Java代码集合。也叫"
2022-06-06

常见的压缩文件格式有哪些

常见的压缩文件格式包括:1. ZIP格式(.zip):最常见的压缩格式之一,可在多个操作系统和软件中使用。2. RAR格式(.rar):一种常用的高压缩比格式,可将文件压缩到较小的大小。3. 7Z格式(.7z):一种高压缩比的文件格式,通常
2023-06-11

大数据中常见的文件存储格式以及hadoop中支持的压缩算法

大数据文件存储格式及压缩算法文件存储格式:CSV:简单,易处理JSON:复杂数据结构Parquet和ORC:列式存储,高效压缩Avro:模式演进,处理异构数据压缩算法:Snappy:快速,低压缩比GZIP:通用,较高压缩比BZip2:高压缩比,慢速LZO:轻量级,可调节LZ4:超快,低压缩比选择依据:文件格式:数据类型、处理需求、存储成本压缩算法:数据类型、处理需求、性能目标
大数据中常见的文件存储格式以及hadoop中支持的压缩算法
2024-04-08

Android TextView实现带链接文字事件监听的三种常用方式示例

本文实例讲述了Android TextView实现带链接文字事件监听的三种常用方式。分享给大家供大家参考,具体如下:/** * TextView实现文字链接跳转功能 * @description: * @author ldm * @date
2023-05-30

大数据中常见的文件存储格式以及hadoop中支持的压缩算法

在大数据中常见的文件存储格式有:1. 文本文件(Text File):以纯文本的形式保存数据,例如CSV格式或JSON格式。2. 序列文件(Sequence File):一种二进制格式,用于存储键值对,适合于Hadoop的MapReduce
2023-10-11

Win10原生支持视频外挂独立字幕文件 格式包括常见的SRT、SSA、ASS

Windows 10接连放出新的测试预览版,内置的媒体播放器Windows Media Player却似乎一直都是那个样子,但其实微软对于多媒体方面是非常重视的,改进也都是内在的。 此前微软已经证实,Windows 10将原生支持MKV格式
2023-06-13

漏刻有时数据可视化大屏常见问题(9):mysql数据库.sql文件制作自动安装格式的解决方案

在数据可视化制作的过程中,数据库结构总是在不断的调整和变化中。为了给程序开发者更好的操作体验,简化操作流程,需要在程序测试完毕打包版本的时候,对数据库进行格式操作,以便完成初始化的自动安装。现就如何实现数据库自动安装格式的步骤整理如下: 导出数据 进入phpM
漏刻有时数据可视化大屏常见问题(9):mysql数据库.sql文件制作自动安装格式的解决方案
2018-07-09

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录