某视频bdms_1.0.1.19_fix 192位 a_bogus参数分析(二):日志分析

上一篇:某视频bdms_1.0.1.19_fix 192位 a_bogus参数分析(一):保姆级教程定位与插桩分析 , 接下来分析日志

分析

找个搜索功能可以的编辑器,打开日志文件,我用的是vs_code,找到a_bogus信息,确认下a_bogus的值是否是请求中的a_bogus信息,确认后把日志中abogus生成前和生成后的日志删除,只保留中间生成部分的日志。
image.png

image.png

首先是生成3个时间戳,这里要注意哦,这三个时间戳的值肯定是一个比一个大,但间隔并不大,后边会时不时的用到。

image.png

然后是params通过加盐 dhzx, 得到新的值,这个盐值,不同的分类请求时,参数也不大一样,要抓一下看看

device_platform=webapp&aid=6383&channel=channel_pc_we&......&msToken=7Qb_EjuRswXtfgiDsNWN0DrqSiXSU-UxDggFeFnjfPnxFxUYI8pHQFV9Ao9tgFDe_1oKNuR0eH1ocVEX_plBZTAhEJYlbvQqyHk9ikLEJjNDf8LJEHMUe4a90VEDnxQogdcz7jgn6hukg21MUy9cXsrowo1CTkw2l8IgVfV36b2N70sx8-c%3Ddhzx

该字符串进行两次标准的SM3加密, 得到一个32位的列表,在此命名params_2SM3_list,

def sm3_hash(self, data):
    """
    计算SM3哈希值
    :param data: 输入数据(字符串或bytes)
    :return: 哈希值
    """
    # 如果输入是字符串,转换为bytes
    if isinstance(data, str):
        data = data.encode('utf-8')

    # 计算哈希值(16进制字符串)
    hash_hex = sm3.sm3_hash(list(data))
    return [int(hash_hex[i:i + 2], 16) for i in range(0, len(hash_hex), 2)]

本次抓的是get请求,所以日志显示只是dhzx,也进行了两次SM3加密,如果是post这里应该不一样,在这得到一个列表,我把它命名suffix_2SM3_list
往下看发现出现了很多次ua的信息,还有一个值key值:[0.00390625,1,12],经过跟踪发现是魔改后的rc4算法。


image.png



def rc4_change_encrypt(self, plaintext, key):
    # 初始化S盒
    s = []
    for i in range(256):
        s.append(255 - i)

    # 密钥调度算法
    j = 0
    for i in range(256):
        j = (j * s[i] + j + ord(key[i % len(key)])) % 256
        # 交换s[i]和s[j]
        s[i], s[j] = s[j], s[i]

    # 生成密钥流并加密
    i = 0
    j = 0
    cipher = []
    for k in range(len(plaintext)):
        i = (i + 1) % 256
        j = (j + s[i]) % 256
        plaintext_char_code = ord(plaintext[k])
        # 交换s[i]和s[j]
        temp = s[i]
        t = (temp + s[j]) % 256
        s[i] = s[j]
        s[j] = temp
        # 异或运算加密
        cipher.append(chr(plaintext_char_code ^ s[t]))
    # print(f"cipher列表: {cipher}")
    # print(cipher)
    return "".join(cipher)

再往下就是将rc4加密后的字符串使用魔改的base64编码一下,然后编码后的结果再进行SM3,这样又得到一个列表,这命名为ua_list,到此得到了3个列表了
image.png

接下来是处理版本号:
image.png
接下来生成随机数,根据规则生成一个8位的列表, 这8位列表就是后边140位列表的前8位,这里命名:list140_top_8
image.png

接下来生成98-99位列表,此列表分为3个部分:第一部分是50位的列表,第二部分是44位,第三部分是3-4位,第四部分是xor值

  1. 50位列表
    生成规则是一些固定值、前面生成的3个列表、时间戳、再经过一些运算得出。 需要注意的是生成的数值,和能用的50位列表的进栈日志并不在一起,而且顺序也不一致,这里需要花点时间理顺下。
    image.png
    image.png
  2. 44位
    50列表的值生成后,还不是真正的列表,只是生成了值。 然后就是44位浏览器窗口生成的列表了。这个根据自已浏览器信息得出:”2512|439|2560|1400|2560|1400|2560|1440|Win32″,字符串转成ascii列表就是,这个可以固定下来。
  3. 3-4位
    根据之前生成的时间戳timestamp2 并简单运算生成的。
  4. xor位
    list140_top_8+50位的列表未排序部分,逐个xor得出

接下来就是根据生成的这个98-99位列表,生成一个130-132位的列表,这些地方倒着从后往前看日志可能会更清晰,因为有了结果,往前搜索结果的部分值第一次出现的位置,这样定位起来更快捷。
image.png
image.png
image.png

这里虽然是用了随机数,但是算法中用了二进制互补的常量值[145, 110, 66, 189, 44, 211],运算是可以消除随机数带来的影响,所以这里在写生成函数99_to_132时,也可以同时写一个132_to_99函数以验证是否可以正常还原。

接下来入栈了一个211,
image.png
以它做为key,把132位列表再rc4,然后再base64就是最终的a_bogus了。

原文链接:http://www.itawp.com/604.html,转载请注明出处。
0

评论0

没有账号?注册  忘记密码?