吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13558|回复: 173
收起左侧

[Web逆向] xx艺视频wasm转js分析,cmd5x算法脱离环境限制

    [复制链接]
漁滒 发表于 2021-11-23 11:16

@TOC

1.js代码扣取

文献1:XX视频H5解析分析过程
文献2:爱奇艺视频cmd5x解析算法的移植分析和实现<Nodejs>(2019-08)

本篇文章建立在上面两篇文章的前提下,所以部分已经提到过的内容,就不再重复叙述

首先直接过滤视频信息接口

5.jpg

可以看到来自于pcweb.wonder.js,打开这个js

6.jpg
搜索【vf=】,只有一个结果,在生成之前下一个断点,重新加载网页。断点断下后可以看到,【r】参数是由【cmd5x】方法的得到,参数就是视频url的一部分。

7.jpg

进入cmd5x方法后,可以看到这个是webpack打包的js,使用了里面的第295个方法。那先把这个js下载,然后扣出来本地先测试一下。

8.jpg

在一般的webpack前面还有一段其他的函数,先手动删除,然后用之前的一键扣webpack来测试一下


非常漂亮,没有报错,跑一下导出函数是否正常

可惜报错了,这里出现了document,那么直接上jsdom。

可以出结果了,难道就这么简单?经过测试发现,生成的值和浏览器的不一样,这就是被检测node环境了

2.ast反混淆,平坦流

不着急,接下来单独把295的整个函数体拿出来调试

可以看到一开始有一个大数组,明显的ob混淆特征,用ast先去掉这个混淆看看

9.jpg

这时字符串都被还原回去了,但是还有很多了类似【"jxnRC" !== "fsFmd"】这样恒真或者恒假的代码,把这也处理一下

10.jpg
这时逻辑就更加清晰了,但是还有一些代码是在break或者return后面,是一定不会执行的废代码,也一起去掉吧

11.jpg
12.jpg

这时分析就更加方便了

13.jpg

通过上图可以确定,这个其实就是调用的wasm,但是网页并没有加载wasm文件,也没有把文件在写js中,哪里来的wasm呢?

实际上这个js是把wasm转换成了js,所有的逻辑都用js来完成

14.jpg
通过fd替换js文件后可以发现,js调用【cmd5x】方法实际就是调用的是【g】方法,这里的【g】方法应该理解成一个js层的方法

下面就可以分析出这个方法内部的逻辑,这里需要一个wasm调用的基本知识

15.jpg
1.首先是计算参数url的长度
2.然后申请申请长度+1的内存空间(因为字符串是以字节0结尾的,需要把这个算上)
3.然后把参数url复制到内存,然后调用【f】方法计算,这里的【f】应该理解为wasm层的方法
4.计算完成后释放之前申请的参数url的内存
5.然后把cmd5x计算的结果从内存中读出来,最后把这个计算结果的内存也释放掉

这里的重点明显就是这个【f】的函数了

16.jpg
wasm层的cmd5x函数绑定的是【ca】这个函数

17.jpg
但是【ca】函数这个控制流太恐怖了,有170+个case,直接分析明显是不明智的

3.脱离环境与调用

这里有一个点是,实际我们可以不分析这个【ca】函数,因为我们之前试过计算vf,是因为被检测了node的环境。但是wasm又无法直接操作BOM和DOM,如果wasm中要检测环境,这是一定要通过导入函数,才能进行检测的。所以,可以先分析一下调用到的所有导入函数。

18.jpg
这里的【bL】就是导入函数,就是参数的【b7】,也就是上面的【aI、L、M、aU、aV、aY、aX、aQ】

查看各个函数后发现,除了【aU】这个函数,其他都是非常短的,没有出现检测点

19.jpg

【aU】这个函数非常长,还有控制流,并且存在明显的检测点,所以这时应该分析的是这个函数。首先还是尝试使用ast去除控制流。过程稍微有点长,就不详细叙述

20.jpg
去除了控制流后,分析就简单很多,可以很明显的看出检测的地方。在我调试的时候,就发现了其中的秘密。我替换网页的js后发现,当环境检测正确时,这个函数的返回值必定是6,否则就会得出和浏览器不一致的结果。所以可以直接进行以下的修改

  function aU() {
    return 6;
  }

21.jpg

此时再运行js可以发现,结果就和网页的一模一样了

js调用方法


