1.JAVA 系统类
java.security.MessageDigest
a.入参方法
通过update()方法处理数据
b.返回结果方法
getInstance(String algorithm)返回指定算法的MessageDigest对象
c.完成哈希计算
digest();通过执行诸如填充之类的操作完成哈希计算
2.hook类js方法
function Uint8ArrayToString(fileData){ //Uint8Array转字符串
var dataString = "";
for (var i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i]);
// console.log(dataString)
}
return dataString
}
function byteToHexString(uint8arr) { //byte数组转16进制字符串
if (!uint8arr) {
return '';
}
var hexStr = '';
for (var i = 0; i < uint8arr.length; i++) {
var hex = (uint8arr[i] & 0xff).toString(16);
hex = (hex.length === 1) ? '0' + hex : hex;
hexStr += hex;
}
return hexStr.toUpperCase();
}
Java.perform(function () {
console.log('HOOK Start!!!');
var MD5Encrypt = Java.use("java.security.MessageDigest");
console.log(MD5Encrypt);
// 加密
MD5Encrypt.update.overload('[B').implementation = function (args1) {
console.log("MD5Encrypt args1:",args1);
console.log(Uint8ArrayToString(args1));
// console.log("MD5Encrypt args2:",args2);
// console.log("MD5Encrypt args3:",args3);
// console.log("MD5Encrypt args4:",args4);
var result = this.update(args1);
console.log("update", result);
console.log("MD5Encrypt.encode result==:",result);
return result;
};
MD5Encrypt.digest.overload().implementation = function (args1, args2, args3, args4, args5, args6) {
var args = this.digest();
console.log("fan_hui",byteToHexString(args));
return args
}
});
2.1直接通过cmd窗口调用
frida -U 包名 -l js
2.2用python调用
import logging
import frida
import sys
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
with open('hook.js', 'r', encoding='utf-8') as f: # js文件
sta = ''.join(f.readlines())
rdev = frida.get_remote_device()
session = rdev.attach("xxxxxx") #app包名
print(session)
script = session.create_script(sta)
print(script)
def show(message,data):
print(message)
script.on("message",show)
# 加载脚本
script.load()
sys.stdin.read()
运行结果:
3.MessageDigest类
3.1介绍摘要信息
java 1.6 api介绍:此类为应用程序提供信息摘要功能,如:MD5/SHA等.信息摘要是简单的单向哈希函数,它接收任意长度的数据,并返回固定长度的哈希值
3.2获得对象
一般通过getInstance("算法名称")方法获得
3.3常用方法
通过update()方法处理数据,任何时候都可以通过reset()方法重置摘要,一旦所有更新数据都更新完了,应该调用digest()方法完成哈希计算,对于定量的数据计算,digest()方法只能被调用一次,MessageDigest对象恢复到初始状态
3.4其他方法
clone();如果实现是可复制的,则返回一个副本
digest();通过执行诸如填充之类的操作完成哈希计算
digest(byte[] input)通过指定的数组完成最后更新操作,并计算哈希
digest(byte[] buf, int offset, int len)通过指定数组,并指定开始位置(偏移量),和数字长度,来进行最后更新,并计算哈希
getAlgorithm();返回指定的算法名称
getDigestLength()返回以字节为单位的摘要长度,如果实现不支持,则返回0
getInstance(String algorithm)返回指定算法的MessageDigest对象
getInstance(String algorithm, Provider provider)通过指定算法提供者和算法名称返回MessageDigest对象
getInstance(String algorithm, String provider)通过指定算法提供者和算法名称返回MessageDigest对象
getProvider();返回此信息摘要对象的提供者
isEquals();比较两个信息摘要对象的相等性
reset();重置摘要以供再次使用
toString();返回此信息摘要对象的字符串表示形式
update(byte input);通过指定的字节更新摘要
update(byte[] input)通过指定字节数组更新摘要
update(byte[] input, int offset, int len)通过指定字节数组从指定偏移量开始更新摘要
update(ByteBuffer input)通过指定ByteBuffer更新摘要
3.5支持的算法
MD2
MD5
SHA-1
SHA-256
SHA-384
SHA-512
特征:
1.在计算上,查找两个哈希值为相同值的消息是不可行的。
2.文摘不应该揭示用于生成它的输入的任何信息。