app逆向-frida定位签名校验

news2025/4/6 16:16:10

文章目录

    • 一、前言
    • 二、如何实现签名校验
    • 三、案例:定位签名校验

一、前言

当我们说应用签名校验时,实际上是一种安全机制,用于确保移动应用在被安装和运行时没有被篡改或修改。这个机制通过在应用程序文件上附加一种数字签名的方式来实现。

想象一下,你制作了一个应用,并且你希望用户下载并安装这个应用。在你发布应用之前,你对这个应用进行了签名,就好像你在应用上盖了一个印章一样。这个印章是使用你的私钥生成的,只有你才有这个私钥。

现在,当用户下载你的应用时,操作系统会检查这个印章。它会使用你公开的公钥来验证这个印章是否与应用的内容匹配。如果匹配,就说明应用是原始未经修改的版本,因为只有你拥有私钥,其他人无法伪造相同的印章。

这个过程的目的是确保用户安装的应用是来自可信的源,并且没有被黑客篡改过。这对于防止应用被恶意修改、插入广告或其他不良行为非常重要。这就是应用签名校验的基本概念。

二、如何实现签名校验

通过反编译软件可以看到app签名信息
在这里插入图片描述
那么在app内可以通过对比SHA1值进行校验

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Base64;
import android.util.Log;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class AppSignatureVerifier {

    // 获取应用签名的方法
    public static String getAppSignature(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
                    context.getPackageName(),
                    PackageManager.GET_SIGNATURES
            );

            // 获取第一个签名(通常应用只有一个签名)
            Signature signature = packageInfo.signatures[0];

            // 计算 SHA1 哈希值
            MessageDigest md = MessageDigest.getInstance("SHA1");
            byte[] signatureBytes = md.digest(signature.toByteArray());

            // 将字节数组转换为 Base64 编码的字符串
            return Base64.encodeToString(signatureBytes, Base64.NO_WRAP);
        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return null;
    }

    // 校验应用签名的方法
    public static boolean verifySignature(Context context, String expectedSignature) {
        String appSignature = getAppSignature(context);

        // 对比期望的签名和实际的签名
        return (appSignature != null && appSignature.equals(expectedSignature));
    }

    // 示例用法
    public static void main(String[] args) {
        Context context = /* 获取Android应用的上下文 */;
        String expectedSignature = /* 期望的应用签名 */;
        
        if (verifySignature(context, expectedSignature)) {
            Log.d("AppSignatureVerifier", "应用签名校验通过");
        } else {
            Log.e("AppSignatureVerifier", "应用签名校验失败");
        }
    }
}

也存在其他的校验方法如对比hashcode

if(-19423432442 == context.getPackageManager().getPackageInfo(context.getPackageName(),64).signatures[0].hashCode(){
	return true;
})
Process.killProcess(Process.myPid());
return true;

三、案例:定位签名校验

案例app下载

链接:https://pan.baidu.com/s/1lZ2Umucc0wgglDlSEuFK9w 提取码:9r9w

先反编译apk,再重新打包成apk

# 反编译apk
apktool d E:\apk\lesson3-com.chaozhuo.texteditor.apk
# 重新打包成apk
apktool b E:\apk\lesson3-com.chaozhuo.texteditor\
# 签名
keytool -genkey -keystore my-release-key.keystore -alias my_alias -keyalg RSA -keysize 4096 -validity 10000
jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore -signedjar E:\apk\2.apk E:\apk\1.apk my_alias
# 安装重新打包好的apk
adb install E:\apk\2.apk

再次打开app,发现被检测,无法正常使用app如下:
在这里插入图片描述
通过java内置库android.content.pm.Signature可以hook与签名相关的函数

# hook 内置类android.content.pm.Signature
var Signature = Java.use('android.content.pm.Signature')

# hook 内置类的hashCode方法
Signature.hashCode.implementation = function() {
    console.log('hashCode')
    return this.hashCode()
}

# hook 内置类的toByteArray方法
Signature.toByteArray.implementation = function() {
    console.log('toByteArray')
    return this.toByteArray()
}

并打印出堆栈

# hook 内置类的toByteArray方法
Signature.toByteArray.implementation = function() {
    console.log('toByteArray')
    printstack()
    return this.toByteArray()
}
# 打印调用堆栈
function printstack() {
    console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
}

