抖音a_bogus爬虫逆向补环境

抖音a_bogus爬虫逆向补环境

写在前面

https://github.com/ShilongLee/Crawler
这是我为了学习爬虫而搭建的爬虫服务器项目,目标是作为一个高性能的可靠爬虫服务器为广大爬虫爱好者和安全工程师提供平台进行学习爬虫,了解爬虫,应对爬虫。现已支持抖音快手小红书哔哩哔哩等平台,如果对大家学习有帮助的话,希望能帮忙点一个star,也欢迎各路大佬前来贡献自己的才华🎉

接口及参数

  1. 打开网页版抖音,右键视频进入详情页。
  2. F12打开控制台筛选detail,然后刷新网页,找到请求。
  3. 可以发现我们本次的参数目标a_bogus。
    抖音详情接口

找到加密代码

  • 找到入口

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

    调用栈定位

  • 查看参数

    首先我们查看入口参数,不难发现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
    断住之后,我们发现结果大概率是我们要的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. 全部补完之后我们发现终于没报错了,说明正常运行了,下一步我们需要找到加密函数的入口,然后进行最后的加密操作。(其中检测环境时还创建了一个span标签,这个不是强制的,因此有兴趣的同学可以补一下。)
    完成补环境

函数入口

我们可以发现,首次调用的函数是这里,也就是说这里导出给外面的文件使用,所以,我们可以认定这里是导出的加密入口。分析代码可以发现实际加密是调用的是u._u,所以我们可以将window.sign导出然后进行调用即可。
入口

结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 之 vuex

目录 vuex 是什么 Vuex管理哪些状态呢&#xff1f; Vuex 页面刷新数据丢失怎么解决 1. 使用浏览器的本地存储 2. 使用 Vuex 持久化插件 3. 使用后端存储 注意事项 Vuex 为什么要分模块并且加命名空间 vuex 是什么 vuex 是专门为 vue 提供的全局状态管理系统&#xff0c…

Protected and unprotected Meilisearch projects(/health)

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

案例 | JIMUMETA元宇宙体验馆,助力品牌打开营销新思路!

视创云展作为行业领先的3D数字化场景营销平台&#xff0c;专注于帮助企业迅速构建集多样化营销活动于一体的元宇宙空间。 通过整合虚拟展厅、数字人互动、音视频通话以及弹幕聊天等创新功能&#xff0c;我们为企业打造极具沉浸感的体验环境&#xff0c;并提供高效的线上营销手段…

element 树组件 tree 横向纵向滚动条

Html <el-cardshadow"hover"class"solo flex-2"style"height: calc(100vh - 1.6rem); border: 1px solid #ebeef5"><div slot"header" class"clearfix"><span>问题分类</span></div><div …

坑记(MySQL之delete操作)

背景知识 我们知道MySQL有两种删除操作&#xff1a;delete和truncate。 二者之间是否一样&#xff0c;且看以下内容&#xff1a; 操作名称操作简介deleteDML中的一种&#xff0c;操作对象是记录&#xff0c;即table中的一行&#xff0c;可恢复&#xff0c;速度慢truncateDDL中…

java自动化之java基础03-09java基础之数组

数组 1、定义 数组是一种用于存储固定大小的同类型数据的数据结构 1&#xff09;固定大小 2&#xff09;同类型数据的存储 2、声明数组 1&#xff09;数据类型[] 变量名称&#xff1b; 例如&#xff1a;int[] numsArry; 2&#xff09;数据类型 变量名称[]; 例如&#xf…

MYSQL、ORACLE、PostgreSQL数据库对象层次及权限管理对比

文章目录 前言一、PostgreSQL二、MySQL三、Oracle 前言 本文为出于自己扩展、比较、图形化的思维路径自行总结归纳&#xff0c;可能有些细节不太准确&#xff0c;欢迎指正。 MySQL、Oracle、PostgreSQL关系型数据库都有管理员用户、用户、权限管理、表函数索引等数据库对象&am…

JFinal学习07 控制器——接收数据之getBean()和getModel()

JFinal学习07 控制器——接收数据之getBean()和getModel() 视频来源https://www.bilibili.com/video/BV1Bt411H7J9/?spm_id_from333.337.search-card.all.click 文章目录 JFinal学习07 控制器——接收数据之getBean()和getModel()一、接收数据的类型二、getBean()和getModel()…

