java 赋值md5_Hook Java API以获得MD5加密前数据
Java实现MD5加密
在Java中,我们用MD5对数据进行加密,代码大概是这样的:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static void main(String[] args) {
String md5 = md5("luoyesiqiu".getBytes());
System.out.println(md5);
System.out.println(md5.substring(8,24));
}
public static String md5(byte[] input){
String md5 = "";
try {
MessageDigest messageDigest = MessageDigest.getInstance("md5");
byte[] buf = messageDigest.digest(input);
for (byte b : buf){
int val = b;
if(val < 0){
val += 256;
}
String str = "" + Integer.toHexString(val);
if(str.length() == 1){
str = "0" + str;
}
md5 += str;
}
} catch (
NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5;
}
}
以上代码会输出32位的MD5值和16位的MD5值,16位MD5值是从32位中截取的:
10ff0971d5ce668c3a9c20a8c96ba43e
d5ce668c3a9c20a8
分析和实现
众所周知,MD5加密是不可逆的,也就是不能解密。如果,我们想要得到加密前的数据该怎么办?想得到加密前的数据,我们可以Hook呀!Hook MessageDigest类的digest方法,这个方法输入要加密的内容,返回加密的结果,只要Hook这个方法就能得到加密前的数据和加密后的数据了,完美!Hook工具这里用的frida。
对于frida,如果要Hook,要写两份代码,一份JavaScript代码,一份Python代码。frida具体使用方法可以去看我以前写的博文:frida的用法--Hook Java代码篇
Python代码
hookMD5.py:
import frida
import sys
def read_file_all(file):
fp=open(file)
text=fp.read()
fp.close()
return text
pass
def on_message(message, data):
if message['type'] == 'error':
print("[!] " + message['stack'])
elif message['type'] == 'send':
print(message['payload'])
if data != None:
print("[data] " + format_bytes(data))
else:
print(message)
pass
def format_bytes(bytes):
string='['
for b in bytes:
string=string+str(b)+','
return string[:len(string)-1]+"]"
pass
def main():
dev = frida.get_usb_device()
session = dev.attach("com.xxxx.xxxx")
text = read_file_all("hookMD5.js")
script = session.create_script(text)
script.on('message', on_message)
script.load()
sys.stdin.read()
pass
main()
注:com.xxxx.xxxx改成自己想要Hook的App包名
JavaScript代码
digest方法有两个重载方式,我们把它们都给Hook了。
hookMD5.js:
var algorithm = 'MD5';
if(Java.available)
{
Java.perform(function(){
var MessageDigest= Java.use('java.security.MessageDigest');
var digest1 = MessageDigest.digest.overload("[B","int","int");
digest1.implementation=function(buf,offset,len){
var ret = digest2.call(this,buf);
parseIn(this,buf);
parseOut(this,ret);
return ret;
}
var digest2 = MessageDigest.digest.overload("[B");
digest2.implementation=function(buf){
var ret = digest2.call(this,buf);
parseIn(this,buf);
parseOut(this,ret);
return ret;
}
});
}
function parseIn(digest,input){
var Integer= Java.use('java.lang.Integer');
var String= Java.use('java.lang.String');
if(digest.getAlgorithm() != algorithm){
return;
}
try{
console.log("original:"+String.$new(input));
}
catch(e){
console.log(parseHex(input));
}
}
function parseOut(digest,ret){
var Integer= Java.use('java.lang.Integer');
var String= Java.use('java.lang.String');
var result = "";
for(var i = 0;i
var val = ret[i];
if(val < 0){
val += 256;
}
var str = Integer.toHexString(val);
if(String.$new(str).length()==1){
str = "0" + str;
}
result += str;
}
if(digest.getAlgorithm()==algorithm){
console.log(digest.getAlgorithm() + "(32):" + result);
console.log(digest.getAlgorithm() + "(16):" + result.substring(8,24));
console.log("");
}
}
function parseHex(input){
var Integer= Java.use('java.lang.Integer');
var byte_array = "";
for(var j = 0;j
var hex = Integer.toHexString(input[j]);
if(hex.length == 1){
hex = "0" + hex;
}
byte_array += hex;
}
console.log("original(hex):");
var pair = "";
var hex_table = "";
for(var k = 0;k
pair += byte_array.charAt(k);
if((k+1)%2 == 0){
pair += " "
hex_table += pair;
pair = ""
}
if((k+1)%32 == 0){
hex_table += "\n"
}
}
return hex_table;
}
写好后把两个脚本放在同一个目录,运行Python脚本:
python hookMD5.py
Hook某App运行结果如下:
上面的frida脚本,不仅可以Hook MD5算法流程,还可以Hook SHA家族的散列算法流程,修改Javascript脚本开头的algorithm变量即可达到目的,读者可以自行尝试。
java 赋值md5_Hook Java API以获得MD5加密前数据相关推荐
- MD5加密 java实现
Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护. MD5即Message-Digest Alg ...
- md5碰撞Java_2 MD5加密 java实现
百度百科对MD5的说明是: Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护. MD5即Mess ...
- Java实现MD5加密和文件校验
MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...
- java 随机md5_java常用工具类 Random随机数、MD5加密工具类
本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下 random随机数工具类 package com.jarvis.base.util; import java.util.ra ...
- md5加密校验 java_Java实现MD5加密和文件校验
MD5简介: MD5的全称:Message-Digest Algorithm 5(信息-摘要算法5) MD5的加密方式是一种哈希加密.一些主流的编程语言都已经实现了MD5的加密,所以如果你的程序或是系 ...
- guava实现MD5加密
java源码不太方便实现MD5加密, 工程中引用apache guava包来实现 实现代码 String a = "I'm testing"; String md = Hashin ...
- MD5加密工具类(实战版)
MD5加密工具类(实战版) 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成 ...
- 数据库(DataBase)-数据库级别MD5加密
3.数据库级别MD5加密(拓展项) 什么是MD5? MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节 ...
- springboot项目系列-论坛系统05全局异常处理+日志处理+MD5加密
springboot项目系列-论坛系统05全局异常处理+日志处理使用了spring的AOP 论坛地址:http://www.cywloveyou.top 配置日志 logging:level:root ...
最新文章
- 掌握图神经网络GNN基本,看这篇文章就够了
- 建立一个Web项目及一些错误解决办法
- 使用单独的解决方案(类库)来开发DNN的模块-C#版本(2)
- 【Luogu1393】动态逆序对(CDQ分治)
- [剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]
- js一个按钮弹出两个按钮_车内常见按钮,你却一个不认识?一分钟带你认识车内常见按钮...
- 开源网格划分软件_网格划分:PointWise 18.3R1
- [雪峰磁针石博客]2018最佳人工智能数据采集(爬虫)工具书下载
- 列车运行图的编制原则是什么_我国农村将有序推进村庄规划编制
- html画布创建黑白象棋棋盘,canvas应用——中国象棋棋盘
- Python从入门到实践-第三章习题
- (转)大数据量分页存储过程效率测试附代码
- Arduino基础入门二之呼吸灯
- 2021-2027全球与中国可待因止疼药市场现状及未来发展趋势
- 计算机设备标签怎么贴,电脑怎么打印不干胶标签 电脑打印不干胶标签操作流程【图文】...
- 假如生命是乏味的,我怕有来生;假如生命是有趣的,今生已是满足。
- 解决HP 3055 一体机与U盘冲突
- 什么是Arduino?
- Python数据分析之--运动员数据揭秘(一)
- 反馈概念、反馈分类、判断反馈极性的3φ法
热门文章
- mount挂载光盘media_Linux挂载光盘命令
- 中日文字编码转换_关于编码你必须知道的知识和技巧
- python2.7安装报错_python2.7源码安装方式
- Python使用多线程搜索指定范围内的所有素数
- 几行Python代码生成饭店营业额模拟数据并保存为CSV文件
- 哪些手机搭载鸿蒙,鸿蒙2.0搭载手机吗-有什么功能
- linux重启后版本变了,linux – 重启后如何使设备映射保持不变?
- 斜面孔如何绘制_如何才能做好钢结构厂房基础设计
- tomcat最新版本是多少_Tomcat在Windows 10下的安装配置教程
- java 项目拆分_java – 多模块项目什么时候应该拆分成单独的存储库树?