Android反编译(三)之重签名

Android反编译(三)

之重签名

[目录]

1、原理

2、工具与准备工作

3、操作步骤

4、装X技巧

5、问题

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.exe

b.重新签名:jarsigner

JAVA自带工具  如:JDK1.7

例: 路径  C:\Program Files\Java\jdk1.7.0_55\bin\jarsigner.exe

c.优化APK:zipalign

Android SDK自带工具

例:路径  C:\Program Files\adt-bundle-windows-x86_64-20140321\sdk\tools\zipalign.exe

2).准备工作

a.安装JDK,配置环境变量

b.安装Android SDK,配置环境变量

3、操作步骤

1)、本机

keystore数字证书

a、找现成的keystore文件

路径   C:\Documents and Settings\Findyou\.android\debug.keystore

debug.keystore

Keystore 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压缩,不是RAR

c.可以用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 ON

2)、使用方法

(1).拷贝 xxxx.keystore 签名文件至 "重签名.bat"所在目录中

(2).拷贝需要重签名的APK文件至 " 重签名.bat"所在目录中

(3).双击运行"重签名.bat" 脚本

注:如需重签名多个APK,可全部拷贝至 " 重签名.bat"所在目录中,BAT会查找到当前目录下所有APK,全部重签名。

执行结果图:

5、问题

1)、重签名安装失败(证书问题)

检查:是否JDK1.7,如果JDK1.7签名问题,JARSIGNER需要增加两个参数。

-digestalg SHA1 -sigalg MD5withRSA

2)、安装成功,运行失败

检查:a.首先需要排除重签名问题(再重签一遍安装)

b.重签再装仍有问题,检查是否程序有自签名检查,如有签名检查较为复杂。大体讲解一下思路,反编译代码为JAVA找到签名检查代码,分析逻辑,用apktool反编译,修改对应smail代码,再重新打包,签名。

Android反编译(三)之重签名,布布扣,bubuko.com

时间: 2024-10-16 14:20:57

Android反编译(三)之重签名的相关文章

转 谈谈android反编译和防止反编译的方法

谈谈android反编译和防止反编译的方法 android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的项目就需要知道怎样防止反编译和反编译他人的项目来学习. 2.3版本以上在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”可以对代码进行混淆,反编译后是很难看懂的. 2.3之前的SDK版本也没关系,把上面的proguard

Android反编译和二次打包实战

作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短.今天就来总结一下Android反编译和二次打包的一些知识.首先声明本文的目的是为了通过例子讲解反编译和二次打包的原理和方法,继而作为后续讲解防止二次打包和App安全的依据,并不是鼓励大家去重新打包别人的App,盗取他人劳动成果. 本文首先介绍几种Android反编译工具的使用,然后实现在不需要知道源代码的情况下,仅通过修改反编译得到的smali文件实现修改apk逻辑功能的目的. And

谈谈android反编译和防止反编译的方法(转)

谈谈android反编译和防止反编译的方法(转) android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的项目就需要知道怎样防止反编译和反编译他人的项目来学习. 2.3版本以上在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”可以对代码进行混淆,反编译后是很难看懂的. 2.3之前的SDK版本也没关系,把上面的progu

ubuntu下android反编译

最近在研究android的逆向工程,看到网上有不少的教程在反编译android源码,但是大多数都是在windows平台下做的.今天,我将简单介绍ubuntu下反编译android源码. 一.工具介绍 1.反编译源码工具: dex2jar:将apk包中的classes.dex文件反编译成jar包. jd-gui:将编译好的jar包用该软件打开直接显示为java源码. 2.打包.签名等工具 apktool:资源文件获取,可以提取出图片文件和布局文件进行使用查看,也就是俗称的解包和打包. sign-m

android 反编译 混淆过程中注意事项

此文源自组内成员分享的PPT,其他成员的文档由于没有得到授权,暂不公开. 本文命令如果没有特殊注明,均为windows 7环境. 本文只涉及大概的知识点,不涉及具体的细节,需要注意. 反编译 apktool 可反编译资源文件(xml,点九图)以及代码为smali代码 使用命令:apktool d xxx.apk output_filepath dex2jar 反编译dex文件(解压apk获得的classes.dex)为jar 使用命令:dex2jar xxx.dex jd-gui 查看jar文件

Android反编译工具介绍与简单实用方法

Android反编译工具介绍与简单实用方法 Android反编译的目的无非就是为了看到APK的xml.资源和代码: 得到代码的方式:直接解压APK文件 --> 得到classes.dex文件 --> 使用 dex2jar classes.dex classes.jar生成jar文件 --> [可选的解压jar文件] -->使用XJad或者JDCompiler查看源代码 得到XML的方式: 方式1:直接解压APK文件 --> 通过axmlprinter工具查看XML文件(这种方

Android反编译

在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看.下面是我参考了一些文章后简单的教程详解. (注:反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平.) 测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取)  下载      

如何防止Android反编译apk,爱加密进行安卓加密保护!

近年来,针对网购.交友网站,发送伪装成"样品"或"私照"的钓鱼.木马链接类诈骗逐渐增多:套取个人信息类诈骗手法有所升级,如借卡转账.机票退订等,要求提供银行卡卡号.身份证号及短信验证码:大家熟悉的网络买卖,买家可能"易容",网上的店铺也可能是"僵尸".尤其是近日<E天下>头条报道<小心!不明链接勿乱按>后,引来众多读者反馈:骗子是怎样伪装的呢?常用的伎俩有哪些?现在,爱加密就来为大家一一揭晓,帮助大家在

Android学习心得(10) --- MAC下Android反编译(2)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 在前一章我们学习了基本的ndk-build脚本参数用法. 这一章再次学习一下反编译. 1.简介 这次分析的是一个很简单的程序,算是反编译入门的一个入门教程 主要学习一下工具的使用,下面是从网上下载下来的测试样本 测试样本EX_05_01_.apk 链接: http://pan.baidu.com/s/1sjOIXJn 密码: 5uq4 2.首先,使用dex2jar和jd-gui查看 参考:Android学习心得(8) --- M