const t = require('./295_decrypt');
const vf = t.cmd5x('/dash?tvid=114869400&bid=300&vid=eac5b7e5c7d6c471a6635725f0173fdc&src=01010031010000000000&vt=0&rs=1&uid=1626142844&ori=pcw&ps=0&k_uid=49c360579e9a7cf874d599de913c6bff&pt=0&d=0&s=&lid=&cf=&ct=&authKey=b66ff0001e1568368db1f0827830ffeb&k_tag=1&ost=0&ppt=0&dfp=a11d64e2e196534268a0b9ab3908bffd86cec25e335c3269344667023b08b60afe&locale=zh_cn&prio=%7B%22ff%22%3A%22f4v%22%2C%22code%22%3A2%7D&pck=4aT95ShhWNgoEXxVzhFwU28qb6fXgiMIWS7d3DjB1t2KBKGj8m1Npt3LUz3KQauw35i99&k_err_retries=0&up=&qd_v=2&tm=1637337797663&qdy=a&qds=0&k_ft1=706436220846084&k_ft4=1162183859249156&k_ft5=262145&bop=%7B%22version%22%3A%2210.0%22%2C%22dfp%22%3A%22a11d64e2e196534268a0b9ab3908bffd86cec25e335c3269344667023b08b60afe%22%7D&ut=1');

console.log(vf);

python调用方法

首先安装依赖库 pip install node_vm2

def get_vf(url):
    from node_vm2 import NodeVM
    with open('295_decrypt.js', 'r', encoding='utf-8') as f:
        js = f.read()
    module = NodeVM.code(js)
    vf = module.call_member('cmd5x', url)
    print(vf)

if __name__ == '__main__':
    main()

移植并优化后的文件

https://pan.lanzoui.com/i0DEiwstteh

22.jpg

4.jpg
3.jpg
1.jpg
2.jpg

免费评分

参与人数 56吾爱币 +60 热心值 +50 收起 理由
隔壁家的王二狗 + 1 + 1 我很赞同!
heartfilia + 1 + 1 渔歌强啊
luozi1653 + 1 + 1 热心回复!
Bang520 + 1 + 1 我很赞同!
Cody1111 + 1 + 1 谢谢@Thanks!
xinjun_ying + 1 热心回复!
go2van + 1 + 1 谢谢@Thanks!
lvkirs + 1 + 1 我很赞同!
soyadokio + 1 + 1 我很赞同!
二十瞬 + 1 + 1 用心讨论,共获提升!
heimaojingzhang + 1 + 1 热心回复!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
0x02 + 1 + 1 我很赞同!
404undefined + 1 + 1 热心回复!
zhixiangwangluo + 1 + 1 我很赞同!
13699513436 + 1 谢谢@Thanks!
victos + 1 + 1 谢谢@Thanks!
monk3435 + 1 + 1 用心讨论,共获提升!
白衣登临 + 1 + 1 我很赞同!
it_harry + 1 + 1 谢谢@Thanks!
neal5808 + 1 热心回复!
wuaidh + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xmrrrrr + 1 + 1 虽然看不懂,瞄了几眼想说,然怪程序员掉头发。
raycerlane + 1 用心讨论,共获提升!
gaosld + 1 + 1 谢谢@Thanks!
netCheney + 1 + 1 用心讨论,共获提升!
pelephone + 1 + 1 我很赞同!
Cay丶 + 1 用心讨论,共获提升!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
耳食之辈 + 1 用心讨论,共获提升!
w516258928 + 1 热心回复!
ccwuax + 1 + 1 用心讨论,共获提升!
ofo + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
-yuy- + 1 + 1 用心讨论,共获提升!
longling + 1 + 1 用心讨论,共获提升!
XhyEax + 3 + 1 我很赞同!
yixi + 1 + 1 谢谢@Thanks!
努力加载中 + 1 + 1 谢谢@Thanks!
三千晚 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
dragonjelly + 1 + 1 感谢大牛的分享,学习了
Stoneone + 1 + 1 谢谢@Thanks!
lk0527 + 1 + 1 谢谢@Thanks!
yu6319119 + 1 + 1 谢谢@Thanks!
xiangyujayfun + 1 + 1 我很赞同!
Virginal + 1 热心回复!
jpy177 + 1 + 1 用心讨论,共获提升!
夜泉 + 1 + 1 谢谢@Thanks!
Rezalt + 1 + 1 用心讨论,共获提升!
asd效 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
qa2080639 + 1 + 1 用心讨论,共获提升!
mmkk3215849 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
细水流长 + 3 + 1 热心回复!
aighsn + 1 我很赞同!
踮起脚尖过日子 + 1 + 1 谢谢@Thanks!
李佑辰 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

李佑辰 发表于 2021-11-23 11:20
写的不错,很详细呀!
wushengli 发表于 2021-11-24 08:48
头像被屏蔽
longskr 发表于 2021-11-23 12:28
先插个眼,慢慢看

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
kanmanli + 1 + 1 热心回复!

查看全部评分

Tan95 发表于 2021-11-23 11:22
写的不错,很详细呀!
UndCover 发表于 2021-11-23 11:29
看的眼都要花了
wasm2023 发表于 2021-11-23 11:34
好的文章需要支持一下
头像被屏蔽
86618513 发表于 2021-11-23 11:41
很多地方没看懂,大神
JPK 发表于 2021-11-23 11:48
写的很细致了,赞哦
dadadahao 发表于 2021-11-23 11:48
大佬nb,感谢分享!
minibeetuaman 发表于 2021-11-23 12:27
楼主真是高产呀!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表