抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版

接口及参数

  1. 打开网页版抖音,右键视频进入详情页。
  2. F12打开控制台筛选detail,然后刷新网页,找到请求。
  3. 可以发现我们本次的参数目标a_bogus。a_bogus有时长度为168有时为172,都可用。
  4. msToken在cookie中可以获得msToken,过期时间为7天。
  5. screen_width、screen_height对应cookie中的dy_swidth、dy_sheight。
  6. cpu_core_num、device_memory对应cookie中的device_web_cpu_core、device_web_memory_size。
  7. verifyFp、fp对应cookie中的s_v_web_id。
  8. webid可以从doc中获得user_unique_id。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

找到加密代码

  • 找到入口

    首先看一下接口的加载器,也就是发送请求的调用栈,挨个查看之后不难发现,加密的入口应该在这两处,由于栈中的调用顺序是从下往上,所以我们先看下面那个入口。

    在这里插入图片描述

  • 查看参数

    首先我们查看入口参数,不难发现arguments[1]是请求的url,那么我们可以根据url包含detail去打一个断点,然后一步一步进行调试,看看发生了什么。

    入口参数

  • 断点调试

    单步步入之后,开始了加密参数的流程,我们发现这里的代码明显是混淆过的,上下翻动后,我们发现这是jsvmp文件。单步跳出后,直接到了请求流程,说明在这里面已经完成了a_bogus的加密,所以我们可以断定,加密参数是在调用栈中另一个地方调用的。所以我们再查看一下调用栈中的另一个入口。

    在这里插入图片描述

    可以看到,加密最后运行的函数是s.apply(b,u)并且赋值给了l,那么我们可以大胆猜测一下,这个l就是返回的加密结果,但是我们知道request中有很多加密参数,而且这个代码是jsvmp,所以我们可以认为,这里是调用了jsvmp的指令函数,这个指令函数加密了我们的a_bogus,但是也被其他的一些需求调用,所以说我们要定位到加密a_bogus的时机。

    加密入口
    我们可以知道a_bogus的长度为172,所以我们可以在这里打条件断点,当s.apply(b,u).length === 172时断住。然后进行观察。

    在这里插入图片描述

    断住之后,我们发现结果大概率是我们要的a_bogus,后面我们会验证一下,参数为uri以及UserAgent。那么我们之后调用的时候,可以直接调用这个函数,把相应的参数传进去就可以得到我们想要的结果。由于这个s.apply可能调用的函数有很多种,我们不知道它调用的具体函数是哪个,因此,我们需要找到函数调用入口也就是函数导出。至此我们先验证一下结果。

    在这里插入图片描述
    在这里插入图片描述

