Android反编译(三)之重签名
Android反编译(三)
之重签名
1、原理
1).APK签名的要点a.所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序;
b.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证;
c.数字证书都是存在有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
d.Android使用标准的java工具 Keytool 、Jarsigner 来生成数字证书,并给应用程序包签名。
2).APK签名的好处
a、应用程序升级:如果想升级应用程序,签名证书要相同,包名称要相同!b、应用程序模块化:Android 系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。
c、代码或者数据共享:Android 提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。3).APK重签名原理
a、Android系统签名主要有ROM签名和应用程序APK签名两种形式。ROM签名是针对已经生成的Android系统ROM包进行签名。应用程序APK签名是针对开发者开发的应用程序APK进行签名。
b、APK实际上是一个jar或者说是一个zip压缩文件,META-INF目录下存放的是压缩包中所有文件的签名信息,用来保证apk包的完整性和系统的安全。
c、重签名:实际上就是删除META-INF目录(删除已有签名),使用自已数据证书再次重签名。
注:APK如有签名自校验(代码有校验)需要修改其代码,非今天文章内容。
2、工具与准备工作
1).工具a.数字证书生成:keytool
JAVA自带工具 如:JDK1.7例:路径 C:\Program Files\Java\jdk1.7.0_55\bin\keytool.exeb.重新签名:jarsignerJAVA自带工具 如:JDK1.7例: 路径 C:\Program Files\Java\jdk1.7.0_55\bin\jarsigner.exec.优化APK:zipalignAndroid SDK自带工具例:路径 C:\Program Files\adt-bundle-windows-x86_64-20140321\sdk\tools\zipalign.exe2).准备工作
a.安装JDK,配置环境变量
b.安装Android SDK,配置环境变量
3、操作步骤
1)、本机
keystore数字证书
a、找现成的keystore文件
路径 C:\Documents and Settings\Findyou\.android\debug.keystore
debug.keystoreKeystore name: “debug.keystore”Keystore password: “android”Key alias: “androiddebugkey”Key password: “android”CN: “CN=Android Debug,O=Android,C=US”
b、keytool生成keystore数字证书:
(1).[CMD中执行下列命令]
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000
/*解释:keytool是工具名称,-genkey意味着执行的是生成数字证书操作,-v表示将生成证书的详细信息打印出来,显示在dos窗口中;-keystore debug.keystore 表示生成的数字证书的文件名为“ debug.keystore”;-alias androiddebugkey 表示证书的别名为“ androiddebugkey ”,可以与Keystore一样;-keyalg RSA 表示生成密钥文件所采用的算法为RSA;-validity 10000 表示该数字证书的有效期为10000天,意味着10000天之后该证书将失效**/
执行结果输入密钥库口令: android再次输入新口令: android
您的名字与姓氏是什么?
[Unknown]: Android Debug
您的组织单位名称是什么?
[Unknown]: Android
您的组织名称是什么?
[Unknown]: Android
您所在的城市或区域名称是什么?
[Unknown]: ShenZhen
您所在的省/市/自治区名称是什么?
[Unknown]: GuangDong
该单位的双字母国家/地区代码是什么? [Unknown]: CN
CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN是否正确?
[否]:Y
正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天):
CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN
输入 <androiddebugkey> 的密钥口令
(如果和密钥库口令相同, 按回车): [回车][正在存储debug.keystore](2). debug.keystore生成在CMD执行命令的目录中
2)、删除原APK签名文件
(1).ThinkDrive.apk重命名为ThinkDrive.zip,解压ThinkDrive.zip文件
(2).ThinkDrive重名名为ThinkDrive_temp(3).ThinkDrive_temp文件夹,找到META-INF,删除META-INF(4).将ThinkDrive_temp整个文件夹用zip工具,重新打包成zip压缩包,然后更改后缀为apk注意:a.进入ThinkDrive_sign文件夹内直接打包文件,不是对ThinkDrive_sign整个文件夹打包,否则会产生二级根目录)b.注意是ZIP压缩,不是RARc.可以用jar来解包,压缩包解包: jar -xvf ThinkDrive.apk -->为apk文件压缩包 jar -cvf ../ThinkDrive.apk ./ -->进入文件夹打包,不会产生二级根目录;apk生成在上一层,防止死循环
3)、APK重签名
jarsigner -verbose -keystore debug.keystore -storepass android -keypass android -signedjar Thinkdrive_signed.apk Thinkdrive_temp.apk androiddebugkey/*解释:
jarsigner是Java的签名工具-verbose参数表示:显示出签名详细信息
-keystore表示使用当前目录中的debug.keystore签名证书文件。
-storepass 密钥口令
-signedjar ThinkDrive_signed.apk表示签名后生成的APK名称,
ThinkDrive_temp.apk 表示未签名的APK,
androiddebugkey表示debug.keystore的别名
*/
4)、优化APK
zipalign -v 4 ThinkDrive_signed.apk Target.apk注:
zipalign优化的最根本目的是帮助操作系统更高效率的根据请求索引资源,将resource-handling code统一将Data structure alignment(数据结构对齐标准:DSA)限定为4-byte boundaries。
小结:通过以上四个步骤 ,最终得到的 Target.apk (名称自己可以第四步生成时自修改) 为重签名后的APK。
4、装X技巧
偶尔手工敲敲代码无所谓,需要签名的APK一多,那你就废了。你会说,网上下载现成的重签名jar啊之类的,多没意思,来自己整一个批处理。
1)、代码: [重签名.bat]@ECHO OFF REM key的名称 SET KEYSTORE_NAME=debug.keystore REM key的别名 SET KEYSTORE_ALIAS=androiddebugkey REM key的密码 SET KEYSTORE_STOREPASS=android SET KEYSTORE_KEYPASS=android REM 临时文件名或临时文件夹名 SET TEMP_PREFIX=temp_ REM 重签名后apk文件名前缀 SET RE-SIGNED=Re-signed_ FOR %%I IN (*.apk) DO ( ECHO [重签名 %%I] ECHO [创建与APK同名的文件夹] REM 创建文件夹,如果已存在则先删除 RD /S /Q 【%%I】 MD 【%%I】\%TEMP_PREFIX% REM 复制需要重新签名的apk文件到临时文件夹中 COPY %%I 【%%I】\%TEMP_PREFIX% REM 复制key到APK同名文件夹中 COPY %KEYSTORE_NAME% 【%%I】 REM 进入临时文件夹 CD 【%%I】\%TEMP_PREFIX% REM 解压APK文件 JAR -xvf %%I REM 删除复制到临时文件夹中的APK文件 DEL %%I REM 删除MANIFEST RD /S /Q META-INF REM 重新压缩成apk文件 ECHO [重新打包成APK] JAR -cvf ../%TEMP_PREFIX%%%I ./ CD .. ECHO [JARSIGNER %%I] REM 对APK包重新签名,JDK1.7需要增加参数 JARSIGNER -VERBOSE -KEYSTORE %KEYSTORE_NAME% -STOREPASS %KEYSTORE_STOREPASS% %TEMP_PREFIX%%%I %KEYSTORE_ALIAS% -KEYPASS %KEYSTORE_KEYPASS% ECHO [删除JARSIGNER临时文件] RD /S /Q %TEMP_PREFIX% REM 删除同名文件夹中复制的debug.keystore DEL %KEYSTORE_NAME% ECHO [ZIPALIGN %%I] REM 使用android的zipalign工具对apk文件进行优化 ZIPALIGN -v 4 %TEMP_PREFIX%%%I %RE-SIGNED%%%I REM 检查apk文件是否被优化 ZIPALIGN -c -v 4 %RE-SIGNED%%%I ECHO [删除ZIPALIGN临时文件] REM 删除优化前的APK文件,保留优化后的APK DEL %TEMP_PREFIX%%%I CD .. ECHO [重签名完成] %RE-SIGNED%%%I ECHO. ) PAUSE @ECHO ON2)、使用方法
(1).拷贝 xxxx.keystore 签名文件至 "重签名.bat"所在目录中
(2).拷贝需要重签名的APK文件至 " 重签名.bat"所在目录中
(3).双击运行"重签名.bat" 脚本
注:如需重签名多个APK,可全部拷贝至 " 重签名.bat"所在目录中,BAT会查找到当前目录下所有APK,全部重签名。
执行结果图:
5、问题
1)、重签名安装失败(证书问题)
检查:是否JDK1.7,如果JDK1.7签名问题,JARSIGNER需要增加两个参数。
-digestalg SHA1 -sigalg MD5withRSA2)、安装成功,运行失败
检查:a.首先需要排除重签名问题(再重签一遍安装)
b.重签再装仍有问题,检查是否程序有自签名检查,如有签名检查较为复杂。大体讲解一下思路,反编译代码为JAVA找到签名检查代码,分析逻辑,用apktool反编译,修改对应smail代码,再重新打包,签名。
Android反编译(三)之重签名的更多相关文章
- Android反编译(二)之反编译XML资源文件
Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具 apktool http ...
- 转 谈谈android反编译和防止反编译的方法
谈谈android反编译和防止反编译的方法 android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的项 ...
- Android反编译(一)之反编译JAVA源码
Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具 dex2jar http://code.go ...
- 谈谈android反编译和防止反编译的方法(转)
谈谈android反编译和防止反编译的方法(转) android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的 ...
- Android 反编译 -smali语法
前言 前面我们有说过android反编译的工具,如何进行反编译.反编译后可以得到jar或者得到smali文件.Android采用的是java语言 进行开发,但是Android系统有自己的虚拟机Dalv ...
- Android 反编译
Android 反编译 步骤:1.下载apktool 工具,这一步 主要是反编译 xml 文件. 步骤:2 把xx.smali 文件转为java 工具 (单个) 图形界面 下载dex2jar 和xj ...
- Android 反编译apk 详解
测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取) 下载 dex2jar(源码文件获取) 下载 jd-gui (源码查看) ...
- Android反编译教程
本文摘自 http://blog.csdn.net/ithomer/article/details/6727581 本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubu ...
- 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库
工欲善其事,必先利其器 本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 原文地址:http ...
随机推荐
- Linux下安装tomcat
安装tomcat之前首先安装jdk,这个看前面的帖子. 下面说centeros6.5安装tomcat7的方法: 1.将apache-tomcat-7.0.29.tar.gz文件上传到/home/zha ...
- .net 第二周学习
这周更进一步的介绍了.net,通过作业的练习,有那么一点点的成就感,相对于前端,成就感还不是很大,但是我还是会继续加油 学习.net,看着他们周末只能呆在寝室写网页,顿时我就高兴了: ...
- Python札记 -- 切片赋值
一.疑惑 今天在看<Python Cookbook>第四章Python技巧的4.7小节时,发现一段初看起来让人疑惑的代码.该小节的任务是将一个包含列表(行)的列表,转换成一个新的列表 ...
- 【转载】关于.NET里的内存泄漏
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中..Net 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉.虽然.N ...
- 初试TinyIoCContainer笔记
第一次看到TinyIoCContainer是在用NancyFx的时候,在Bootstrapper那里看到了她的影子. 那些叫Tiny的东西都挺有意思,IoC容器是我第一次遇到,于是找了些文章看了看,自 ...
- 如何参与一个 GitHub 开源项目?
最近一年开源项目特别的热,很多技术大会或论坛都以开源项目作为主题进行探讨,可见这是一种趋势.而Github作为开源项目的著名托管地,可谓无 人不知,越来越多的个人和公司纷纷加入到Github的大家族里 ...
- 开始VS 2012 中LightSwitch系列的第2部分:感受关爱——定义数据关系
[原文发表地址] Beginning LightSwitch in VS 2012 Part 2: Feel the Love - Defining Data Relationships [原文发表 ...
- Wix 安装部署教程(十六) -- 自动生成多语言文件
因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是手动操作,而且mst文件必须每次重新和新的安装包“关联”,否则中文的安装包去调用英文的资源的时候就会报类似于“类型转换 ...
- Sublime Text 2—解决中文乱码
Sublime Text 2是一个非常棒的代码及文本编辑器,绿色小巧.速度飞快,跨平台支持Win/Mac/Linux,支持32与64位,支持各种流行编程语言的语法高亮.代码补全等,有着许多其他编辑器没 ...
- DNS拾遗(二)
MX Record补充 MX记录有优先级的概念,数字越小表示优先级越高.所以一个域可以配置多个不同优先级的MX记录,如果邮件通过第一优先级记录无法递送,则采用第二优先级,以此类推. TXT Recor ...

