Apk去签名校验详解

Android-APK:为何你的应用老是被破解,该如何有效地做签名校验 /** 做普通的签名校验 */ private boolean doNormalSignCheck() { String trueSignMD5 = “d0add9987c7c84aeb7198c3ff26ca152”; String nowSignMD5 = “”; try { // 得到签名的MD5 PackageInfo packageInfo = getPackageManager().getPackageInfo( getPackageName(), PackageManager.GET_SIG 阅读详情
AI摘要

本文介绍了一种用于防止重打包的签名校验技术,并详细解析了其破解方法,包括修改context、使用hook技术和直接修改so文件。

  某些apk为了防止重打包,使用了签名校验。所以在破解的时候我们需要破解签名校验。在定位签名校验位置时常用的关键词有sign,signature,checkSign,signCheck,getPackageManager,getPackageInfo,verify,same等。
  java层签名校验代码示例:
 1 //原签名信息
 2 private static final String SIGNATURE = "478yYkKAQF+KST8y4ATKvHkYibo=";
 3 private static final int VALID = 0;
 4 private static final int INVALID = 1;
 5 
 6 public static int checkAppSignature(Context context) {
 7     try {
 8         PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES);
 9 
10         for (Signature signature : packageInfo.signatures) {
11             byte[] signatureBytes = signature.toByteArray();
12             MessageDigest md = MessageDigest.getInstance("SHA");
13             md.update(signature.toByteArray());
14             
15             final String currentSignature = Base64.encodeToString(md.digest(), Base64.DEFAULT);
16 
17             Log.d("REMOVE_ME", "Include this string as a value for SIGNATURE:" + currentSignature);
18 
19             //compare signatures
20             if (SIGNATURE.equals(currentSignature)){
21                 return VALID;
22             };
23         }
24     } catch (Exception e) {
25         //assumes an issue in checking signature., but we let the caller decide on what to do.
26 
27     }
28     return INVALID;
29 }

    最近遇到一个进行了签名校验的apk,它是在客户端获取签名信息然后在服务器端进行签名比对的,而且签名的获取是在native代码中实现的。这种签名校验的破解思路一般是在sd卡中保存一个原apk包,修改apk路径,让程序获取原apk的签名信息。修改办法一般有三种,下面一一介绍。

(一)在java层修改context进行破解

  首先安装apk,启动DDMS查看log信息:
 
 
 
 
 
根据这个“verifyHashByC”这个字符串猜测跟签名校验有关系,于是在java层搜索verifyHashByC,没有找到对应的log打印处,只发现同名的native函数调用:
 
 
 
 
 
 
猜测此log打印信息是在so中,于是找到该native函数对应的so加载处,发现加载的是libAppVerify.so这个动态库:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
用ida打开libAppVerify.so,搜索verifyHashByC,在VerifyHash_BySha函数中发现了log日志打印的代码:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
光看函数名称VerifyHash_BySha就知道是通过sha算法验证Hash,但是这是不是用于签名校验的呢,利用ida的交叉引用查看函数调用关系,发现这个函数在VerifyHash(_JNIEnv *, char *, char const*, int)函数中被调用。而VerifyHash则是由前面提到的native函数verifyHashByC来调用的。
 
 
 
 
 
VerifyHash函数先获取应用包名,然后调用GetApkMFData函数:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
在该函数中获取应用路径,然后解压应用安装包,读取里面的MANIFEST.MF文件内容,然后再进行签名比对:
 
 
 
 
 
 
 
  获取apk路径的示例代码如下:
 1 private static String getApkPath(String pkgName) {  
 2     PackageManager pm = mContext.getPackageManager();  
 3     ApplicationInfo pi = null;  
 4     try {  
 5         pi = pm.getApplicationInfo(pkgName,PackageManager.GET_UNINSTALLED_PACKAGES);  
 6         if(pi != null)  
 7             return pi.sourceDir;  
 8         else   
 9             return null;  
10     } catch (NameNotFoundException e) {  
11         e.printStackTrace();  
12         return null;  
13     }  
14 }  

sourceDir保存了apk的完整路径:

 

 
 
 
接下来,解压apk,读取MANIFEST.MF文件:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
下图为MF文件中的内容,与上图中内存单元的内容一致:
 
 
 
 
 
 
 
 
 
 
 
 
 
  分析了这么多,如何破解呢?通过前面的分析可知在so中获取apk包的路径的流程是:
 
 
 
 
传入context,通过ApplicationInfo的sourceDir获取到apk路径,如果我们修改sourceDir让它始终指向原apk,那么我们的目的就达到了。
通过反编译java代码,找到调用libAppVerify.so的地方,如图所示,context就是从这里传入的:
 
 
 
 
 
 
 
 
 
 
 
 
我们要做的就是修改这个context,使它最后指向的sourceDir为原apk路径。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  根据上图原理,我们自己实现一个ApkApplicationInfo类指定sourceDir为原apk(SD卡中apk)路径,ApkApplicationInfo在getApplicationInfo函数中实例化,由于getApplicationInfo函数为PackageManager类的成员函数,所以需要自己实现一个ApkPackageManager类(继承自PackageManager类)来调用getApplicationInfo函数。ApkPackageManager类需要在getPackageManager函数中得到实例化,getPackageManager函数为Context的成员函数,所以还需要自己实现一个继承自Context的类ApkContext。
  于是,创建一个Android工程,创建ApkApplicationInfo、ApkPackageManager和ApkContext这三个类,设置sourceDir为“/sdcard/myapk.apk”。编译后,将生成的apk反编译,得到这的三个类的smali代码文件,如下图所示:
 
 
com.zip
 
 
 
然后,将原apk反编译,把上述三个文件放入反编译后的apk smali文件夹中,在Lcom/rytong/emp/security/AppVerify类的verifyHash函数中插入下述代码,如图所示:
 
 
 
 
 
 
 
重打包,安装运行,成功!

(二)使用hook技术

  我们知道进行签名校验是在libAppVerify.so中,所以我们只需hook这个so中的函数,更改传入的apk路径就行了。通过分析可知,该so是使用MINIZIP进行apk文件解压缩,然后获取签名信息的。
  使用MINIZIP进行apk文件解压缩的示例代码如下:
 1 void uncrypt_test()
 2 {
 3   //采用MINIZIP进行文件解压缩 
 4   unzFile uf=NULL;
 5     unzFile data[1200];
 6     unz_global_info64 gi;
 7     unz_file_info64 FileInfo;  
 8  
 9     //打开zip文件 
10     uf = unzOpen64("D:\\myfile.zip");
11     int result=unzGetGlobalInfo64(uf, &gi);
12     if (result != UNZ_OK)          
13         throw "文件错误";
14  
15     //循环解压缩文件 
16     for(int i=0;i<gi.number_entry;++i)
17     {
18         if (unzGetCurrentFileInfo64(uf, &FileInfo, 0, 0,NULL,0,NULL,0)!= UNZ_OK)
19              throw "文件错误";
20  
21         if(!(FileInfo.external_fa & FILE_ATTRIBUTE_DIRECTORY)) //文件,否则为目录 
22             //打开文件
23             //result=unzOpenCurrentFile(uf);/* 无密码 */
24             result=unzOpenCurrentFilePassword(uf,"123"); /* 有密码 */
25   
26         //读取内容
27         int size= unzReadCurrentFile(uf,data,sizeof(data));                    
28  
29         //关闭当前文件
30         unzCloseCurrentFile(uf);   
31  
32         //出错
33         if(i < gi.number_entry - 1 && unzGoToNextFile(uf) != UNZ_OK)
34           throw "error";        
35     }
36  
37     //关闭流
38     unzClose(uf);
39 }

  从上述代码可知,解压过程中,apk路径以参数形式传入unzOpen64函数。所以我们需要hook这个函数。但是如何知道libAppVerify.so何时被加载呢?我们知道系统通过dvmLoadNativeCode函数从指定的路径加载so,如果对系统函数dvmLoadNativeCode进行hook,当它加载libAppVerify.so的时候,再hook unzOpen64函数,修改apk路径,不就行了?

  dvmLoadNativeCode函数原型:  

bool dvmLoadNativeCode(constchar* pathName, Object* classLoader, char** detail)

  这里我们使用cydia substrate这个hook框架,关键代码如下:

 
将编译生成的so文件放到原apk lib目录下。再通过java层进行加载,加载代码如下:
1     const-string/jumbo v0, "substrate"
2     invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
3     const-string/jumbo v0, "substrate-dvm"
4     invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
5     const-string/jumbo v0, "HookVerify.cy"
6     invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

由于需要在签名校验代码运行之前加载这些so,所以我们在Lcom/cgbchina/xpt/EMPView类的构造函数中添加上述代码,如下图所示:

重打包签名,安装运行成功!
HookVerify.zip

(3)直接修改so文件

由于签名验证验证的是MANIFEST.MF文件,我们将原apk中MANIFEST.MF文件改名为SIGNFILE.MF放到修改了的apk META-INF文件夹下,然后将so中验证的文件名改为SIGNFILE.MF,如图所示:

保存,替换原so,重打包安装,运行成功!


原文地址: http://www.cnblogs.com/goodhacker/p/4842215.html

安卓APK反编译与修改实战:从去广告到解锁功能的逆向工程入门 在Android应用开发与安全研究领域,APK反编译是一项基础且关键的技术。其核心原理在于,APK文件本质上是遵循特定格式的压缩包,内含编译后的DEX字节码、资源文件及配置文件。通过反编译工具,我们可以将这些二进制或中间代码转换为可读性更高的形式,从而深入理解应用的内部逻辑与资源结构。这项技术的价值不仅在于安全审计和漏洞挖掘,也为开发者进行代码学习、性能分析与功能调试提供了强大支持。典型的应用场景包括分析第三方库的实现、排查兼容性问题,以及进行合法的应用行为研究。本文将以【去广告】和【解锁VIP功能】这两个 阅读详情

相关推荐

APK签名机制原理详解

众所周知,Android系统在安装Apk的过程中,会对Apk进行签名校验,校验通过后才能安装成功。那你知道签名校验的机制是什么?具体校验的是什么内容吗?申请第三方SDK(如微信支付)时填入的SAH1值是什么?目前众多的快速批量打包方案又是如何绕过签名检验的?我将通过一系列的文章来解开这些疑惑。

zwjemperor的专栏 1万+

签名校验破解过程

签名校验破解过程 一、前提说明 我们知道Android中的每个应用都是有一个唯一的签名,如果一个应用没有被签名是不允许安装到设备中的,一般我们在运行debug程序的时候也是有默认的签名文件的,只是IDE帮我们做了签名工作,一般在应用发版的时候会用唯一的签名文件进行签名,那么我们在以往的破解中可以看到,我们有时候需要在反编译应用之后,然后从新签名在打包运行,这个又给了很多二次打包团队谋取利益的一种手...

JiaoMaGe的博客 1万+

Android中如何进行签名校验和完整性校验

前言 签名校验和完整性校验主要是针对于二次打包的检测防范措施,如果没有签名校验和完整性校验功能,应用可能被恶意攻击者二次打包,被盗版的风险大大增加,同时也可能进行任意代码修改。 针对上面的问题,这章我们就对我们的App进行运行时签名校验。 准备 项目代码 项目代码的主要实现类SignatureChecker,欢迎查看。 验证默认签名信息 1.获取应用的APK 在编写好项目以后,我们通过点击bui...

Martin.Mu `s Special Column 1万+

APK签名校验绕过

0x01 Android签名机制 将APK重命名为zip文件,然后可以看到有个META-INF的文件夹,里面有三个文件,分别名为MANIFEST.MF、CERT.SF和CERT.RSA,这些就是使用signapk.jar生成的签名文件。 1、 MANIFEST.MF文件: 程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再...

weixin_30668887的博客 1792

安卓13_ROM修改定制化----修改系统固件不开机 安卓13去除系统app签名验证的几种方法

谷歌在安卓13中对系统应用添加了一层校验验证,你如果修改了系统app.那么原有的签名加载后过不去验证,会导致进不去系统卡第一屏或者进入系统后修改的app错误等等故障。例如修改的应用消失或者打不开等等故障. 通过博文了解💝💝💝 1💝💝💝-----了解安卓13去除系统app签名验证的几种方法

小马哥的专栏 1万+

ApkIDE少月增强版实战:APK反编译、去广告、改包名与签名

APK逆向是Android应用定制与安全分析的基础技能,其核心链路围绕反编译、修改、回编译与签名四个环节展开。反编译将编译后的二进制资源还原为可读的smali与XML,修改则针对广告SDK、包名引用或资源文件进行操作,回编译重新生成APK,而签名决定了应用能否在设备上安装运行。这一流程广泛应用于汉化、去广告、应用共存和渠道包定制等场景。对于刚接触逆向的开发者,命令行apktool虽然灵活,但门槛较高;而ApkIDE 3.3.5少月增强版整合了新版apktool、编码修复与一键签名工具,以GUI方式降低了操作

weixin_29184371的博客 213

Android5.1.1 - APK签名校验分析和修改源码绕过签名校验

为什么80%的码农都做不了架构师?>>> ...

weixin_34360651的博客 378

Apk IDE 3.5.0逆向实战:smali修改与重打包全流程指南

APK逆向是Android安全分析与定制化改造的基础技术,其核心在于理解DEX字节码、资源编译机制及签名验证体系。smali作为Dalvik虚拟机的汇编语言,直接映射Java逻辑,是精准Patch业务代码的关键媒介;而Apk IDE并非图形化IDE,而是集成了Apktool、Smali/Baksmali和AXMLPrinter2的轻量级反汇编工作台,专为已有逆向基础的工程师优化本地化操作流。它通过预置参数、中文错误提示与常见陷阱拦截,显著提升‘反编译→smali修改→重打包→v2/v3签名’闭环效率,尤其适

weixin_29183637的博客 74

Android逆向【4】:暴力破解APK签名校验,愉快的重新打包微信支付宝APK

回顾 《Android逆向小技巧③:批量注入日志,打印目标程序执行流程》 在上一篇2019年的文章中,我们使用python写了一个简单的文本处理工具: https://github.com/encoderlee/android_tools 在使用apktool对目标应用的apk解包以后,用这个python写的小工具,分析反编译出来的smali代码,并在每个方法中注入日志,然后对apk重新打包,这样,但APP运行的时候,我们每做一个操作,都可以从日志中看出目标代码的执行流程。 不过这种方式有一个很大的缺点,就

软件架构农 1万+

去APK签名校验工具

去除APK签名校验工具, 去除APK签名校验工具, 去除APK签名校验工具, 去除APK签名校验工具, 去除APK签名校验工具

fMRI独立成分分析方法(ICA)工具GIFT

详细介绍了进行fmri数据进行ICA分析的工具包GIFT的使用,和进行ICA分析的流程。

m0_58256026的博客 1万+

APK签名机制之——JAR签名机制详解

在《APK签名机制原理详解》一文中我们已经了解了APK签名和校验的基本过程,这一篇我们来分析JAR签名机制。JAR签名对对jar包进行签名的一种机制,由于jar包apk本质上都是zip包,所以可以应用到对apk的签名。本文从JAR签名结构、签名过程,再到签名校验的源码分析,全方面来分析Android中JAR签名及校验的机制。

zwjemperor的专栏 5160

运放专题:运算放大电路中的相位补偿

的方法

五花带点肉 2万+

Android升级apk签名文件校验

升级apk流程:从服务器下载更新的apk----对apk做校验----安装apk 本文讲一下对apk做签名文件校验,实际上就是获取本机已安装apk的签名和从服务器下载的apk的签名,计算两个签名文件的MD5,如果MD5一样,就说明签名文件正确。 boolean sigMd5 = veritySignature(getUpdateApkName(), downloadpath + filename); private boolean veritySignature(String pkgName, String

WeLoveSunFlower的专栏 1776

芯片测试中的DC与AC模式详解:如何选择最适合你的测试方案?

本文深入解析了芯片测试中DC(直流)与AC(交流)模式的核心差异与互补性。DC测试关注静态电气特性,如固定型故障;而AC测试则聚焦于芯片在额定工作速度下的动态时序行为。文章从VLSI设计、电路模块、成本约束、可测试性设计和应用场景五大维度,提供了如何根据工艺节点、工作频率及具体需求,在testMode配置、时钟复位策略和输入输出接口设计中,平衡两种测试模式以制定最优方案的决策框架。

bb456的博客 1086

2025软考信息安全工程师真题

2025信息安全工程师软考真题

qq_40424393的博客 1705

apk去签名校验

1.确认app是否有签名校验,将apk重新签名打包安装后发现apk出现直接闪退或安装失败则说明apk存在签名校验,在代码中去寻找相关签名校验代码。 判决校验代码是写在java层还是so层 java层搜索关键字sign,signature,checkSign,signCheck,getPackageManager,getPackageInfo,verify,same等 so层 分析java层...

Allison_的博客 8709

jaka+realsense+aruco+手眼标定(python)

第二次重建了项目的手眼标定部分……有很多第一次记录遗漏的地方,在此补充。

drivenzyw的博客 2122

java 签名校验工具,去APK签名校验工具

【实例简介】去除APK签名校验工具, 去除APK签名校验工具, 去除APK签名校验工具, 去除APK签名校验工具, 去除APK签名校验工具【实例截图】【核心代码】621127e4-c4ef-4b50-9e6b-f44d8eda0300└── kstools-master├── apksign.bat├── cyy_game.keystore├── kstools.bat├── kstools.ja...

weixin_39524703的博客 700

汽车电子零部件(14):TMS热管理系统

TMS(thermal management system)热管理系统,这是新能源汽车诞生后随之而产生的一种新汽车零部件,一旦热管理失控会触发自燃,这种现象也是对EV来说是件头疼的事。汽车的热管理系统(TMS)是一个关键部件,有助于调节汽车电池组、车厢和其他车辆系统的温度。TMS的主要目的是在驾驶过程中保持最佳的电池性能和乘客舒适度。TMS使用各种加热和冷却系统来调节电池组和车厢的温度,并通过优化其使用,降低能耗,提高车辆的整体效率。

码农17年的博客 3160

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

【APK安全】APK签名校验安全测试指南

检查是否使用SHA-256及以上算法(如SHA-384、SHA-512)

水滴石穿 1280

Jetson AGX Orin和Drive AGX Orin相机的关联分析和编程指南

通过适当的相机接口和连接,以及使用适当的软件开发环境,开发人员可以在这些平台上实现相机功能。Jetson AGX Orin和Drive AGX Orin是NVIDIA推出的两款强大的计算平台,用于自动驾驶和人工智能应用。Jetson AGX Orin和Drive AGX Orin平台提供了强大的计算能力,使开发人员能够实现复杂的相机功能和算法。以上只是一些示例,Jetson AGX Orin和Drive AGX Orin平台提供了丰富的开发资源和工具,可用于实现各种复杂的相机应用。显示图像在一个窗口中。

CyberLynxO的博客 1119

Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名

Apk签名,每一个Android开发者都不陌生。它就是对我们的apk加了一个校验参数,防止apk被掉包。一开始做Android开发,就接触到了apk签名;后来在微信开放平台、高德地图等平台注册时,需要填写apk签名的md5值和sha256值;再后来做系统应用,接触到了系统签名;而后就想了解下apk的生成机制,学习了如何用命令行进行签名。 ...

jb_home的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 利用Cydia Substrate进行Android HOOK(2)
下一篇: 利用IDA6.6进行apk dex代码动态调试
Omni-Space
博客等级 码龄11年 2158粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值