21_某头条jsvm逆向

Date
Jul 4, 2023
Created
Mar 2, 2024 03:06 PM
Tags
JS逆向实战

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

网站

目标网站:aHR0cHM6Ly93d3cudG91dGlhby5jb20v 数据接口:aHR0cHM6Ly93d3cudG91dGlhby5jb20vYXBpL3BjL2xpc3QvZmVlZD9vZmZzZXQ9MCZjaGFubmVsX2lkPTk0MzQ5NTQ5Mzk1Jm1heF9iZWhvdF90aW1lPTAmY2F0ZWdvcnk9cGNfcHJvZmlsZV9jaGFubmVsJmRpc2FibGVfcmF3X2RhdGE9dHJ1ZSZhaWQ9MjQmYXBwX25hbWU9dG91dGlhb193ZWI=

抓包分析

这个网站的的数据包有点多,为了更好的筛选,所以我们这里使用charles去抓包,也为了更加清楚的展示。因为charles的包 是分网站的
notion image
抓到了如下的包,我们挨个看下 首先我们看看第一个请求
notion image
果然是这个数据包, 然后我们看看这个的请求参数 如下图所示
notion image
可以看到除了 | channel_id | _signature 除了这两个参数,其他值好像都是定值。 为了确保玩意,我们再抓包一次。
notion image
哦吼,我们对比一下 发现好像只有 _signature 不太一样。 第一次:
| channel_id | 94349549395 | | _signature | _02B4Z6wo00f01z9d1bwAAIDCyiI.IkUKHQM.edEAAKt.NqUmn4ygAiOSxwaKaigCOeg56Ff89u.9vP6b6ub68vuKs2N8MHE1ooq3YQAYT9luKwEo58Z5CbtbU8m9.KvQ5zIywt7.ZVQByMpff7 |
第二次
| channel_id | 94349549395 | | _signature | _02B4Z6wo00f01NpipegAAIDBLx1PdBeQ8LjaRqFAAFJAobBdiGXrf3fs2SKPrZr3jjY4vZP3kG7vB7l1w4C5LnkJNONZ-driqsx4S8hbVV4x8o4bjxJqi6BYxnSX9CGLBfcQe.nfmtpz8dZ57e |
这个值每次都不一样,所以我们可以大胆猜测 这个值就是我们所需要的值。

寻找参数生成点。

我们直接开始去搜索 _signature 这个值
notion image
刚好发现第一个地点 就很像参数生成的地方,我们在这里打上断点。然后再搜索一下
_signature
这个值
notion image
这里还有个值,我们也打上断点。
notion image
发现这个值虽然对了 ,但是好像传的参数不是我们所要的那个链接啊
notion image
notion image
我们继续往下走,跳过非我们所需的接口 也就是看看
F.getUri(e)
这个值。 在跳过三个请求后 终于找到我们所需要的这个接口了
notion image
我们接下里就逐步进栈。然后一直追。这个时候要有些耐心。 在经过几层跳站,终于找到了 参数生成的地点,这个a.call(n, o) 就是生成签名的地方。
notion image
notion image
我们可以看到 这个o 是个对象,里面是存放的url键值对。 而这个n 应该就是函数,我们把这个n抠出来,应该就大功告成了。

网站扣代码

接上一段。 我们打上断点再逐步进栈。
notion image
然后发现进到了acrawler.js 这个文件里面。我们简单过一下这个文件。发现这是个自执行函数啊。那我们直接全部复制下来补环境是不是就ok了。 我们试一试哈。 这里复制下来。会发现后面执行的参数很长,很影响观感。pycharm 设置一下js换行。
notion image
如上图设置即可。
我们在下面执行这句话。为什么是这句话呢。我们跳到外面这个栈去看看
window.byted_acrawler.sign({ "url":"<http://localhost:8080>" })
notion image
然后运行。这个时候会报错
notion image
这个时候就奇怪了。这个地方怎么会报错呢。我们打印一下282行这个值看看。 分别打印下
S[R]
R
A
你就全懂了。尤其是是打印
A
这不就是妥妥的环境检测吗
notion image
我们给他补上
window = global; window.document = { referrer: '' }
然后我们再次运行,发现还是不行 会报找不到sign这个值
notion image
那这就奇怪了,我们放到浏览器环境上运行下看看
notion image
发现在浏览器上流程运行,那就只有一种可能了,就是环境没补好。有些环境检测过不去。 我们把断点打在这个地方,这就是底下传参的地方
notion image
经过不断的 debugger 测试,将下图的两句话 改成
undefined
notion image
改好之后还会报一个错 ,我们再补上
notion image
由于这个location里面东西也不是很多,我们就全补上了
window.location = { "ancestorOrigins": {}, "href": "<https://www.toutiao.com/?wid=1688368231201>", "origin": "<https://www.toutiao.com>", "protocol": "https:", "host": "www.toutiao.com", "hostname": "www.toutiao.com", "port": "", "pathname": "/", "search": "?wid=1688368231201", "hash": "" }
然后还会报一个 Useragent的错误
notion image
我们继续补上
navigator = { "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67' }
然后就扣代码扣成功了。
notion image
这个值好短啊。我们对比一下
_02B4Z6wo00f01vfjpbwAAIDBCBxaQ1vn84b3waEAANlo3f _02B4Z6wo00f01z9d1bwAAIDCyiI.IkUKHQM.edEAAKt.NqUmn4ygAiOSxwaKaigCOeg56Ff89u.9vP6b6ub68vuKs2N8MHE1ooq3YQAYT9luKwEo58Z5CbtbU8m9.KvQ5zIywt7.ZVQByMpff7
足足长了一大截。 我们再挨个进断点看看。在如图的位置打上断点。挨个追栈查看。
notion image
后面发现在之前获取浏览器环境中发现,在出_signature之前,获取过一次cookie 所以我们还需要加上cookie 直接写死即可
document.cookie = 'msToken=YT_CAKC4j1yOwgMxbB2jtTTvxroozg34lnY5cf7g7_JSz377gE4XfhP07HZPUjoaoHEVch4egS8RXblHNVYDeiZruwFzZD7GNPayfzsnWyA=; __ac_signature=_02B4Z6wo00f017cKGvwAAIDCQnXwY7ZFvKO3Lh5AAIlpCKNViv2DVvvH6x4q.QT77MgQzrAiF9hMRCiHWWaFPKyKg89Jhy8HzzWEsxOCL0uGv6qSBlqyWa5ptCRdbDDYlnceGFmxuIms3oCRf6; local_city_cache=%E8%8B%8F%E5%B7%9E; csrftoken=a08a7c6e066f7118fe2f379bb779e6f5; _ga_QEHZPBE5HH=GS1.1.1688368982.1.0.1688368982.0.0.0; _ga=GA1.1.1087552243.1688368983; s_v_web_id=verify_ljmjastc_1G6Mv2zQ_Y8pE_4qln_8mk4_sM1M5ze46FYX; tt_scid=F-2KEY1R0ROnAeE9XHLVYZZuLIETYppB9GsM9UL-TAMWFnDlcgdmDViPv9tGci1rf76e'
然后就能运行成功了
notion image
然后我们封装一下 顺便替换一下某些值。

结果

部分代码如下图
notion image
完成!!
notion image