6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)

题目 448找到所有数组中消失的数字.go 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,…

PCIE的吞吐量如何计算和记忆诀窍?

简介&#xff1a; PCIe标准中的性能参数有好几个&#xff0c;比如设备的带宽和吞吐量是多少&#xff1f;传输速率&#xff1f; 百度百科上&#xff0c;PCIE标准的传输速率与带宽对应表如下&#xff08;表中速率为单向速率&#xff09;。网上有些数据是双向的&#xff0c;性能数…

去哪里找电子产品、单片机的论坛。去哪里找一些成熟方案?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;你从网络上&#xff0c;论…

MCGS仿真教学1:单个变量与博途进行通讯

目录 一、博途配置1.1、博途通讯常用配置1.2、博途测试程序二、MCGS配置2.1、工程配置2.2、设备组态2.3、添加单个变量2.4、添加画面2.4.1、按钮2.4.2、指示灯三、下载测试一、博途配置 1.1、博途通讯常用配置 1.2、博途测试程序 二、MCGS配置 2.1、工程配置 选择自己所购买的…

k8s metrics-server服务监控pod 的 cpu、内存

项目场景&#xff1a; 需要开启指标服务&#xff0c;依据pod 的 cpu、内存使用率进行自动的扩容或缩容 pod 的数量 解决方案&#xff1a; 下载 metrics-server 组件配置文件&#xff1a; wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/…

看完“土猪拱白菜“的张锡峰,我明白计算机有多难了

计算机有多难&#xff1f; 今天无意中&#xff0c;看到一篇关于「"土猪拱白菜"学霸后悔报考浙大计算机」的文章。 或许会有不少和我刚开始一样懵圈的同学&#xff1a;张锡峰是谁&#xff1f;"土猪拱白菜"又是什么梗&#xff1f; 带着疑惑&#xff0c;我打开…

大模型高考数学测评结果,国内AI大模型成绩超GPT-4o!

每年高考都是备受全社会关注的一件大事&#xff0c;而今年略有不同&#xff0c;因为除了鱼跃龙门的高三学子们&#xff0c;还多了许多陪他们一同参加考试的 AI 大模型。 在所有的考试科目中&#xff0c;数学显然一直都是最难的那一门&#xff0c;不论是对考生还是对大模型。因…

管理敏感数据

敏感数据泄露是指意外或故意泄露关键信息&#xff0c;例如个人身份信息&#xff08;PII&#xff09;、支付卡信息&#xff08;PCI&#xff09;、受保护的电子健康信息&#xff08;ePHI&#xff09;和知识产权&#xff08;IP&#xff09;&#xff0c;数据保护措施不足的组织会在…

2024 Java 异常—面试常见问题

目录 一、异常的分类 二、throw和throws都是异常处理的关键字&#xff0c;二者区别。 三、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#xff1f; 四、try-catch-finally 中哪个部分可以省略&#xff1f; 五、常见的 Runti…

neo4j-官网学习

1、cypher 代码学习文档 https://neo4j.com/docs/cypher-cheat-sheet/5/auradb-enterprise 2、APOC函数包安装&#xff08;desktop&#xff09; 直接点击就可以安装&#xff0c;安装完之后重启一下&#xff0c;Cypher查询中使用CALL apoc.help(‘apoc’)来检查APOC插件是否已…

全网自动观影一条龙!一步到位的极空间nas-tools搭建教程

全网自动观影一条龙&#xff01;一步到位的极空间nas-tools搭建教程 哈喽小伙伴们好&#xff0c;我是Stark-C~&#xff0c;前几天为大家分享的《极空间全自动小雅Alist以及Emby全家桶部署教程》大家都反映没用上极空间自己强大的“极影视”有点可惜&#xff0c;所以今天再教大…

JasperReport-合并单元格

合并单元格是做报表时经常会遇到的需求。下面列举两种合并单元格的方式。 一、示例一 合并单元格在Subject。 1.1 创建5列的表 1.2 合并Column4和 Column5 按住Ctrl键点击Column4和 Column5,同时选中。然后右键,选择“Group Columns”。 1.3 合并成功 二、示例二 示例一…