app逆向-ratel框架-AES,DES,MD5,SHA1加密算法java hook程序

news2025/1/22 18:50:30

一、前言

AES(高级加密标准)、DES(数据加密标准)、MD5(消息摘要算法5)和SHA-1(安全哈希算法1)都是常见的加密算法,用于数据加密和哈希计算。

二、加密算法实现

1、创建加密函数

java代码实现方式:

package com.yuanrenxue.course6;

import android.util.Base64;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.MessageDigest;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class CryptoUtils implements ICryptoUtils {
    @Override
    public String aesEncrypt(String key, String iv, String content) throws Exception {
        // 密钥和IV的处理
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        // Cipher对象的初始化获取Cipher对象,指定了AES算法、CBC模式和PKCS5填充。
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        // iv 偏移量
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
        // 初始化
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
        // 加密
        byte[] bytes = cipher.doFinal(content.getBytes());
        return Base64.encodeToString(bytes, Base64.DEFAULT);
    }

    @Override
    public String aesDecrypt(String key, String iv, String content) throws Exception {
        // 密钥和IV的处理
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        // Cipher对象的初始化获取Cipher对象,指定了AES算法、CBC模式和PKCS5填充。
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        // iv 偏移量
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
        // 初始化
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        // 解密
        byte[] bytes = cipher.doFinal(Base64.decode(content, Base64.DEFAULT));
        return new String(bytes);
    }

    @Override
    public String desEncrypt(String key, String content) throws Exception {
        // 密钥处理
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "DES");
        // Cipher对象的初始化获取Cipher对象,指定了AES算法、CBC模式和PKCS5填充。
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        // 初始化
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        // 加密
        byte[] bytes = cipher.doFinal(content.getBytes());
        return Base64.encodeToString(bytes, Base64.DEFAULT);
    }

    @Override
    public String desDecrypt(String key, String content) throws Exception {
        // 密钥处理
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "DES");
        // Cipher对象的初始化获取Cipher对象,指定了AES算法、CBC模式和PKCS5填充。
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        // 初始化
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        // 解密
        byte[] bytes = cipher.doFinal(Base64.decode(content, Base64.DEFAULT));
        return new String(bytes);
    }

    @Override
    public String getMD5(String content) throws Exception {
        // 得到摘要实例
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 摘要运算
        byte[] digest = md.digest(content.getBytes());
        // 返回16进制字符串
        return new BigInteger(1, digest).toString(16);
    }

    @Override
    public String getSHA1(String content) throws Exception {
        // 得到摘要实例
        MessageDigest md = MessageDigest.getInstance("SHA1");
        // 摘要运算
        byte[] digest = md.digest(content.getBytes());
        // 返回16进制字符串
        return new BigInteger(1, digest).toString(16);

        // 第二种写法
        // md.update(content.getBytes());
        // md.update(content2.getBytes());
        // md.update(content3.getBytes());
        // return new BigInteger(1, md.digest()).toString(16);
    }
}

2、hook 加密函数

java代码实现方式:

package com.example.plugintest;

import android.util.Log;

import com.virjar.ratel.api.rposed.IRposedHookLoadPackage;
import com.virjar.ratel.api.rposed.RC_MethodHook;
import com.virjar.ratel.api.rposed.RposedHelpers;
import com.virjar.ratel.api.rposed.callbacks.RC_LoadPackage;

