记录一下,这个网站查API 挺不错的。
http://www.matools.com/
MD5_SHA算法通杀Hook
Demo中MD5加密写法
使用了MessageDigest
类
该MessageDigest
类为应用程序提供消息摘要算法的功能,如SHA-1
,MD5
或SHA-256
。 消息摘要是采用任意大小的数据并输出固定长度散列值的安全单向散列函数。
MessageDigest
对象开始初始化。 数据通过它使用update
方法进行处理。 在任何时候可以调用reset
来重置摘要。 一旦要更新的所有数据都被更新,则应调用其中一个digest
方法来完成哈希计算。
对于给定数量的更新,可以调用digest
方法一次。 在digest
之后,将MessageDigest对象重置为初始化状态。
update
1
| public void update(byte input)
|
使用指定的字节更新摘要。
update
1 2 3
| public void update(byte[] input, int offset, int len)
|
使用指定的字节数组从指定的偏移量开始更新摘要。
update
1
| public void update(byte[] input)
|
使用指定的字节数组更新摘要。
update
1
| public final void update(ByteBuffer input)
|
使用指定的ByteBuffer更新摘要。 摘要使用更新input.remaining()
起始字节input.position()
。 返回时,缓冲区的位置将等于其限制; 其限制将不会改变。
参数
input
- ByteBuffer
从以下版本开始:
1.5
digest
通过执行最后的操作(如填充)来完成哈希计算。 此通话完成后,摘要将重置。
digest
1 2 3 4
| public int digest(byte[] buf, int offset, int len) throws DigestException
|
通过执行最后的操作(如填充)来完成哈希计算。 此通话完成后,摘要将重置。
digest
1
| public byte[] digest(byte[] input)
|
使用指定的字节数组对摘要执行最终更新,然后完成摘要计算。 也就是说,这种方法首先调用update(input)
,将输入数组传递给update
方法,然后调用digest()
。
参数
input
- 在摘要完成之前要更新的输入。
结果
用于生成的哈希值的字节数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package com.xiaojianbang.app;
import java.security.MessageDigest;
public class MD5 { public static String md5_1(String args) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5", "BC"); md.update(args.getBytes()); return Utils.byteToHexString(md.digest()); }
public static String md5_2(String args) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5", "BC"); md.update(args.getBytes(), 2, 5); return Utils.byteToHexString(md.digest("xiaojianbang".getBytes())); } }
public class SHA { public static String sha_1(String args) throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-1", "BC"); md.update(args.getBytes()); return Utils.byteToHexString(md.digest()); }
public static String sha_2(String args) throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-1", "BC"); md.update(args.getBytes(), 2, 5); return Utils.byteToHexString(md.digest("xiaojianbang".getBytes())); } }
|
通杀代码:
这里需要HOOK 的是 update
和 digest
两个方法
通过getAlgorithm
返回一个标识算法的字符串,与实现细节无关。 该名称应该是标准的Java安全名称(如“SHA”,“MD5”等)。 看到该消息摘要部分标准算法名称的信息。
算法的名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| package com.example.testxp;
import android.util.Base64; import android.util.Log;
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.security.MessageDigest; import java.security.PublicKey; import java.util.ArrayList; import java.util.Map;
import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class Hello implements IXposedHookLoadPackage { public static String byteToHexString(byte[] by) { StringBuffer SB = new StringBuffer(); for (byte k: by) { int j=k; if (k <0){ j = k+256;
} if (j<16){ SB.append("0"); } SB.append(Integer.toHexString(j)); } return SB.toString(); }
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
Log.d("KeyboArd", "hook..."); XposedBridge.hookAllMethods(XposedHelpers.findClass("java.security.MessageDigest", lpparam.classLoader), "update", new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { MessageDigest md = (MessageDigest) param.thisObject; String Algorithm = md.getAlgorithm(); byte[] params = (byte[]) param.args[0]; String data = new String(params); String dataHex = byteToHexString(params); String dataB64 = Base64.encodeToString(params,0); Log.d("KeyboArd",Algorithm + "updatedata: " + data); Log.d("KeyboArd",Algorithm+"updatedataHex: "+dataHex); Log.d("KeyboArd",Algorithm+"updatedateBase64: "+dataB64); Log.d("KeyboArd","========================================"); } });
XposedBridge.hookAllMethods(XposedHelpers.findClass("java.security.MessageDigest", lpparam.classLoader), "digest", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { MessageDigest md = (MessageDigest) param.thisObject; String Algorithm = md.getAlgorithm(); if (param.args.length>=1){ byte[] params = (byte[]) param.args[0]; String data = new String(params); String dataHex = byteToHexString(params); String dataB64 = Base64.encodeToString(params,0); Log.d("KeyboArd",Algorithm + "updatedata: " + data); Log.d("KeyboArd",Algorithm+"updatedataHex: "+dataHex); Log.d("KeyboArd",Algorithm+"updatedateBase64: "+dataB64); Log.d("KeyboArd","========================================"); } byte[] res = (byte[])param.getResult(); String resHex = byteToHexString(res); String resB64 = Base64.encodeToString(res,0); Log.d("KeyboArd",Algorithm+"digestresultHex: "+resHex); Log.d("KeyboArd",Algorithm+"digestresultBase64: "+resB64); Log.d("KeyboArd","========================================"); } });
|
MD5:

SHA:

好了,今天水了一篇,明天开始搞实战。