完整代码:github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab) GWCA -CNN-BiLSTM-Attention长城建造算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 长城建造算法(Great Wall Construction Algorithm,GWC…

Centos Cron设置定时任务

这本是很简单的问题,但是我服务器重装系统两次,遇到的问题都不一样,所以记录一下 1.首先要确保服务器上有 cron 服务 sudo systemctl status crond2.设置时区 sudo timedatectl set-timezone Asia/Shanghai3.重启crond 服务使crond服务的时…

指针的深入理解(一)

这一节主要复习数组指针,int (* )[ ] 就是数组指针类型的标志。 因为有()将*括起来,所以(*)表示一个指针。[ ] 表示数组,所以(*)[ ]就表示一个指向数组的指针&#xff…

【C++】I/O多路转接详解(一)

目录 1. 背景引入1.1 IO的过程1.2 五种IO模型1.2.1 阻塞IO1.2.2 非阻塞IO1.2.3 信号驱动IO1.2.4 IO多路转接1.2.5 异步IO 1.3 同步通信 与 异步通信1.4 阻塞 与 非阻塞1.4.1 阻塞与非阻塞区别1.4.2 设置非阻塞IO 2. select2.1 接口使用2.2 select执行过程2.3 select代码实践 3.…

C++ 数论相关题目:卡特兰数应用、快速幂求组合数。满足条件的01序列

给定 n 个 0 和 n 个 1 ,它们将按照某种顺序排成长度为 2n 的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。 输出的答案对 1097 取模。 输入格式 共一行,包含整数 n 。 …

开源大规模分布式MQTT消息服务器EMQX部署教程

1.EMQX是什么? EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条,单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息,并…

数据结构----链表介绍、模拟实现链表、链表的使用

文章目录 1. ArrayList存在的问题2. 链表定义2.1 链表的概念及结构2.2 链表的组合类型 3. 链表的实现3.1 单向、不带头、非循环链表的实现3.2 双向、不带头节点、非循环链表的实现 4.LinkedList的使用4.1 什么是LinkedList4.2 LinkedList的使用4.2.1. LinkedList的构造4.2.2. L…

R语言(数据导入,清洗,可视化,特征工程,建模)

记录一下痛失的超级轻松的数据分析实习(线上),hr问我有没有相关经历,我说我会用jupyter book进行数据导入,清洗,可视化,特征工程,建模,python学和用的比较多,…

burp靶场--xss上篇【1-15】

burp靶场–xss https://portswigger.net/web-security/cross-site-scripting 1. 什么是xss: 跨站脚本 (XSS) 是一种通常出现在 Web 应用程序中的计算机安全漏洞。XSS 允许攻击者将恶意代码注入网站,然后在访问该网站的任何人的浏览器中执行该代码。这可能允许攻击…

【重磅发布】已开放!模型师入驻、转格式再升级、3D展示框架全新玩法…

1月23日,老子云正式发布全新版本。此次新版本包含多板块功能上线和升级,为用户带来了含模型师入驻、三维格式在线转换升级、模型免费增值权益开放、全新3D展示框架等一系列精彩内容! 1月23日,老子云正式发布全新版本。此次新版本…

【开源】基于JAVA语言的班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

PyTorch自动微分机制的详细介绍

PyTorch深度学习框架的官方文档确实提供了丰富的信息来阐述其内部自动微分机制。在PyTorch中,张量(Tensor)和计算图(Computation Graph)的设计与实现使得整个系统能够支持动态的、高效的自动求导过程。 具体来说&#…

BL808学习日志-3-DPI-RGB屏幕使用-LVGL D0

一、DPI-RGB驱动 BL808的手册上显示是支持RGB565屏幕显示输出的,但是一直没找到网上的使用例程。且官方的SDK显示也是能够使用的,只是缺少了驱动。这一部分驱动在SIPEED的SDK中已经内置了,今天就是简单的点亮一个800*480 RGB565的屏幕。 二、…

第十一篇【传奇开心果系列】BeeWare的Toga开发移动应用示例:Briefcase和Toga 哥俩好

传奇开心果博文系列 系列博文目录BeeWare的Toga开发移动应用示例系列博文目录一、前言二、Briefcase和toga各自的主要功能分别介绍三、使用Toga 开发移动应用Briefcase工具是最佳拍档四、Briefcase搭档Toga创建打包发布联系人移动应用示例代码五、运行测试打包发布六、归纳总结…

OpenHarmony—ArkTS限制throw语句中表达式的类型

规则:arkts-limited-throw 级别:错误 ArkTS只支持抛出Error类或其派生类的实例。禁止抛出其他类型(例如number或string)的数据。 TypeScript throw 4; throw ; throw new Error();ArkTS throw new Error();限制省略函数返回类…

Codeforces Round 799 (Div. 4)

目录 A. Marathon B. All Distinct C. Where’s the Bishop? D. The Clock E. Binary Deque F. 3SUM G. 2^Sort H. Gambling A. Marathon 直接模拟 void solve() {int ans0;for(int i1;i<4;i) {cin>>a[i];if(i>1&&a[i]>a[1]) ans;}cout<&l…

欧拉角及Eigen库中eulerAngles函数的理解

欧拉角方向 以右手坐标系为例&#xff0c;大拇指表示X轴&#xff0c;食指表示Y轴&#xff0c;中指表示Z轴。 大拇指朝向某个轴的正方向&#xff0c;手掌弯曲的方向即为某个轴欧拉角的正方向。 Eigen库中eulerAngles函数 旋转矩阵转欧拉角(Z-Y-X&#xff0c;即RPY&#xff09…

防御保护----防火墙基本知识

一.防火墙的基本知识--------------------------------------------------------- 防火墙&#xff1a;可以想象为古代每个城市的城墙&#xff0c;用来防守敌军的攻击。墙&#xff0c;始于防&#xff0c;忠于守。从古至今&#xff0c;墙予人以安全之意。 防火墙的主要职责在于&…

IDE开发工具Idea使用(IDEA安装与卸载,详细配置,快捷键,代码模板,创建模板,Debug调试,生成javadoc,导入模块,导出jar)

文章目录 一、IntelliJ IDEA 介绍1、JetBrains 公司介绍2、IntelliJ IDEA 介绍3、IDEA 的下载 二、安装与卸载1、安装前的准备2、安装过程3、卸载过程方式一&#xff1a;【控制面板】中卸载如何打开控制面板&#xff1f; 三、初始化配置与激活四、HelloWorld1、新建Java类2、编…

Linux浅学笔记03

目录 有关root的命令 用户和用户组 用户组管理&#xff1a;&#xff08;以下需要root用户执行&#xff09; 创建用户组: 删除用户组&#xff1a; 用户管理&#xff1a;&#xff08;以下需要root用户执行&#xff09; 创建用户&#xff1a; 删除用户&#xff1a; 查看用…