apk文件结构解析一

2023-11-08

Apk文件用WINRAR压缩软件解压缩后,如下图所示:主要是三个文件(lib、META-INF、res)和三个文件夹(AndroidManifest.xml、classes.dex、resources.arsc)
这里写图片描述
用工具展开可以看到如下所示的文件结构(文件夹中的内容可能不一致,这里我举得例子是一个JNI的Demo)
这里写图片描述
下面再详细介绍各个文件或者文件夹的作用或内容


  1. META-INF文件夹:META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在Android平台上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk 包后,如果想要替换里面的一幅图片,一段代码,或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。

MENIFEST.MF:
遍历apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Base64进行编码。具体代码见这个方法:
private static Manifest addDigestsToManifest(JarFile jar)
关键代码是

    for (JarEntry entry: byName.values()) {
     String name = entry.getName();
     if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
         !name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) &&
         (stripPattern == null ||!stripPattern.matcher(name).matches())){
         InputStream data = jar.getInputStream(entry);
         while ((num = data.read(buffer)) > 0) {
         md.update(buffer, 0, num);
       }
       Attributes attr = null;
       if (input != null) attr = input.getAttributes(name);
       attr = attr != null ? new Attributes(attr) : new Attributes();
       attr.putValue("SHA1-Digest", base64.encode(md.digest()));
       output.getEntries().put(name, attr);
    }
}

之后将生成的签名写入MANIFEST.MF文件。关键代码如下:

    Manifest manifest = addDigestsToManifest(inputJar);
    je = new JarEntry(JarFile.MANIFEST_NAME);
    je.setTime(timestamp);
    outputJar.putNextEntry(je);
    manifest.write(outputJar);

打开MANIFEST.MF

Manifest-Version: 1.0 Created-By: 1.0 (Android)

Name: res/drawable-xhdpi/abc_ab_bottom_solid_light_holo.9.png
SHA1-Digest: 98aPD0Xqx5q4D+vZs6Jb7lXg2Go=

Name: res/drawable-hdpi/abc_list_divider_holo_light.9.png SHA1-Digest:
PoxeeFE1gxgKYYjKMfN1ri2qqEo=

Name: res/drawable-xhdpi/abc_textfield_search_right_default_holo_light
SHA1-Digest: /UIFeo6oXwL7NSIU/486wBQ0Xls=

对前一步生成的Manifest,使用SHA1-RSA算法,用私钥进行签名。


CERT.SF

Signature-Version: 1.0 SHA1-Digest-Manifest:
5C1qwho6z1GTLX93lyVpN/8J7gI= Created-By: 1.0 (Android)

Name: res/drawable-xhdpi/abc_ab_bottom_solid_light_holo.9.png
SHA1-Digest: K4HrHjcFfdlvbiNQU1qsErUvoic=

Name: res/drawable-hdpi/abc_list_divider_holo_light.9.png SHA1-Digest:
KRfdYM/Dt5MyxkMw3p5XG9MQl0k=

Name: res/drawable-xhdpi/abc_textfield_search_right_default_holo_light
.9.png
SHA1-Digest: kkTKqzaczWYCFJkGha/OJn2Vq7Y=

注:红色粗体SHA1-Digest-Manifest是MANIFEST.MF整个文件的SHA1并base64编码的结果。


CERT.RSA
该文件主要用来保存公钥及其相关信息
这里写图片描述

文章参考:
http://blog.csdn.net/zengyangtech/article/details/5735071
http://drops.wooyun.org/mobile/4296
http://my.oschina.net/blackylin/blog/207480

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

