我们搜索加密参数 unique_code 很容易定位到加密的地方 其中,还有一个3des加密也在同一个类下面,而这个3des就是data的算法,分析过程和之前分析证书的时候一致,iv向量在so里面,密钥在这个类里面有定义,就不详细说了,Java层很简单的东西
如上图所示 非常简单,一个new 的实例化,然后调用其类下gen方法,传进去一个时间戳getcode后的
getcode其实就是一个取"26"进制的一个操作吧hhhh,但是它反编译出来的Java明显是有问题的,我们还原一下代码
紧接着,我们找到加密所调用的所有方法
把它们改写到一起,放服务器上供我们使用API调用
https://taisuii.cn/dow/server.jar
下载jar包,然后运行
java -jar server.jar
最后 贴上算法,3des那个就不整了,随便找个加密库传密钥和IV就能搞定
package com.example.demo;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class Test {
public static void main(String[] args) {
long time = 1657375086688L;
String getCode = getCode(time);
time = (time / 1000) / 30;
System.out.println(_gen(getCode.getBytes(),time));
}
private static String _gen(byte[] bArr, long j) {
byte[] bArr2 = new byte[8];
long r10 = j;
for (int i = 7; i >= 0; i--) {
bArr2[i] = (byte) (255 & r10);
r10 >>>= '\b';
}
byte[] _hmacSHA1Encrypt = _hmacSHA1Encrypt(bArr, bArr2);
int i2 = _hmacSHA1Encrypt[19] & 15;
return String.format("%06d", Integer.valueOf(((_hmacSHA1Encrypt[i2 + 3] & 255) | ((((_hmacSHA1Encrypt[i2] & Byte.MAX_VALUE) << 24) | ((_hmacSHA1Encrypt[i2 + 1] & 255) << 16)) | ((_hmacSHA1Encrypt[i2 + 2] & 255) << 8))) % 1000000));
}
private static byte[] _hmacSHA1Encrypt(byte[] bArr, byte[] bArr2) {
try {
Mac mac = Mac.getInstance("HMACSHA1");
mac.init(new SecretKeySpec(bArr, "HMACSHA1"));
return mac.doFinal(bArr2);
} catch (Exception e) {
throw new RuntimeException("hmacSHA1加密失败", e);
}
}
public static String getCode(long j) {
int i = 0;
String str = "";
long r5 = j;
while (true) {
String str2 = str;
if (r5 > 0) {
i = (int) (r5 % 26);
r5 = (r5 - ((int) (r5 % 26))) / 26;
char[] charArray = "ZFCDGHQABNOPIEJRSTUVMWXKLY".toCharArray();
str = str2 + charArray[i];
} else {
return str2;
}
}
}
}