补环境

  1. 首先我们把整个bdms.js拿下来,本地运行,进行补环境。

  2. 然后运行后发现window is not defined,我们定义一个window=global补个window环境再试试看。

    window

  3. 我们发现这里莫名其妙报了个错,由于代码混淆加上各种循环,很难找到这个变量是什么,所以我们猜测,大概率是获取某些环境没有获取到,所以我们加代理看看他获取了什么没获取到导致的。我们添加下列代理来看看检测了哪些环境。

    function get_enviroment(proxy_array) {for (var i = 0; i < proxy_array.length; i++) {handler = '{\n' +'    get: function(target, property, receiver) {\n' +'        console.log("方法:", "get  ", "对象:", ' +'"' + proxy_array[i] + '" ,' +'"  属性:", property, ' +'"  属性类型:", ' + 'typeof property, ' +// '"  属性值:", ' + 'target[property], ' +'"  属性值类型:", typeof target[property]);\n' +'        return target[property];\n' +'    },\n' +'    set: function(target, property, value, receiver) {\n' +'        console.log("方法:", "set  ", "对象:", ' +'"' + proxy_array[i] + '" ,' +'"  属性:", property, ' +'"  属性类型:", ' + 'typeof property, ' +// '"  属性值:", ' + 'target[property], ' +'"  属性值类型:", typeof target[property]);\n' +'        return Reflect.set(...arguments);\n' +'    }\n' +'}'eval('try{\n' + proxy_array[i] + ';\n'+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}catch (e) {\n' + proxy_array[i] + '={};\n'+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}')}
    }
    proxy_array = ['window', 'document', 'location', 'navigator', 'history', 'screen', 'aaa', 'target']
    get_enviroment(proxy_array)
    
  4. 我们发现,检测的还不少。加上代理之后我们发现,在访问wondow.requestAnimationFrame时没访问到,然后紧接着报错了,那么说明,对window.requestAnimationFrame进行了校验,因此我们可以补一下 ,这个是一个函数,我们补一个空函数试试。

    补环境

  5. 补完后发现又有报错。我们发现访问window._sdkGlueVersionMap时XMLHttpRequest报错,那我们都补一下。我们可以到浏览器的控制台获取window._sdkGlueVersionMap的值。

    补环境
    补环境

  6. 全部补完之后我们发现终于没报错了,说明正常运行了,下一步我们需要找到加密函数的入口,然后进行最后的加密操作。

    完成补环境

函数入口

我们重新断点进入,看看到底调用了什么,我们可以发现,首次调用的函数是这里,我们可以单步调试进去看一下什么时候调用的s.apply。

在这里插入图片描述
断住之后,我们进去看看什么时候调用到了我们需要的s.apply,所以我们需要在s.aaply处打个断点。打住断点之后,由于我们之前在这里断点过,所以我们可以通过查看u[3]的url是否包含我们的本次请求detail查看。

在这里插入图片描述
断住s.apply后,我们可以知道这里调用的函数就是我们需要的导出的函数,我们单步步入,发现是这个函数。这个函数的样子我们好像见过,没错这个函数有好几处,我们可以通过59 !== m找到他。我们可以看到实际上u = function (),把加密函数赋值给了u,所以我们直接在这里导出即可,对了,别忘了加上,

在这里插入图片描述

凑合用的结果

结果
其中我们发现,调用sign之后又多检测了很多环境变量,为了环境更加真实和防止被检测的风险,尽量补全环境是最好的,即使会降低运行速度,如果追求运行速度我们可以尝试难度更高的纯算逆向。

而且补空函数并不能通过环境的检测,因此我们需要把整个环境补全,最终补全的环境代码如下:

window = globaldocument = {}
document.all = {}  // 全局搜索document.all发现并没有检测,因此这里不补typeof
navigator = {}
navigator.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
document.createElement = function (name) {if (name == 'span') {return [{}]}
}
document.documentElement = '<html></html>'
document.createEvent = function () {return 'createEvent() { [native code] }'
}
document.createElement = function () {return 'createElement() { [native code] }'
}
window.requestAnimationFrame = function () {return 'requestAnimationFrame() { [native code] }'
}
window._sdkGlueVersionMap = {"sdkGlueVersion": "1.0.0.51","bdmsVersion": "1.0.1.5","captchaVersion": "4.0.2"
}
XMLHttpRequest = function () {return 'XMLHttpRequest() { [native code] }'
}window.fetch = function () {return `(input, init) {var _this6 = this;var url, method;if (IS_REQUEST_API_SUPPORTED && input instanceof Request) {url = input.url;method = input.method…`
}window.onwheelx = {"_Ax": "0X21"
}navigator.vendorSubs = {"ink": 1718453241914
}
window.innerWidth = 1920
window.innerHeight = 1080
window.outerWidth = 1914
window.outerHeight = 1026
window.screenX = 2563
window.screenY = 412
window.pageYOffset = 0
window.pageYOffset = 0
window.screen = {availWidth: 1920,availHeight: 1032,width: 1920,height: 1080,colorDepth: 24,pixelDepth: 24,orientation: {type: "landscape-primary",angle: 0},
};
navigator.platform = 'Win32'
document.body = '<body></body>'

全环境补完正确结果

在这里插入图片描述

测试

在这里插入图片描述
在这里插入图片描述
成功!!!

需要注意的是,每个接口加密参数不同需要自己去探索,其中详情接口和回复接口如下:

在这里插入图片描述

项目参考

这是我写的爬虫项目,后续抖音部分将全面更新为a_bogus算法,敬请关注。

https://github.com/ShilongLee/Crawler

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Python语言调用讯飞星火认知大模型接口实战指南

什么是API接口 API&#xff08;应用程序编程接口&#xff09;是一组规则&#xff0c;允许不同的软件系统相互通信。通过API&#xff0c;开发者可以访问外部系统的功能和数据&#xff0c;而无需了解其内部实现。 API接口就像一座桥梁&#xff0c;连接应用程序和服务。例如&…

2024-06-17 问AI: 在深度学习中,harmonic mean是什么?

文心一言 在深度学习中&#xff0c;**harmonic mean&#xff08;调和平均数&#xff09;**是一个用于评估模型性能的指标&#xff0c;特别是在处理不平衡的数据集或需要综合多个评估指标的场景中。以下是关于harmonic mean在深度学习中应用的详细解释&#xff1a; 定义&#…

重学java 71.网络编程

人生不是坐等暴风雨过去&#xff0c;而是学会在雨中起舞 —— 24.6.14 一、网络编程的基础概念 1.概述&#xff1a; 在网络通信协议下,不同计算机上运行的程序,进行数据传输 比如&#xff1a;通信、视频通话、网络、邮件 只要是计算机之间通过网络进行数据传输&#xff0c;就有…

nginx安装环境部署(完整步骤)

在部署nginx前&#xff0c;我们需要进行环境的部署 1.编译工具gcc&#xff0c;g,autoconf&#xff0c;automake &#xff0c;make sudo apt-get install gcc g autoconf automake make 2.依赖库zlib&#xff0c;openssl&#xff0c;pcre 2.1 openssl下载地址 https://www.open…

大数据分析-二手车用户数据可视化分析

项目背景 在当今的大数据时代&#xff0c;数据可视化扮演着至关重要的角色。随着信息的爆炸式增长&#xff0c;我们面临着前所未有的数据挑战。这些数据可能来自社交媒体、商业交易、科学研究、医疗记录等各个领域&#xff0c;它们庞大而复杂&#xff0c;难以通过传统的数据处…

找工作小项目:day16-重构核心库、使用智能指针(2)

day16-重构核心库、使用智能指针 太多了分一篇写。 5、EventLoop 这是一个事件轮询&#xff0c;在这个部分会通过Poller进行就绪事件的获取&#xff0c;并将事件进行处理。 头文件 这里使用了一个智能指针并使用的是unique_ptr指向Poller红黑树&#xff0c;防止所有权不止…

线程池吞掉异常的case:源码阅读与解决方法

1. 问题背景 有一天给同事CR&#xff0c;看到一段这样的代码 try {for (param : params) {//并发处理&#xff0c;func无返回值ThreadPool.submit(func(param));} } catch (Exception e) {log.info("func抛异常啦,参数是:{}", param) } 我&#xff1a;你这段代码是…

六西格玛助力便携式产品功耗大降:打造绿色节能新标杆!

随着功能的日益强大&#xff0c;便携式电子产品的功耗问题也日益凸显&#xff0c;成为制约产品性能提升和用户体验改善的关键因素。为了应对这一挑战&#xff0c;越来越多的企业开始探索应用六西格玛方法来降低便携式产品的功耗&#xff0c;实现绿色节能的目标。 六西格玛是一…

Enhancing CLIP with GPT-4: Harnessing Visual Descriptions as Prompts

标题&#xff1a;用GPT-4增强CLIP:利用视觉描述作为提示 源文链接&#xff1a;Maniparambil_Enhancing_CLIP_with_GPT-4_Harnessing_Visual_Descriptions_as_Prompts_ICCVW_2023_paper.pdf (thecvf.com)https://openaccess.thecvf.com/content/ICCV2023W/MMFM/papers/Manipara…

FPGA - 滤波器 - IIR滤波器设计

一&#xff0c;IIR滤波器 在FPGA - 滤波器 - FIR滤波器设计中可知&#xff0c;数字滤波器是一个时域离散系统。任何一个时域离散系统都可以用一个N阶差分方程来表示&#xff0c;即&#xff1a; 式中&#xff0c;x(n)和y(n)分别是系统的输入序列和输出序列&#xff1b;aj和bi均为…

大腾智能正式入驻华为云

5月30日&#xff0c;大腾智能正式入驻华为云云商店。作为一家基于云原生的国产工业软件与数字化协同平台&#xff0c;大腾智能专注于推动企业数字化转型与升级&#xff0c;为企业提供一系列专业、高效的云原生数字化软件及方案。 华为云云商店&#xff0c;作为业界标杆&#xf…

【Win】识别Hyper-V虚拟机第一代与第二代及其差异

Hyper-V作为微软强大的虚拟化平台&#xff0c;允许用户创建虚拟机并安装各种操作系统。但您是否知道Hyper-V虚拟机分为第一代和第二代&#xff0c;并且它们之间存在一些关键差异&#xff1f;本文将指导您如何识别您的虚拟机属于哪一代&#xff0c;并详细解释两者之间的主要区别…

小白Linux提权

1.脏牛提权 原因&#xff1a; 内存子系统处理写入复制时&#xff0c;发生内存条件竞争&#xff0c;任务执行顺序异常&#xff0c;可导致应用崩溃&#xff0c;进一步执行其他代码。get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中&#xff0c;可能产出竞态…

Avalonia for VSCode

1、在VSCode中编辑AvaloniaUI界面&#xff0c;在VSCode中搜索Avalonia&#xff0c;并安装。如下图&#xff0c;可以发现Avalonia for VSCode还是预览版。 2、 创建一个Avalonia 项目。 选择项目类型 输入项目名称 选择项目所在文件夹 打开项目 3、项目架构如下图。 4、builde…

ICBINP - “I Can‘t Believe It‘s Not Photography“

ICBINP - “I Can’t Believe It’s Not Photography” 推荐设置&#xff1a; DPM 3M SDE Karras or DPM 2M Karras, 20-30 steps, 2.5-5 CFG (or use Dynamic Thresholding), happiest at 640x960 with a hires fix on top, but if you are happy to hunt through seeds to a…

汇聚荣拼多多运营策略是怎么样的?

拼多多作为中国领先的电商平台&#xff0c;其运营策略一直备受关注。拼多多的成功不仅在于其创新的“社交电商”模式&#xff0c;更在于其精细化的市场定位和高效的用户增长策略。本文将深入分析拼多多的运营策略&#xff0c;探讨其如何在激烈的电商竞争中突围而出。 一、用户增…

基于Java的度分秒坐标转纯经纬度坐标的漂亮国基地信息管理

目录 前言 一、空间表设计 1、物理表结构 二、后台数据管理 1、数据去重 2、去重的具体实现 3、度分秒数据格式转换 4、具体的转换方法 5、新增界面的实现 三、数据管理界面 总结 前言 众所周知&#xff0c;漂亮国在全球范围内部署了大量的基地&#xff0c;用以维持其…

Unity OpenCVForUnity 安装和第一个案例详解 <一>

目录 一、资源简介 二、安装使用 1.下载案例Demo 2.移动StreamingAssets文件夹 3.添加场景 三、今日案例 1.案例Texture2DToMat Example 2.什么是Mat&#xff1f; 3.如何把Texture2D变成Mat &#xff08;1&#xff09;.初始化Mat &#xff08;2&#xff09;.Cv_…

Bagging与Boosting的应用与优势

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【最全面最优质的PyTorch学习资源】

纯 PyTorch 资源 PyTorch 博客 https://pytorch.org/blog/ PyTorch 文档 https://pytorch.org/docs PyTorch 性能调优指南 https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html# PyTorch Recipes https://pytorch.org/tutorials/recipes/recipes_index.h…