signapk流程分析

七、recovery ota升级包签名生成/校验 最近一直有两个疑问 升级包签名的规则和签名文件具体的位置,所以大概看了下签名流程并整理出来 大概理解了下 1.如何签名 2.如何校验 一.相关整理 首先要大概知道的两个内容 1.CMS数字签名 参考:https://www.ibm.com/developerworks/cn/java/j-lo-cms-ticketbasesso/ 大概理解为 签名阶段:取数据的hash 使用私... 阅读详情

一点笔记

转载请注明出处


1. 对jar包中的各文件进行sha1hash,生成manifest对象;
   除(
   META-INF/MANIFEST.MF
   META-INF/CERT.SF
   META-INF/CERT.RSA
   META-INF/com/android/otacert
   "^META-INF/(.*)[.](SF|RSA|DSA)$"
   )外
   
2. 将manifest对象中描述的各文件copy到新jar包中;


3. 如果-w整包签,则将 证书.x509.pem 复制到 META-INF/com/android/otacert;
   并在manifest对象中增加META-INF/com/android/otacert的SHA1摘要;
   
4. 将manifest对象写入新jar包中META-INF/MANIFEST.MF文件;


5. 生成签名文件META-INF/CERT.SF;
   内容生成方式:
     对manifest中(每一项文件名称、sha1摘要)做sha1摘要, 生成新的Manifest对象
 for (entry : OriManifest) {
SHA1(
"Name: entryName\r\n" ## e.g.:(Name: res\xml\xx.xml\r\n)
"SHA1-Digest=ORI-SHA1-Digest\r\n" ## "SHA1-Digest=tIoIjlV7AhAroOM3aDWl+6FaX+Q=\r\n"
"\r\n"
)
 }
 
6. 生成META-INF/CERT.RSA;
   PKCS#7格式签名/加密信息:(对CERT.SF进行SHA1withRSA,并将证书.pem附在其中);
   
7. 如果-w整包签,则在jar/zip文件
   找到'End of central directory signature'
   (一般zip如果无Comment length时,EOCD标记距尾部22Bytes)
   
   [End of central directory record]格式
Offset Bytes Description[18]
0 4End of central directory signature | 核心目录结束标记(0x06054b50)
4 2Number of this disk                | 当前磁盘编号
6 2Disk where central directory starts | 核心目录开始位置的磁盘编号
8 2Number of central directory records on this disk | 该磁盘上所记录的核心目录数量
10 2Total number of central directory records | 核心目录结构总数
12 4Size of central directory (bytes) | 核心目录的大小
16 4Offset of start of central directory, 
       relative to start of archive | 核心目录开始位置相对于archive开始的位移
