avatar

目录
Xposed学习笔记(3)

记录一下,这个网站查API 挺不错的。

http://www.matools.com/

MD5_SHA算法通杀Hook

Demo中MD5加密写法

使用了MessageDigest

MessageDigest类为应用程序提供消息摘要算法的功能,如SHA-1,MD5SHA-256。 消息摘要是采用任意大小的数据并输出固定长度散列值的安全单向散列函数。

MessageDigest对象开始初始化。 数据通过它使用update方法进行处理。 在任何时候可以调用reset来重置摘要。 一旦要更新的所有数据都被更新,则应调用其中一个digest方法来完成哈希计算。

对于给定数量的更新,可以调用digest方法一次。 在digest之后,将MessageDigest对象重置为初始化状态。

update

Code
1
public void update(byte input)

使用指定的字节更新摘要。

  • 参数

    input - 用于更新摘要的字节。

update

Code
1
2
3
public void update(byte[] input,
int offset,
int len)

使用指定的字节数组从指定的偏移量开始更新摘要。

  • 参数

    input - 字节数组。

    offset - 从字节数组开始的偏移量。

    len - 要使用的字节数,从 offset开始。

update

Code
1
public void update(byte[] input)

使用指定的字节数组更新摘要。

  • 参数

    input - 字节数组。

update

Code
1
public final void update(ByteBuffer input)

使用指定的ByteBuffer更新摘要。 摘要使用更新input.remaining()起始字节input.position() 。 返回时,缓冲区的位置将等于其限制; 其限制将不会改变。

  • 参数

    input - ByteBuffer

  • 从以下版本开始:

    1.5

digest

Code
1
public byte[] digest()

通过执行最后的操作(如填充)来完成哈希计算。 此通话完成后,摘要将重置。

  • 结果

    用于生成的哈希值的字节数组。

digest

Code
1
2
3
4
public int digest(byte[] buf,
int offset,
int len)
throws DigestException

通过执行最后的操作(如填充)来完成哈希计算。 此通话完成后,摘要将重置。

  • 参数

    buf - 计算摘要的输出缓冲区

    offset - 偏移到输出缓冲区开始存储摘要

    len - 为摘要分配的buf内的字节数

  • 结果

    放入 buf的字节数

  • 异常

    DigestException - 如果发生错误。

digest

Code
1
public byte[] digest(byte[] input)

使用指定的字节数组对摘要执行最终更新,然后完成摘要计算。 也就是说,这种方法首先调用update(input) ,将输入数组传递给update方法,然后调用digest()

  • 参数

    input - 在摘要完成之前要更新的输入。

  • 结果

    用于生成的哈希值的字节数组。

java
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 的是 updatedigest两个方法

通过getAlgorithm返回一个标识算法的字符串,与实现细节无关。 该名称应该是标准的Java安全名称(如“SHA”,“MD5”等)。 看到该消息摘要部分标准算法名称的信息。

  • 结果

算法的名称

java
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
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:


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

文章作者: KeyboArd
文章链接: https://www.wrpzkb.cn/xposed3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KeyboArd's Blog
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论