Android反编译之重签名

2024-02-13 23:38

本文主要是介绍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.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=brotherland-joymore.keystore

 REM key的别名

 SET KEYSTORE_ALIAS=brotherlan-joymore

 REM key的密码

 SET KEYSTORE_STOREPASS=bljmjm

 SET KEYSTORE_KEYPASS=bljmjm

 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反编译之重签名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/706935

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。