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 爬虫 xpath 存储到数据库

参考

我是张先生 1289

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

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

Android 6万+

智能座舱架构与芯片- (10) 音频篇 下

若将有限个 量化样值的绝对值从小到大依次排列,并对应地依次赋予一个十进制数字代码(例如,赋予样值0的十进制数字代码为0),在码前以“+”、“-”号为前缀,来 区分样值的正、负,则量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流,即十进制数字信号。如果声学密封不牢,来自内部结构的噪声可能到达传感器,两个传感器之间的泄漏可能降低BF算法的性能。未来,随着汽车电动化的普及,传统的ANC降噪所针对的发动机噪音已经不复存在,而路噪问题将越发明显,因此,全新的RNC主动路噪消减技术将会有一个更为宽广的市场。

joanna_xiao的博客 3838

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

低速信号设计之 LPC 篇

摘要:LPC总线作为服务器低速信号设计的关键技术,在BIOS芯片连接、Super I/O芯片控制和嵌入式管理等方面发挥着重要作用。其采用33MHz时钟频率和4位并行传输机制,理论速率达16.5MB/s。设计时需重点关注布线长度(建议<10cm)、信号完整性(45°走线、合理层间隔离)和过孔优化等要点。典型应用案例表明,通过规范设计可确保在工业控制等复杂环境中稳定工作。LPC总线凭借低成本、低引脚数和良好兼容性,仍是服务器低速外设连接的重要解决方案。

qq_16237389的博客 1164

安卓设备安全相关技术

当前安卓设备使用的加密方案是基于Soc中一块可写入的rom实现,称为熔丝,其结果不可逆。 1、secureboot 2、AVB(Android Verify Boot) 3、dm-verity(device mapper) 4、keymaster 5、crypto 6、rpmb(replay private memory block) 7、TEE(Trust execute environment) 8、SELinux .........

weixin_43797328的博客 4838

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

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

WGH100817的博客 245

产品经理-面试题目--持续更新

答:面试官,你好,我叫XXX,来自于XXXX,我系统的学习过软件开发,也主动的积累了不少产品方面的实战经验,在学习期间,我自己独立的完成了2个深度项目,一个是仿抖音的短视频APP全流程设计,另外一个是电商后台系统的模块,通过这些项目,我不仅熟练使用Axure等工具做出高保真原型图和清晰的产品框架,也形成了数据驱动和用户优先的思维习惯,另外,我也注重拓展自己的能力边界,拿到了CAIE人工智能证书,我希望能把AI能力融入到产品场景,提升体验和效率,我非常喜欢产品工作带来的创造性和逻辑性,希望有机会加入贵公司。

m0_63966958的博客 957

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

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

gitblog_00239的博客 675

机器学习面试笔试求职必背!八股文(1/5)

算法工程师,技术软件类求职机器学习必背八股文 更多算法/业务/HR面等笔试题面试题 —— >个性签名自取! 1. 特征工程: 1.1 为什么要对特征做归一化处理: Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术。特征间的单位(尺度)可能不同,比如身高和体重,比如摄氏度和华氏度,比如房屋面积和房间数,一个特征的变化范围可能是[ 1000 , 10000 ] [1000, 10000][1000,10000],另一个特征的变化范围可能是[ −.

大厂offer宝典 1万+

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1410

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

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

gitblog_02061的博客 946

manimgl安装

安装manimgl

happytree001的博客 707

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

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

gitblog_00585的博客 903

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

gitblog_00809的博客 1103

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

gitblog_01050的博客 428

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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、付费专栏及课程。

余额充值