APK签名校验绕过

2024-06-23 17:18
文章标签 校验 apk 签名 绕过

本文主要是介绍APK签名校验绕过,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将APK重命名为zip文件,然后可以看到有个META-INF的文件夹,里面有三个文件,分别名为MANIFEST.MF、CERT.SF和CERT.RSA,这些就是使用signapk.jar生成的签名文件。

1、 MANIFEST.MF文件:

程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Base64进行编码。具体代码见这个方法:

1
private static Manifest addDigestsToManifest(JarFile jar)

关键代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (JarEntry entry: byName.values()) {
      String name = entry.getName();
      if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
          !name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) &&
          (stripPattern == null ||!stripPattern.matcher(name).matches())){
          InputStream data = jar.getInputStream(entry);
          while ((num = data.read(buffer)) > 0 ) {
          md.update(buffer, 0 , num);
        }
        Attributes attr = null ;
        if (input != null ) attr = input.getAttributes(name);
        attr = attr != null ? new Attributes(attr) : new Attributes();
        attr.putValue( "SHA1-Digest" , base64.encode(md.digest()));
        output.getEntries().put(name, attr);
     }
}

之后将生成的签名写入MANIFEST.MF文件。关键代码如下:

1
2
3
4
5
Manifest manifest = addDigestsToManifest(inputJar);
je = new JarEntry(JarFile.MANIFEST_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
manifest.write(outputJar);

2、 生成CERT.SF文件:

对前一步生成的Manifest,使用SHA1-RSA算法,用私钥进行签名。关键代码如下:

1
2
3
4
5
6
7
Signature signature = Signature.getInstance( "SHA1withRSA" );
signature.initSign(privateKey);
je = new JarEntry(CERT_SF_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureFile(manifest,
new SignatureOutputStream(outputJar, signature));

3、 生成CERT.RSA文件:

生成MANIFEST.MF没有使用密钥信息,生成CERT.SF文件使用了私钥文件。那么我们可以很容易猜测到,CERT.RSA文件的生成肯定和公钥相关。 CERT.RSA文件中保存了公钥、所采用的加密算法等信息。核心代码如下:

1
2
3
4
je = new JarEntry(CERT_RSA_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureBlock(signature, publicKey, outputJar);

在程序中获取APK的签名时,通过signature方法进行获取,如下:

1
2
3
4
5
6
packageInfo = manager.getPackageInfo(pkgname,PackageManager.GET_SIGNATURES);
signatures = packageInfo.signatures;
for (Signature signature : signatures) {
     builder.append(signature.toCharsString());
}
signature = builder.toString();

所以一般的程序就是在代码中通过判断signature的值,来判断APK是否被重新打包过。

0x02 签名绕过方式


在讲签名绕过的方式前,需要先明确DEX校验和签名校验:

1.将apk以压缩包的形式打开删除原签名后,再签名,安装能够正常打开,但是用IDE(即apk改之理,会自动反编译dex)工具二次打包,却出现非正常情况的,如:闪退/弹出非正版提示框。可以确定是dex文件的校验

2、将apk以压缩包的形式打开删除原签名再签名,安装之后打开异常的,则基本可以断定是签名检验。如果在断网的情况下同样是会出现异常,则是本地的签名检验;如果首先出现的是提示网络没有连接,则是服务器端的签名校验.

2.1.Java层校验

获取签名信息和验证的方法都写在android的java层。实例如下:

1、使用APKIDE反编译APK,不做任何操作,然后直接回编译,安装后运行,提示如下:

enter image description here

2、在APKIDE中搜索signatures(或者搜索错误提示),定位到签名验证的代码处。

enter image description here

3、此处就是获取签名的,然后找程序判断签名的地方,进行修改,如下图,if-nez是进行判断的地方,将ne修改为eq。即if-eqz v2, :cond_0。则程序就可以绕过本地的签名交易。

enter image description here

enter image description here

2.2.NDK校验

将关键代码放到so中,在底层获取签名信息并验证。因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用。实例如下:

1、使用APKIDE反编译APK,不做任何操作,然后直接回编译,安装后运行,程序直接退出,无任何提示。

2、在APKIDE中搜索signatures(或者搜索错误提示),定位到签名验证的代码处。

enter image description here

3、使⽤用JD-GUI打开AppActivity,可以看到,此处是获取包名,然后进⾏行MD5计算。

enter image description here

4.在程序中搜索getSignature,发现并没有调⽤用此函数的地⽅方,猜测在so⽂文件中,搜索loadLibrary。

enter image description here

5.在代码中可以查找,可以找到调⽤用的是libcocos2dcpp.so

6.使⽤用IDA打开libcocos2dcpp.so,然后搜索getSiganture,找到调⽤用此函数的地方。

enter image description here

从代码中可以看到,此函数调⽤用了org.cocos2dx.cpp.AppActivity.getSignature

enter image description here

7、查看F5代码,发现此函数是判断签名的函数,然后我们双击此函数的调⽤者,部分代码如下。

enter image description here

8、从上图可以看出,只需要修改BEQ loc_11F754,让其不跳转到jjni——>error,就可以绕过签名校验。 查看HEX,使⽤010editor跳到0011F73E,修改D0为D1。成功绕过签名校验。

enter image description here

2.3.服务器验证

在android的java层获取签名信息,上传服务器在服务端进行签名然后返回验证结果。

如下图,网络验证时,如果网络没连接,一般都会提示错误。

enter image description here

既然是网络验证,肯定要把验证信息发送到服务端,然后进行验证,先看个简单的实例,下次会有个难度大的。

1、手机配置好抓包,然后抓包。第一种图是正常的APK的时候的数据包,第二个图是反编译的APK的数据包,通过对比,发现cookie中的public_key不一样,那么我们替换一下,发现可以正常使用APK的功能了。

enter image description here

enter image description here

2、将正确的public_key添加到APK中。打开反编译的代码,搜索signatures,定位到签名的代码。

enter image description here

可以看到,代码将signatures的值传递到V4中,然后传递到Utils->mPublicKey函数中,于是我们将正确的public_key传给V4。

enter image description here

然后重新打包,重新安装就可以了。

这篇关于APK签名校验绕过的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过新浪开放平台提供的API进行数据采集,但是普通开发者的权限比较低,限制也比较多。所以如果只是做一些简单的功能还是爬虫比较方便~ 应该是今年的早些时候,新浪引入了一个Sina Visitor Syst

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。

加减密签名

签名,验签的理解(转)图片理解数字签名和验签过程

内置带so的APK为系统APK方法

(1)若内置为可卸载的APK,可以无需解压出lib直接编译就可以 具体参考http://blog.csdn.net/a462533587/article/details/46380795 (2)若内置为system APP,上述blog也有两种方式: 方法一:   如下例,在Android.mk中添加并配置变量(注意路径对应): LOCAL_PREBUILT_JNI_LIBS = \

frida检测绕过-libmsaoaidsec.so

libmsaoaidsec.so 部分检测手段 检测机制在native层实现一般在init_proc()函数中触发使用 pthread_create 创建2个检测线程 绕过: nop pthread_create 的调用 eg: 在 bilibil1 - v7.26.1版本中, 在got表导入了pthread_create 绕过: 替换dlsym(xx, "pthread_create ")的返

web登录校验

基础登录功能 LoginController @PostMapping("/login")Result login(@RequestBody Emp emp) {log.info("前端,发送了一个登录请求");Emp e = empService.login(emp);return e!=null?Result.success():Result.error("用户" +"名或密码错误");

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_6【二十五】

目前很多软件都需要票票才可以使用完全的功能。纯免费的功能性app已经很少见了。 今天继续以一款app为大家来演示如何去除软件的限制功能。教程的目的主要是学习反编译的基础修改方法,了解app的修改步骤以及基础的入门修改常识。每个使用修改方法不一定适用于所有app。只是给你另外的思路与步骤参考。 反编译工具:MT**绿色版 演示apk;**清单 app

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录   docker-compose up -d #启动靶场   docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at