某易—将军令动态刨析算法(1)

某易—将军令动态刨析算法(1)

我是任雪飘,一个技术渣渣,可以加我星球一起交流!
某易—将军令动态刨析算法(1)_第1张图片

  • 我们刷新一下,得到的就是30秒会更新一次,这里我们开始进行方法刨析。

某易—将军令动态刨析算法(1)_第2张图片

  • 开始记录方法调用过程
  • 点击刷新动态码后关闭记录**

某易—将军令动态刨析算法(1)_第3张图片

  • 我们整个调用过程我们简单跟一次,用包名分析,进行流程刨析,找我们关心的方法名
    某易—将军令动态刨析算法(1)_第4张图片
  • 用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 这个方法获取传入的三个参数。
某易—将军令动态刨析算法(1)_第5张图片
第一个参数为:0
第二个参数为:序列号
第三个参数为:token
返回值为:6位数的动态码
某易—将军令动态刨析算法(1)_第6张图片

到此我们先java 层就分析这么多!

下章节我们讲native层算法

我是任雪飘,一个技术渣渣。感谢您的观看,可以找拿hook 插件

你可能感兴趣的:(java,算法,安全,网络,服务器)