apk文件结构解析一 的相关文章

  • IDA工具安装、分享

    往期推荐 ARM处理器寻址方式 ARM指令集 ARM汇编语言程序结构 Android与ARM处理器 IDA工具被称之为是世界顶级的交互汇编 掌握IDA工具界面上的快捷功能 导航条主界面功能以及汇编窗口常用快捷键的使用 实战分析 了解ARM指
  • 【安卓逆向】分析某人直播.apk登录组包

    安卓逆向交流QQ群692903341 1 打开 人人 apk 进入登陆页面 输入用户名和密码 并用fiddler软件抓包 fiddler抓包如下图所示 红框所示为登录时向服务器发达的包 下面我们要分析这里面每个字段的产生 2 打开ddms
  • 混淆技术研究-OLLVM混淆-控制流平坦化(FLA) - WIP

    简介 控制流平坦化通过将程序中的条件分支语句转化为等价的平铺控制流来实现 通常 这包括将原始的分支语句 如if语句 switch语句 中的每个分支提取出来 并将它们放置在一系列连续的基本块中 然后使用一个状态变量或标志来选择要执行的基本块
  • 【安卓逆向】爱加密so层静态分析

    因为这个是比较久远的apk 所以高版本是运行不起来的 学习的目的是了解一下以前的加固方式 也是划水 哈哈 下一次更新 我这边也打算写一篇关于小x书APP的协议分析 感兴趣的同学可以关注一下 应该就是在这几天更新 有问题也可以加我vx3481
  • ARM指令集

    往期推荐 ARM汇编语言程序结构 Android与ARM处理器 反射调用Java层方法 反射获取Java层字段的值 ARM指令集是指计算机ARM操作指令系统 在ARM中有两种方式可以实现程序的跳转 一种是跳转指令 另一种是直接向PC寄存器中
  • 调试与反调试--关键文件检测

    往期推荐 模拟器检测 文件检测 签名验证 资源文件混淆 一 运行文件检测程序 1 使用adb命令 将filecheck课件push到手机目录下的data local位置 如下图所示 2 运行filecheck后 提示killed 如下图所示
  • Android-黑客技术-实现类似电脑版软件破解版

    首先先看看什么叫做Android的黑客技术效果 游戏 修改正版apk代码 实现破解免支付买道具 应用 修改添加自己的信息 和应用市场应用看起来一样 最近趁着清闲 学了段时间的Android逆向技术 发现了新世界 所以现在就算手机app也是可
  • Java—类的加载概述

    1 1 类的加载概述 当程序要使用某个类时 如果该类还未被加载到内存中 则系统会通过加载 连接 初始化三步来实现对这个类进行初始化 1 加载 是将class文件读入内存 并为之创建一个Class对象 任何类被使用时系统都会建立一个Class
  • ARM处理器寻址方式

    往期推荐 ARM指令集 ARM汇编语言程序结构 Android与ARM处理器 反射调用Java层方法 寻址的概述 寻址是指寻找寄存器里存放的数据或者是地址里存放的数据并加以使用 寻址有以下八种方式 1 立即寻址 2 寄存器寻址 3 寄存器移
  • HOOK startActivity

    往期推荐 HOOK框架 动态代理 HOOK框架 静态代理 实战案列分析 Crakeme01 实战 AliCrackme 需要相关资料的朋友 可以 加入此处即可打包获取 Hook的英文含义是钩子 你可以理解为用钩子把要Hook的对象勾过来 然
  • Smali文件详解

    往期推荐 Java层逆向 Dalvik指令集 Java层逆向分析 Dalvik字节码 修改资源去广告 修改包名实现分身 篡改Apk名称 图标 Smali是Dalvik VM内部执行的核心代码 是Dalvik自己的语法规范 在反编译出的代码中
  • 基于Xposed hook 实时监测微信消息的三种策略

    本文以微信版本6 7 3为例进行分析有hook 大部分做微信机器人的话 首先要实时抓取微信的消息 在这里展示三种方式对微信的消息进行hook 1 基于UI层拉取加载进行监听 2 基于微信dao层调用的保存进行监听 3 基于数据库的插入保存进
  • 【安卓逆向】360加固-脱壳修复

    最近花了一些时间学习逆向脱壳 这方面一直投入的时间比较少 样本经过某加固宝进行加固 这里简单记录一下脱壳过程和思路 感谢某数字公司对安全加固的无私贡献 让我有机会小小的提高一下这方面的技能 安卓逆向交流学习qq 3251901516 vx
  • apk文件结构解析一

    Apk文件用WINRAR压缩软件解压缩后 如下图所示 主要是三个文件 lib META INF res 和三个文件夹 AndroidManifest xml classes dex resources arsc 用工具展开可以看到如下所示的
  • 实战案列分析:Crakeme01

    往期推荐 实战 AliCrackme 实战案列 AntiDebug self debugging反调试 轮循检测技术 需要样本的朋友 可以 加入此处即可打包获取 先运行软件 观察程序特点 步骤与第八节实战相似 都是运用IDA静态调试与动态调
  • Java反射机制及Method.invoke详解

    这篇文章主要介绍了Java反射机制及Method invoke详解 本文讲解了JAVA反射机制 得到某个对象的属性 得到某个类的静态属性 执行某对象的方法 执行某个类的静态方法等内容 需要的朋友可以参考下 JAVA反射机制 JAVA反射机制
  • IDA动态调试动态注册native函数流程

    安卓 手游逆向交流群963612891 IDA动态调试动态注册native函数流程1 编写目的 记录IDA动态调试步骤 2使用工具 逆向工具 IDA 7 0 Jadx 运行环境 Nexus 5 Android 4 4 3 原字符串信息 4
  • 【逆向】使用CE查找Android中变量的偏移

    0x00 准备工作下载Cheat Engine以及调试器服务端 https www cheatengine org index php 夜神模拟器 https www yeshen com 下载安装贪婪洞窟 梦境模式 http a 4399
  • IDA工具介绍

    往期推荐 IDA工具安装 分享 ARM处理器寻址方式 ARM指令集 ARM汇编语言程序结构 昨天给大家概括性的了解了IDA工具 今天分享IDA工具的实际应用 一 IDA打开so文件 1 首先打开IDA工具 进入选项界面 直接选中Go选项 如
  • 模拟器检测

    往期推荐 文件检测 签名验证 资源文件混淆 apk保护策略 Java代码混淆 模拟器检测的就是指通过检测确认软件 手游等不能运行在模拟器上面 比如一个游戏 它能够在模拟器上实现批量刷金币或者是其他功能 但模拟器又无法启动起来 在这种情况下