20 2Comment length (n) 注释长度
22 nComment 注释内容


   
   在其后写入Archive Comment: 
   --------------------------------------------------------------------------------------------------------
   |       2B       |       Comment_Length                  |      2B         |   2B     |       2B       |
   --------------------------------------------------------------------------------------------------------
   | Comment_Length | ‘signed by SignApk\0’ + (PKCS#7_SIG)  | signature_start | \xff\xff | Comment_Length |
   --------------------------------------------------------------------------------------------------------
   signature_start = Comment_Length - len('signed by SignApk') - 1
   
   (PKCS#7_SIG)是对对整个zip包(从ZIP头到<EOCD.CommentLength>之前)数据生成sha1,
   再对sha1用私钥加密生成签名放在公钥证书尾部
   整个Comment为PKCS#7格式(类似于CERT.RSA,只不过是对整个zip包数据做签名)
   
   OTA包校验时也是先对ZIP包数据生成sha1,然后从ZIP尾部EOCD中取出Comment中的
   最后256(2048bits)签名数据(SHA1WithRSA),用公钥解开再和sha1对比,一致则验证通过
   // The 6 bytes is the "(signature_start) $ff $ff (comment_size)" that
   // the signing tool appends after the signature itself.
   RSA_verify(pKeys+i, eocd + eocd_size - 6 - 256, 256, sha1)

   

========================================================================================

系统APK验证流程:


PackageManagerService :: collectCertificatesLI
PackageParser :: collectCertificates
 -- if ((flags&PARSE_IS_SYSTEM) != 0) 
       // If this package comes from the system image, then we
       // can trust it...  we'll just use the AndroidManifest.xml
       // to retrieve its signatures, not validating all of the files.
   for system apk only,  just verify AndroidManifest.xml, otherwise, verify all entry except "META-INF/"  


JarFile jarFile = new JarFile(pkg);
JarEntry je = jarFile.getJarEntry("AndroidManifest.xml");
jarFile.getInputStream(je)


  -- JarFile.getInputStream(ZipEntry) line: 378
  -- JarVerifier.readCertificates() line: 258
  -- JarVerifier.verifyCertificate(String) line: 330
  -- JarVerifier.verify(Attributes, String, byte[], int, int, boolean, boolean) line: 405
     1. Use .SF to verify the mainAttributes of the manifest
2. Use .SF to verify the whole manifest.
3. associate signatures with .SF and entries of manifest.
 
  -- JarFile.getInputStream(ZipEntry) line: 395
  -- JarVerifier.initEntry(String) line: 213
     1. init entry digest method and it's hashbytes.

read inputStream

  -- BufferedInputStream.read(byte[], int, int) line: 304
  -- JarFile$JarFileInputStream.read(byte[], int, int) line: 119
  -- JarVerifier$VerifierEntry.verify() line: 121
<<< 
byte[] d = digest.digest();
if (!MessageDigest.isEqual(d, Base64.decode(hash))) {
throw invalidDigest(JarFile.MANIFEST_NAME, name, jarName);
}
verifiedEntries.put(name, certificates);
>>>>
1. hash content of jarEntry, cmp the digest with hashbytes already saved.
  if they're identical, associate entry name with certificates.


Certificate[] certs = je.getCertificates();
  -- JarEntry.getCertificates() line: 108
  -- JarVerifier.getCertificates(String) line: 422
 <<< 
 Certificate[] verifiedCerts = verifiedEntries.get(name);
 >>>

------------------------------------------------------------------------------------------------------------------

Source snippet:
String pkg = "/mnt/asec/com.speedsoftware.rootexplorer-1/pkg.apk";
JarFile jarFile = new JarFile(pkg);
JarEntry je = jarFile.getJarEntry("AndroidManifest.xml");
byte[] readBuffer = new byte[8192];
try {
// We must read the stream for the JarEntry to retrieve
// its certificates.
InputStream is = new BufferedInputStream(jarFile.getInputStream(je));
while (is.read(readBuffer, 0, readBuffer.length) != -1) {
// not using
}
is.close();

Certificate[] certs = je.getCertificates();
Log.e(TAG, certs.toString());
} catch (IOException e) {
Slog.w(TAG, "Exception reading " + je.getName() + " in "
+ jarFile.getName(), e);
} catch (RuntimeException e) {
Slog.w(TAG, "Exception reading " + je.getName() + " in "
+ jarFile.getName(), e);
}
} catch (IOException e2) {
e2.printStackTrace();
}
 

深入Android APK签名机制:从SignApk源码解析V1/V2/V3签名原理与实战 数字签名是保障软件完整性与来源可信的核心安全机制,其原理基于非对称加密算法,通过私钥签名、公钥验证来确保数据未被篡改。在Android生态中,APK签名机制经历了从V1到V4的演进,技术价值在于平衡安全强度、验证性能与系统兼容性。V1签名基于JAR格式,在META-INF目录内生成校验文件;V2/V3签名则引入独立的APK签名块,提供全文件保护并支持密钥轮换。应用场景覆盖应用发布、系统更新、安全审计及逆向分析。本文聚焦Android构建工具链中的核心组件SignApk,通过剖析其源码实现,详解签名流程的字节 阅读详情

相关推荐

深入理解Android APK签名机制:SignApk类源码分析

Android应用必须在发布前进行数字签名,这个过程称为APK签名。Android签名机制确保了应用的完整性和来源的可信性。在Android平台上,有多种签名方法,但主要通过JDK中的jarsigner工具或Android SDK中的apksigner工具来实现。签名主要分为两个步骤:生成密钥库和签名APK。开发者首先需要创建一个密钥库(keystore),然后使用密钥库中的密钥对APK进行签名。密钥库中包含了一个或多个密钥,每个密钥都有自己的别名、密码和密钥参数。

weixin_35756637的博客 935

Android签名与校验过程详解

目 录  一、签名与校验原理概要    2 1、数字签名简介    2 2、CMS简介    2 二、signapk工具签名过程    4 三、OTA校验过程    6    Android签名与校验过程详解 一、签名与校验原理概要 1、数字签名简介 在日常生活中,签名通常被做为个人身份的凭证。当一份文件上有某个人的签名时,便相信此份文件确实由此

~山之歌~ 1万+

Android Apk签名源码 SignApk.java

Android生成的Apk签名的源码SignApk.java

SignApk用法

1.signapk.jar执行方式 java -jar signapk.jar xxx.x509.pem xxx.pk8 xxxxx.apk xxxxx-signed.apk (xxx是证书名,xxxxx是所签apk的名字)    2.相关文件路径 编译后的JAR包位置android\out\host\linux-x86\framework\signapk.jar 证书文件位置

michaelpp的专栏 2086

SignApk签名工具

SignApk签名工具,适用于update签名! 1,解压文件 2,将需要签名的rom放置该文件夹,双击SignerScript.bat文件即可

Python实战:5分钟搞定固定翼无人机三自由度仿真(附完整代码)

本文提供了一个基于Python的固定翼无人机三自由度仿真快速实现方案。通过面向对象设计,封装了核心运动学模型,并对比了欧拉法与龙格-库塔法两种积分方法。文章附有完整实例代码,帮助算法工程师和研究人员在5分钟内搭建轻量级仿真环境,用于快速验证控制律、路径规划等核心算法逻辑。

docker7nomad的博客 748

Android中如何修改系统时间(应用程序获得系统权限)

在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用。        本来以为就没有办法

Android 6万+

RK3588多路MIPI摄像头采集与WiFi低延迟传输实战指南

本文详细介绍了基于RK3588平台实现多路MIPI摄像头同步采集并通过WiFi进行低延迟传输的完整实战方案。文章深入剖析了从V4L2驱动配置、多线程采集、环形缓冲区设计到UDP网络传输优化的核心技术,旨在帮助开发者在工业检测、智能安防等场景下构建高并发、高实时性的视频流系统,实现端到端延迟控制在100毫秒以内的目标。

tensor9flow的博客 786

BootChart在Android中的应用 && 签名工具SignApk.jar使用 && shareduserid的使用

bootchart是一个用于linux启动过程性能分析的开源软件工具,在系统启动过程自动收集CPU占用率、进程等信息,并以图形方式显示分析结果,可用作指导优化系统启动过程。android中有集成bootchart源码,路径为system/core/init/bootchart.c。 (1)在android源码system/core/init/目录执行: mm INIT_BOOTCHART=tru

zhandoushi的专栏 2072

抖音用户评论和ID的采集方法

随着5G时代的普及,各大运营商的套餐纷纷推出,使得流量成本进一步降低。同时5G线路高宽带、低延迟的技术特性和手机普及,让视频用户访问量快速增加。 由于大量的视频工具和拍摄APP的提供,让短视频的拍摄、制作包括发行都变得更加简单便捷,越来越多的普通人可以投入视频创作,创造了更丰富的互联网内容,视频作者从视频推广中能获取粉丝和推广收益。 目前抖音就是目前最重要的短视频平台之一,要及时获取上面的用户评论和ID,需要结合爬虫代理实现采集方案,下面的代码就能快速采集相关信息: package htmlunit; i

ssbt_2020的博客 6787

AD9361 官方例程

文章目录一、官方资料1.1 介绍1.2 下载 和 使用1.3 相关资料二、步骤2.1 在Vivado中构建HDL2.2 在SDK中构建No- OS总结 一、官方资料 1.1 介绍 HDL参考设计介绍:AD9361 HDL Reference Designs 无操作系统介绍:AD9361 No-OS Software 1.2 下载 和 使用 HDL下载:Download HDL 在Vivado中构建HDL:Building HDL No-OS下载:Download No-OS 1.3 相关资料 AD

weixin_44630490的博客 3万+

Android签名机制之---签名过程详解

一、前言又是过了好长时间,没写文章的双手都有点难受了。今天是圣诞节,还是得上班。因为前几天有一个之前的同事,在申请微信SDK的时候,遇到签名的问题,问了我一下,结果把我难倒了。。我说Android中的签名大家都会熟悉的,就是为了安全,不让别人修改你的apk,但是我们真正的有了解多少呢?所以准备两篇文章好好介绍一下Android中签名机制。在说道Andro...

WGH100817的博客 245

STM32F103待机模式原理与低功耗实战指南

待机模式是嵌入式系统实现超低功耗的核心机制,其本质是通过切断内核域电源(VDD/VDDA)实现微安级静态电流,区别于睡眠/停止模式的状态保持特性。原理上依赖电源域隔离、WKUP引脚事件唤醒与RTC备份域协同,技术价值在于支撑电池供电设备长达数年续航。典型应用场景包括物联网传感器节点、智能电表、便携医疗设备等对功耗极度敏感的终端。工程落地需严格遵循GPIO模拟输入配置、唤醒标志清除、备份域解锁等关键步骤,避免因漏电或误唤醒导致实测电流超标。本文以STM32F103为例,深入解析待机模式的硬件基础与HAL库实现

weixin_32999557的博客 66

终极APK逆向分析实战:图形化工具快速入门指南

APKToolGUI是一款功能强大的图形化APK逆向分析工具,它为开发者和安全研究人员提供了直观的操作界面,无需复杂命令行即可完成APK的解码、编译、签名等一系列操作。本文将带你快速掌握这款工具的使用方法,轻松入门APK逆向分析领域。 ## 📋 核心功能一览 APKToolGUI集成了多种实用功能,主要包括以下模块: - **Decode**:解码APK文件,提取资源和代码 - **Bui

gitblog_00239的博客 675

Rerender A Video 技术浅析(四):跨帧约束

时间一致性是指在视频处理过程中,保持相邻帧之间内容、风格和运动的平滑过渡,避免出现视觉上的不连续性或伪影。时间一致性跨帧约束模块的主要目标是在视频增强、风格迁移等任务中,确保处理后的视频在时间维度上保持一致性和稳定性。该模块主要通过以下几种方式实现时间一致性:1.时序损失(Temporal Loss):最小化相邻帧之间的差异,确保帧间内容的平滑过渡。2.循环一致性损失(Cycle Consistency Loss):确保帧间转换的一致性,避免出现风格漂移。3.

m0_75253143的博客 1480

智能筛选栏 SmartFilterBar 全面解析与实战指南

SmartFilterBar 把复杂的检索界面“模板化”,让开发者聚焦业务逻辑与后端数据质量,而非 UI 小细节。通过精准运用 CDS 注解与 OData 元数据,它能在几毫秒内拼装出专业级筛选体验;结合事件钩子与控制配置,又足以满足极端个性化需求。拥抱 SmartFilterBar,意味着在 Fiori 生态中以最少代码赢得最快价值交付——这正是现代企业应用开发追求的极致效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 404

告别命令行恐惧:APKToolGUI带你三步玩转APK逆向分析

你是否曾面对黑乎乎的终端窗口感到手足无措?是否被那些复杂的命令行参数搞得晕头转向?当你想要探索一个Android应用的内部结构时,是否因为技术门槛而望而却步?现在,这些问题都将成为过去式。APKToolGUI,这款专为Windows平台设计的图形化APK逆向工具,将带你轻松走进Android应用的世界,无需任何命令行经验,就能完成专业级的APK分析和修改。 ## 场景引入:从困惑到清晰的转变

gitblog_02061的博客 946

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3812

APKToolGUI高效逆向分析:图形化工具完整使用指南

APKToolGUI是一款功能强大的Android APK逆向分析图形化工具,它让复杂的APK反编译、修改和重新编译过程变得简单直观。无论你是Android开发者需要调试应用,还是安全研究人员分析应用结构,这款工具都能大幅提升你的工作效率。通过简洁的图形界面,APKToolGUI集成了apktool、signapk、zipalign和baksmali等多个核心工具,无需记忆繁琐的命令行参数即可完成

gitblog_00585的博客 903

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

APKToolGUI:3步搞定Android应用逆向分析的图形化神器

APKToolGUI是一款专为Android应用逆向分析设计的图形化工具,它将复杂的命令行操作转化为直观的点击操作,让开发者、安全研究人员和Android爱好者能够轻松完成APK解码、编译、签名等核心任务。无需记忆繁琐的命令行参数,只需几个简单点击,即可深入探索Android应用内部结构。 ## ✨ 核心亮点:为什么选择APKToolGUI? ### 一体化逆向分析平台 APKToolGUI集

gitblog_00809的博客 1103

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

APK逆向分析完整实战指南:使用APKToolGUI图形化工具快速入门

你是否遇到过想要修改Android应用但被复杂的命令行工具劝退的情况?或者作为安全研究人员需要对APK进行逆向分析,却苦于繁琐的操作流程?今天我要为你介绍一款强大的图形化APK逆向分析工具——APKToolGUI,它能让你轻松完成APK解码、编译、签名等操作,无需记忆复杂命令! APKToolGUI是一款专为Android开发者和安全研究人员设计的图形化界面工具,它集成了apktool、sign

gitblog_01050的博客 428

AOSP介绍

清华大学AOSP镜像站 AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror Android源码学习方法 参考:想学习android源码,该如何组织? - 知乎

DreamWendy 2986

Android apk 签名原理

[原文地址]http://www.cloudchou.com/android/post-379.html [原理参考]白话数字签名 ; APK签名原理 ; Android APK 签名比对  [应用参考] Android应用程序签名详解 ; java中Keytool的使用总结 ; Android中的签名机制 前言 这些天有人问我关于APK或者ROM签名的原理,因为先

lisanyilisanyi的博客 683

完整指南:如何使用APKToolGUI图形化工具轻松进行Android APK逆向分析

你是否曾想深入了解Android应用的内部结构,却因复杂的命令行工具而却步?APKToolGUI正是为简化这一过程而生的完美解决方案。这款免费开源工具为Android APK逆向分析提供了直观的图形界面,让开发者、安全研究人员和爱好者能够轻松探索、修改和重建APK文件,无需记忆繁琐的命令行参数。 ## 项目概述与核心价值 APKToolGUI是一个基于C#开发的Windows桌面应用程序,它封

gitblog_00858的博客 421
上一篇: win7 64bit下chrome无法滚动、卡死
下一篇: 识别Andriod APK签名证书类型
皮鲁
博客等级 码龄23年 44粉丝 73原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值