某易—将军令动态刨析算法(1)
我是任雪飘,一个技术渣渣,可以加我星球一起交流!
- 我们刷新一下,得到的就是30秒会更新一次,这里我们开始进行方法刨析。
- 开始记录方法调用过程
- 点击刷新动态码后关闭记录**
- 我们整个调用过程我们简单跟一次,用包名分析,进行流程刨析,找我们关心的方法名
- 用jadx-gui 反编译我们的目标apk ,找我们前面刨析的方法名。进行分析。
下面展示一些 java代码。
// 我们这个方法传入了token和序列号
public static String b(long j, String str, String str2) {
long c2 = c(j);
long j2 = f10198a;
if (j2 > c2) {
c2 = j2;
}
return String.format(Locale.ENGLISH, "%06d", Integer.valueOf(getOtp(c2, Long.parseLong(str), d0.g(str2))));
}
c2是调用了c这个方法返回的值
public static long c(long j) {
return (System.currentTimeMillis() / 1000) - j;
}
f10198a的初始化值是等于0
private static long f10198a = 0;
先进行判断 j2>c2 是不是大于,大于的话,就c2的值等于j2,否则也就是直接用 c2本身的值。
然后调用native getOtp 去计算动态口令码。
d0.g 的Java片段如下:
public static byte[] g(String str) {
byte[] bArr = new byte[(str.length() / 2)];
for (int i2 = 0; i2 < str.length(); i2 += 2) {
bArr[i2 / 2] = (byte) ((Character.digit(str.charAt(i2), 16) << 4) + Character.digit(str.charAt(i2 + 1), 16));
}
return bArr;
}
str2 文本数据通过d0.g(str2)也就是g 这个方法计算出一个字节数组
我们直接hook 这个方法获取传入的三个参数。
第一个参数为:0
第二个参数为:序列号
第三个参数为:token
返回值为:6位数的动态码
到此我们先java 层就分析这么多!
下章节我们讲native层算法
我是任雪飘,一个技术渣渣。感谢您的观看,可以找拿hook 插件