随机推荐

  • Python: for 循环

    一 For 语法结构和基于数字 range 的循环 for x in range 5 print hello 二 基于列表list 元组tuple的循环 numbers1 1 2 3 4 5 numbers2 6 7 2 5 name zh
  • c++ 数据结构——树

    1 树概念 暂略 2 树的相关题目 2 1 leetcode 104 Maximum Depth of Binary Tree Definition for a binary tree node struct TreeNode int va
  • 谈谈软件行业面试

    原贴地址 http blog csdn net demowolf article details 5598966 我今天第一天正儿八经写博客 文思如泉涌 得多说几句废话 工作这么多年 面试无数次 从刚开始的技术雏儿 到现在的自我感觉良好 面
  • Java中间件(1)--分布式系统&中间件从入门到精通(五)

    上篇文章说了 当业务数据量大的时候 可以考虑业务和数据分离 当还解决不了的时候 可以考虑把数据库读写分离 缓存 还可以考虑把表垂直拆分 水平拆分 大型网站架构 2 分布式系统 中间件从入门到精通 四 中间件为软件应用提供了操作系统所提供的服
  • OpenStack2

    OpenStack2 1 DashBoard 2 私有网络 构建完整云主机 3 块存储服务 1 DashBoard 安装软件包 编辑配置文件 重启服务 网页成功访问使用网页 创建网络 换到 admin用户 切换到demo用户 创建云主机 创
  • Visual Studio 2010 部署QT4.8.4

    做GUI界面的设计时 目前已不再拘泥于VS的MFC框架 有很多开源的工具 本例以QT与VS2010的整合为例 演示环境搭建 后续将会用QT做VT的开发工作 第一步 下载QT和QT与VS的插件 在VS2010下以及结合VTK的情况 网络上经网
  • 让 Home 页面离开的时候保持原来的状态

    思路 1 用 keep alive 让页面不要销毁
  • 对有验证码的后台网页进行爆破-captcha-killer-modified

    对有验证码的后台网页进行爆破 captcha killer modified 实例 以pikachu靶场为目标 攻击目标url http xxxx pikachu master vul burteforce bf server php xx
  • PAT B1072 开学寄语

    算法思想 用数组标记应要查缴的物品mark 物品编号 1 在输入学生信息的同时判断该物品是否要查缴 因格式问题用了另一个数组保存该学生要查缴的物品编码 最后再输出该学生的名字和查缴物品编号 后来看了柳神的代码 不用这么麻烦 直接在输出前加括
  • HDU2085核反应堆

    Time Limit 1000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 22891 Accepted Submission
  • PID控制原理说明与图解

    PID是比例 积分 微分的简称 一般常用于温度 速度等标量的控制 应用PID控制的系统存在对这些数值进行感测的传感器 又存在一个设定的目标值 这一种系统称为闭环控制系统 closed loop control system 系统中三个数值的
  • 工作能力构架框架图——我对工作的理解

    工作架构图 最近对工作内容进行了一次review 归纳如下 做简单地分享 job层 job层是我们最容易理解的一层 即我们平时的工作title 可能是销售 售前 产品等等 那么做产品的人能不能做售前呢 我想 肯定可以 因为在人力资源市场上
  • 解决eclipse出现launch failed,binary not found 的问题

    解决eclipse出现launch failed binary not found 的问题 仅作为解决问题的记录 问题描述 1 之前一直用eclipse写C 文件 后面学了java就用eclipse写了一些 java文件 但是偶然一次想要再
  • ValueError: column index (256) not an int in range(256)

    pandas 保存为xls时最大列为256 改为保存csv格式可避免该限制 解决方法 pd DataFrame in shp pre to csv 各区站点 file 14 17 csv
  • 软件开发管理参考网站

    BDD http en wikipedia org wiki Behavior Driven Development Scrum http zh wikipedia org zh Scrum UserCase http www hudong
  • Kubernetes 资源管理:最大化集群性能

    今天是 DevOps云学堂 与你共同进步的第 54天 Kubernetes 资源管理是部署和管理容器化应用程序的一个关键方面 它允许管理员控制系统不同部分之间计算资源的分配 例如CPU 内存和存储 有效的资源管理可确保应用程序获得正确运行所
  • Latex 字体的设置

    一 字体族的设置 1 说明 1 字体命令 textrm Roman Family 在花括号内的字体都是Roman Family 字体 2 字体声明 rmfamily Roman Family 该命令下面的字体都是是Roman Family字
  • Vim几种跳转方式

    Vim几种跳转方式 ps 以下时我常用的一些跳转指令 用于参考和复习记忆 还有一些后续会更新 文件内跳转 移动光标 普通模式下左h 右l 上k 下j 可以使用数字 hlkj 实现跳跃式移动 字符间跳转 跳转到当前字符的前面 普通模式下i 跳
  • CesiumJS三维案例

    WebGL近几年越来越被人们所关注 但是二三维开发难度也比普通web要高出许多 不管我们是在在开发或者是学习过程中 往往需要耗费大量的时间去查阅资料和研究官方案例 让本来就非常紧张的而宝贵的精力卷到了不关紧要的地方 而大多二三维的包 ope
  • apk文件结构解析一

    Apk文件用WINRAR压缩软件解压缩后 如下图所示 主要是三个文件 lib META INF res 和三个文件夹 AndroidManifest xml classes dex resources arsc 用工具展开可以看到如下所示的