import java.math.BigInteger;
import java.security.MessageDigest;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class HookCryptoEntry implements IRposedHookLoadPackage {
    private static final String TAG = "plugintest-->";

    @Override
    public void handleLoadPackage(RC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        System.out.println(TAG + "包名是什么:" + lpparam.packageName);
        if (lpparam.packageName.equals("com.yuanrenxue.course6")) {
            System.out.println(TAG + "确认hook的app是:" + lpparam.packageName);

            // 想hook这个:new SecretKeySpec(key.getBytes(),"AES");这里用的是findAndHookConstructor因为new ... 就是一个
            // 实例化的过程,所以需要hook的是构造方法而不是普通方法
            RposedHelpers.findAndHookConstructor(SecretKeySpec.class, byte[].class, String.class, new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    Log.d(TAG, String.format("SecretKeySpec(%s,%s))", new String((byte[]) param.args[0]), param.args[1]));
                }
            });

            // hook iv:new IvParameterSpec(iv.getBytes());
            RposedHelpers.findAndHookConstructor(IvParameterSpec.class, byte[].class, new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    Log.d(TAG, String.format("IvParameterSpec(%s)", new String((byte[]) param.args[0])));
                }
            });

            // hook 采用了什么加密算法:Cipher.getInstance("AES/CBC/PKCS5Padding")
            RposedHelpers.findAndHookMethod(Cipher.class, "getInstance", String.class, new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    Log.d(TAG, "发现使用如下加密算法: " + param.args[0]);
                }
            });

            // hook 加密解密过程:cipher.doFinal(content.getBytes());
            RposedHelpers.findAndHookMethod(Cipher.class, "doFinal", byte[].class, new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    // 对于加密来说:入参(明文),返回值(密文)
                    // 对于解密来说:入参(密文),返回值(明文) 可以通过这来判断在加密还是在解密
                    // 加密的返回值因为是随机的字节,所以打印出来很可能是鬼画符一样的东西�7sZ������O��像这种,是正常的
                    Log.d(TAG, String.format("入参为:%s,返回值为:%s", new String((byte[]) param.args[0]), new String((byte[]) param.getResult())));
                }
            });

            // hook采用了哪种哈希函数(摘要算法) MessageDigest.getInstance("MD5");
            RposedHelpers.findAndHookMethod(MessageDigest.class, "getInstance", String.class, new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    Log.d(TAG, "发现使用如下哈希函数: " + param.args[0]);
                }
            });

            // 对于摘要内容的hook
            // 1. md.digest(content.getBytes());
            RposedHelpers.findAndHookMethod(MessageDigest.class, "digest", byte[].class, new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    Log.d(TAG, "消息内容为: " + new String((byte[]) param.args[0]));
                    Log.d(TAG, "摘要结果为: " + new String((byte[]) param.getResult()));
                    Log.d(TAG, "摘要结果为: " + new BigInteger(1, (byte[]) param.getResult()).toString(16));
                }
            });

            // 2. md.update(content.getBytes());
            RposedHelpers.findAndHookMethod(MessageDigest.class, "update", byte[].class, new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    Log.d(TAG, "2.消息内容为: " + new String((byte[]) param.args[0]));
                }
            });

            RposedHelpers.findAndHookMethod(MessageDigest.class, "digest", new RC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    Log.d(TAG, "2.摘要结果为: " + new BigInteger(1, (byte[]) param.getResult()).toString(16));
                }
            });

        }
    }
}

三、效果

在这里插入图片描述

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

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

相关文章

基于单片机的火灾报警系统设计

目 录 摘 要 I Abstract II 引 言 1 第1章 系统整体方案设计 3 1.1 系统方案的选择 3 1.2 系统方案设计 3 1.2.1 系统概述 3 1.2.2 系统框图 4 第2章 系统硬件设计 5 2.1单片机STC89C52 5 2.1.1 最小系统电路 6 2.2 显示电路 7 2.2.1 显示方案的选择 7 2.2.2 1602液晶显示 7 2…

gan, pixel2pixel, cyclegan, srgan图像超分辨率

文章目录 1.gan2.DCgan3.cgan4.pixel2pixel(Image-to-Image Translation with Conditional Adversarial Networks)5.CycleGAN6.Deep learning for in vivo near-infrared imaging11..Photo-Realistic Single Image Super-Resolution Using a Generative …

