返回
某手V8.x 签名计算方法(一):抓包开始
见解分享
2023-12-16 08:25:47
某手App 屡次升级换代,每次升级都会带来新的挑战。最近,它升级到了V8.x 版本,导致抓包变得困难。为了解决这个问题,我们从Okhttp3入手,使用Jadx反编译工具分析其源码,并使用Java 反射技术获取签名数据。
准备工作
在开始之前,我们需要准备以下工具:
- Jadx反编译工具
- Android Studio
- Charles抓包工具(可选)
抓包分析
首先,我们需要使用Charles 抓取某手App的网络请求。打开Charles,将手机连接到电脑,并设置手机的代理服务器为Charles 的IP地址和端口号。然后,打开某手App,并进行一些操作,比如登录、点赞等。Charles 会自动记录下所有的网络请求。
分析 Okhttp3 源码
接下来,我们需要分析Okhttp3 的源码,以找到签名计算的逻辑。我们可以使用Jadx 反编译工具打开Okhttp3 的jar 包,并找到如下代码:
public static String sign(String data, String key) {
// ...
Signature signature = new Signature(key);
byte[] signedBytes = signature.sign(data.getBytes());
// ...
}
从这段代码中,我们可以看到签名计算的逻辑:
- 首先,创建一个Signature 对象,并传入密钥。
- 然后,调用Signature 对象的sign方法,传入需要签名的字节数组,得到签名字节数组。
- 最后,将签名字节数组编码为字符串,即为签名。
使用 Java 反射获取签名数据
现在,我们知道了签名计算的逻辑,接下来就可以使用Java 反射技术获取签名数据了。我们可以编写如下代码:
Class<?> signatureClass = Class.forName("com.okhttp3.internal.http.Signature");
Constructor<?> constructor = signatureClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Signature signature = (Signature) constructor.newInstance("密钥");
Method signMethod = signatureClass.getDeclaredMethod("sign", byte[].class);
signMethod.setAccessible(true);
byte[] signedBytes = (byte[]) signMethod.invoke(signature, data.getBytes());
String signature = Base64.encodeToString(signedBytes, Base64.DEFAULT);
这段代码首先获取了Signature 类的Class 对象,然后通过反射创建了一个Signature 对象,并传入密钥。接下来,它通过反射获取了Signature 类的sign 方法,并调用该方法,传入需要签名的字节数组,得到签名字节数组。最后,它将签名字节数组编码为字符串,即为签名。
示例代码
现在,我们已经掌握了签名计算的方法,接下来就可以编写示例代码了。我们可以编写如下代码:
String data = "需要签名的字符串";
String key = "密钥";
String signature = sign(data, key);
这段代码首先定义了需要签名的字符串和密钥,然后调用sign 方法计算签名。最后,它将签名打印出来。
总结
本文介绍了某手V8.x 签名计算方法的详细步骤,从抓包开始,分析Okhttp3 的源码,使用Java 反射技术获取签名数据,并使用示例代码演示了如何计算签名。希望本文对大家有所帮助。