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

一、前言

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 {@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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-->";@Overridepublic 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);Log.d(TAG, "2.摘要结果为: " + new BigInteger(1, (byte[]) param.getResult()).toString(16));}});}}
}

三、效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握 Vue3、Vite 和 SCSS 实现一键换肤的魔法步骤

前言 一个网站的换肤效果算是一个比较常见的功能,尤其是在后台管理系统中,我们几乎都能看到他的身影,这里给大家提供一个实现思路。 搭建项目 vitevue3搭建项目这里就不演示了,vite官网里面讲得很清楚。 注:这里使…

Docker数据卷的挂载

目录 1 概念 2 常用命令 3 操作步骤(主要讲在创建容器时的挂载) 3.1 挂载在默认目录 3.2 挂载在自定义目录 4 附加内容(查看容器的挂载情况) 1 概念 数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。这样容器内…

上海亚商投顾:沪指震荡微涨 AI手机、军工板块集体走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日低开后震荡回升,黄白二线分化明显,银行等权重板块走势较强。AI手机概念股持续…

智能设备 app 设计 —— 蓝蓝 UI 设计公司

今天给大家推荐是智能设备app设计,随着智能设备的逐渐普及随之操作app也越来越多,希望能给大家带来灵感 #日常灵感 #创意设计#UI提升#ui设计#app #设计案例分享|#设计 #产品设计#产品设计#设计灵感 #B端产品经理 #ui #产品 #美工 #交互 #产品经理 #开发 …

数据管理【总结】

大数据:是指极其庞大的数据集,通常具备五大特征(5个V):数据量大(Volume)、数据类型多样(Variety)、数据生成速度快(Velocity)、数据真实性高&…

大模型快速实现python3+html内容在线渲染

需求: 有一份数据需要通过前端在线展示给用户,不需要复杂的样式交互,后端服务是基于Python3实现的API接口,对前端技术不是很了解,需要快速实现该需求。类似样式即可: 思路: 如果页面不复杂&am…

一键清除JavaScript代码中的注释:使用正则表达式实现

这个正则表达式可以有效地匹配 JavaScript 代码中的各种注释&#xff0c;并且跳过了以 http: 或 https: 开头的链接。 /\/\*[\s\S]*?\*\/|\/\/[^\n]*|<!--[\s\S]*?-->|(?<!http:|https:)\/\/[^\n]*/gvscode 实战&#xff0c;ctrlF 调出查找替换工具&#xff0c;点…

交流稳压稳频大功率电源技术与应用

交流稳压稳频大功率电源技术与应用 交流稳压稳频大功率电源是一种能够提供稳定交流电压和频率的电源设备&#xff0c;它具有大功率输出能力&#xff0c;适用于各种需要大功率电源的场合&#xff0c;交流稳压稳频大功率电源在各个领域中发挥着越来越重要的作用。它不仅为各种电子…

HTTPS是什么,那些行业适合部署呢?

随着在线活动的增加&#xff0c;对您共享的关键数据的威胁已经产生了严重的后果&#xff0c;包括欺诈性金融交易、在线身份盗窃等。此外&#xff0c;随着技术使用的增加&#xff0c;网络攻击也变得更加复杂和具有挑战性。 毫无疑问&#xff0c;互联网用户的数据安全意识成倍增长…

备份 ChatGPT 的聊天纪录

备份 ChatGPT 的聊天纪录 ChatGPT 在前阵子发生了不少次对话纪录消失的情况&#xff0c;让许多用户觉得困扰不已&#xff0c;也担心自己想留存的聊天记录消失不见。 好消息是&#xff0c;OpenAI 在 2023 年 4 月 11 日推出了 ChatGPT 聊天记录备份功能&#xff0c;无论是免费…

算法48:动态规划专练(力扣221:最大正方形面积)

题目&#xff1a; 在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1","0&quo…

H12-821_131

131.如图所示&#xff0c;R1、R2、R3和R4运行OSPF&#xff0c;缺省情况下该网络中选举________个DR。&#xff08;请填写阿拉伯数字&#xff09; 答案&#xff1a;3 注释&#xff1a; DR是链路上的概念&#xff0c;使用路由器接口的IP地址表示。链路的网络类型是广播网络类型或…