【AI视野·今日NLP 自然语言处理论文速览 第八十二期】Tue, 5 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 5 Mar 2024 (showing first 100 of 175 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Key-Point-Driven Data Synthesis with its Enhancement on Mathematica…

论文研读_多目标部署优化:无人机在能源高效无线覆盖中的应用(ImMOGWO)精简版

此篇文章为Multi-objective Deployment Optimization of UAVs for Energy-Efficient Wireless Coverage的论文学习笔记,只供学习使用,不作商业用途,侵权删除。并且本人学术功底有限如果有思路不正确的地方欢迎批评指正! 创新点 RD算法 混合…

少儿编程机器人技术开发公司的创新之路

行业背景,国家政策利好 随着科技的不断发展,少儿编程机器人技术作为一种新兴的教育方式逐渐受到人们的关注。这项技术将编程与机器人技术相结合,通过互动性强、趣味性高的方式,帮助儿童学习编程知识,培养逻辑思维和创…

使用J-Link Commander通过J-LINK以命令的形式来访问ARM通用MCU

通常我们的操作是写好程序然后将程序下载到芯片里面,然后运行程序来进行相应的操作,其实还可以使用 J − L i n k C o m m a n d e r J-Link\quad Commander J−LinkCommander通过 J − L I N K J-LINK J−LINK以命令的形式来简单访问ARM通用MCU&#xf…

IP劫持的危害及应对策略

随着互联网的发展,网络安全问题日益凸显,其中IP劫持作为一种常见的网络攻击手段,对个人和企业的信息安全造成了严重的威胁。IP数据云将分析IP劫持的危害,并提出相应的应对策略。 IP地址查询:IP数据云 - 免费IP地址查询…

目标检测评估指标

目录 一、检测精度1、TP、FP、TN、FN概念正样本和负样本TP(True Positive---正确的正向预测)FP(False Positive---错误的正向预测)FN(False Negative---错误的负向预测)TN(True Negative---正确的负向预测) 2、Precision(准确率)和Recall(召回率)3、P-R curve &…

【开源】SpringBoot框架开发网上药店系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…

归并排序总结

1.归并排序 归并排序的步骤如下: ①枚举中点,将区间分为左右两段; ②对左右两段区间分别排序; 这个过程以递归的方式进行。 ③合并两段区间。 是一个模拟的过程。用两个指针分别指向左右区间,判断当前哪个数小&…

【Linux C | 网络编程】广播概念、UDP实现广播的C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

酷开科技服务升级,酷开系统给消费者更好的使用体验!

看电视的时候你是不是也会有选择困难症?不知道要看哪个?不知道如何操作?体验不够顺畅?现在,有了酷开系统9.2,这些通通不再是问题!酷开科技,一直致力于服务升级,给消费者更…

springBoot整合Redis(三、整合Spring Cache)

缓存的框架太多了,各有各的优势,比如Redis、Memcached、Guava、Caffeine等等。 如果我们的程序想要使用缓存,就要与这些框架耦合。聪明的架构师已经在利用接口来降低耦合了,利用面向对象的抽象和多态的特性,做到业务代…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述,正常使用echarts,H5正常,小程序报错 报错信息如下 解决方案: 注意要点一:vue3需要使用esm文件 地址&#x…

Elasticsearch:从 ES|QL 到 Python 数据帧

在我之前的文章 “Elasticsearch:ES|QL 查询展示”,我展示了如何在 Kibana 中使用 ES|QL 对索引来进行查询及统计。在很多的情况下,我们需要在客户端中来对数据进行查询,那么我们该怎么办呢?我们需要使用到 Elasticsea…

怎么将电脑excel文档内的数据转换为图片形式

你平时在办公室会遇到格式转换的问题吗?比如PDF转Word,WPS转PDF,PDF转TXT,图片转PDF等。边肖最近在工作过程中遇到了类似的问题。为了更方便的查看表格,需要将Excel表格转换成图片格式。遇到这样的问题,很多…

CPP编程-CPP11中的内存管理策略模型与名称空间管理探幽(时隔一年,再谈C++抽象内存模型)

CPP编程-CPP11中的内存管理策略模型与名称空间管理探幽 CPP的四大内存分区模型 在 C 中,**内存分区是一种模型,用于描述程序运行时内存的逻辑组织方式,但在底层操作系统中,并不存在严格意义上的内存分区。**操作系统通常将内存分…

计算机大数据毕业设计-基于Flask的旅游推荐可视化系统的设计与实现

基于Flask的旅游推荐可视化系统的设计与实现 编程语言:Python3.10 涉及技术:FlaskMySQL8.0Echarts 开发工具:PyCharm 摘要:以Pycharm为旅游推荐系统开发工具,采用B/S结构,使用Python语言开发旅游景点推…

【python】成功解决ModuleNotFoundError: No module named ‘tensorboardX‘

【python】成功解决ModuleNotFoundError: No module named ‘tensorboardX’ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f…

二维码门楼牌管理系统应用场景:助力环保部门提升监管效率

文章目录 前言一、二维码门楼牌管理系统的环保应用场景二、二维码门楼牌管理系统如何助力环保监管三、二维码门楼牌管理系统与环保部门的联动效应 前言 随着城市化进程的加速,环保问题日益受到人们的关注。二维码门楼牌管理系统的出现,为环保部门提供了…