抖音ab纯算

整体思路

第一步先在vmp入口插桩,打印日志,大致走一遍分析ab生成流程,简单过一遍然后记笔记初略记下ab生成过程

第二步就是把 + – * % &等运算符都给打上插桩点 按照如下的方式去打 这个时候就能开始分析了

首先可以看到通过url的后缀然后加上 dhzx 得到

“device_platform=webapp&aid=6383&channel=channel_pc_web&item_id=7601847300369444971&comment_id=7601900513219822385&cut_version=1&cursor=0&count=3&item_type=0&update_version_code=170400&pc_client_type=1&pc_libra_divert=Windows&support_h265=1&support_dash=1&cpu_core_num=16&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=2560&screen_height=1440&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=144.0.0.0&browser_online=true&engine_name=Blink&engine_version=144.0.0.0&os_name=Windows&os_version=10&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7603564721123935787&uifid=41de20d2c8c0372836b7333ed3b868523ae3b3b747399417a35ee29432002d5c32534e4660c02255dc893291403d57df3148e0fd56fa88330c85e308b0a29143df3ea897de2290658bc83eda31ce15022c221057d0fd1b8f1fd592e615b42857f00cb5cec4b13d2af2f9abec2f246a978cfd5fc6461f7a9f5ec14b8c04744c6fca30689308196ba4b1fa3f5203883ecedd300b173cb8c332b795b95706504edb&msToken=kjOMTgTDQd_d1qo9BwgFx6ASPZ6KYss4mSRCz8aY5q_sRGibw5pNkOGSUmf5C9Vit8cqvMGK5VVkCOA3554lm5Rfjw-UqxyxPt73OWO1AVbr2YZygqM8S2XdC1xo9_M1MkOxyIqe7D-tkHOds7c-a86J-h0Z_3HQqkn1vC8LNKjxdhzx”

然后调用了如图的函数生成了32位数组,点进去发现是类似于加密算法之类的代码

首先可以去测试一下是不是为标准算法,如果不是标准算法的话可以将一下的函数丢给ai 让ai分析大致的魔改算法

不过图中的是标准的sm3,网站上测试一下就知道了 即sm3(sm3(搜索参数+dhzx))

接着又用dhzx进行了sm3加密 也是sm3(sm3(dhzx))

然后这里是第一次rc4加密的key 利用fromcharcode生成的,从箭头这里开始都是rc4在进行加密运算了 不懂的可以问ai

这是还原算法 这个rc4是魔改的 魔改点的key变成了一个数组 256位数组为倒序数组

def bdms_rc4_encrypt(user_agent):
    key = [0, 1, 8]

    s = [255 - i for i in range(256)]

    j = 0
    for i in range(256):
        j = (j * s[i] + j + key[i % len(key)]) % 256

        s[i], s[j] = s[j], s[i]

    data_bytes = [ord(c) for c in user_agent]

    result = []
    a = 0
    b = 0

    for k in range(len(data_bytes)):
        a = (a + 1) % 256
        b = (b + s[a]) % 256

        s[a], s[b] = s[b], s[a]

        t = (s[a] + s[b]) % 256

        result.append(data_bytes[k] ^ s[t])

    return result

传入了ua 然后进行了rc4加密 到最后会生成一个字节流

到这里ua就加密完了 然后下面的这个数组,就是魔改的base64码表 我直接说了 他取了s3 ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe 作为base64算法的码表

然后利用加密完的ua再次魔改base64进行加密

最后得到了加密后的字符串fmUmtNjj1OfTrR716RHSHkEyO55LH9cpXtzIQ2cGu4OGyLadRAIoz3CqCBP8kDqzpxV7FE0STcZAPIZ3+A7vRV1DxZB7jVkeelhZP1IOjUd3/XUomeAEsdm/hlnEo9KrgcExEO5znbahc4jEtHXD

接着就是获取当前时间 然后计算一大堆 不知道干啥 后面用到再讲

这里是环境数组加密 用charcodeat 和循环 组成一个44位或43位数组

这个就是43位数组 要记号

这里就是50位数组的地方 50位数组+44位数组+4位数组+1位数组组成99位数组 有时候是98位

然后利用98位数组 和随机数以及运算 就得到了132数组

然后这个140位数组 就是132数组+8位数组 8位数组的话经过验证是随机数来的 直接复制网页的就行了 这里的140位数组会fromcharcode然后转换成字节流(这个要用 其实不转也可以)

得到了140位数组后 你就会发现他下面又要开始运算了 有没有觉得这个很熟悉 对 就是rc4

不过他这次的rc4跟一开始的rc4不一样 他是传入了数组进行运算的 然后这个 211 则是rc4的key 其实当一个东西 一直重复调用(这个211) 然后又在算法里面且这个值相对特殊 就可以判断这个就是key了

然后就是又一轮rc4加密了

到最后就生成了这一串东西 箭头所指的是随机数生成的

然后就是再一轮base64算法 这次拿的是s4下标的码表然后计算完ab就出值了

50位数组

单纯的通过这点日志是看不出来50位数组生成逻辑滴

  1. 可以通过插全局桩,判断哪些指令数组赋值 取值最多,然后在这些地方插桩
  2. 可以直接在jsvmp上直接找数组赋值取值的地方 因为这jsvmp挺短的 很快就能找到插桩点

核心插桩点就是这两个(首先插一个U[x],这里就是50位数组暴露的地方,既然都在这里暴露了,那说明U里面是有50位数组操作后的值的,也就是U里面是包含了整个50位数组的,所以全局搜U[ 查看这个U是在哪里赋值的 这时候就会找到第二个插桩点了 就是第二个图)

插了全局桩后你就能发现这些东西这里就是50位数组生成的地方 上面则是生成每一位数在U中的下标 通过下标就能找到具体的生成逻辑

最后就是展示结果

笔者水平有限,如有疑问,欢迎留言指正,一起交流,有任何问题可以添加我微信;
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