抖音a_bogus爬虫逆向补环境

news2024/11/24 20:07:50

抖音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之后又多检测了很多环境变量,为了环境更加真实和防止被检测的风险,尽量补全环境是最好的,即使会降低运行速度,如果追求运行速度我们可以尝试难度更高的纯算逆向。

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

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

相关文章

C语言 | Leetcode C语言题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* dummyHead malloc(sizeof(struct ListNode));dummyHead->val 0;struct ListNode *temp dummyHead, *temp1 head1, *temp2 head2;while…

【吊打面试官系列-Mysql面试题】锁的优化策略有哪些?

大家好&#xff0c;我是锋哥。今天分享关于 【锁的优化策略有哪些?】面试题&#xff0c;希望对大家有帮助&#xff1b; 锁的优化策略有哪些? 1、读写分离 2、分段加锁 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 3、减少锁持有的时间 4.多个线程尽量以相同的…

ESP32S3中使用按键控制LED灯亮灭

// 定义 LED 与 按键引脚 int led_pin 4; int button_pin 5;// 定义 LED 逻辑值 int led_logic 0; // 判断 LED 的状态是否改变过 bool status false;void setup() { pinMode(led_pin, OUTPUT);pinMode(button_pin, INPUT_PULLDOWN); }void loop() {// 按键消抖if (digita…

农资投入品系统架构:数字化农业的技术支撑与创新

在当今数字化时代&#xff0c;农业领域也在迅速迈向数字化和智能化的新阶段。农资投入品系统作为农业生产的重要支撑&#xff0c;其系统架构的设计与创新对于提高农业生产效率、保障粮食安全具有重要意义。本文将探讨农资投入品系统架构的设计原则、核心模块以及未来发展趋势。…

4. Revit API UI 之 Ribbon(界面)

4. Revit API UI 之 Ribbon&#xff08;界面&#xff09; 第二篇中&#xff0c;我们提到了IExternalApplication&#xff0c;该接口需要实现两个方法&#xff1a;Revit启动时调用的OnStartup 方法&#xff0c;和Revit关闭时调研的OnShutdown 方法。文中还给了个例子&#xff0…

详解Next Auth:自定义邮箱密码登录注册、Github、Notion授权 Convex集成

最近用NextJS框架做全栈项目做的很顺手&#xff0c;现在想给项目加上登录、注册、鉴权拦截、分角色路由控制等功能&#xff0c;并接入Github、Notion等第三方登录。 可以使用NextJS官方提供的Auth框架实现。 Intro 阅读本篇&#xff0c;你将学会&#xff1a; 1、登录、注册等…

论文阅读ReLU-KAN和Wav-KAN

这是我读KAN系列论文的第三篇&#xff0c;今天把两篇论文放在一起写&#xff0c;分别是&#xff1a; ReLU-KAN&#xff1a; https://arxiv.org/abs/2406.02075 Wav-KAN&#xff1a; https://arxiv.org/abs/2405.12832 之所以放在一起&#xff0c;是因为这两篇论文针对KAN的…

使用Spring Boot 3实现邮箱登录/注册接口开发

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

MySQL-连接查询

049-内连接之等值连接 案例&#xff1a;查询每个员工所在的部门名称&#xff0c;要求显示员工名、部门名。 select e.ename, d.dname from emp e inner join dept d on e.deptnod.deptno;注意&#xff1a;inner可以省略 select e.ename, d.dname from emp e join dept d on…

AI播客下载:AI在商业中的应用(The AI in Business Podcast)

"AI在商业中的播客"是为那些需要寻找AI机会、将AI能力与战略对齐并实现投资回报的非技术商业领袖准备的。 每周&#xff0c;Emerj人工智能研究公司的首席执行官Daniel Faggella会采访来自财富500强公司和独角兽初创公司的顶级AI高管&#xff0c;以揭示趋势、用例和最…

【译】SQLAlchemy文档:SQLAlchemy 统一教程

SQLAlchemy Unified Tutorial SQLAlchemy 是 Python SQL工具包和ORM&#xff0c;它为应用程序开发人员提供了 SQL 的全部功能和灵活性。它提供了一整套企业级持久性模式&#xff0c;专为高效和高性能的数据库访问而设计。 SQLAlchemy呈现为两层API&#xff1a;Core和ORM&…

龙迅LT9611UXC 2 PORT MIPIDSI/CSI转HDMI 2.1,支持音频IIS/SPDIF输入,支持标准4K60HZ输出

龙迅LT9611UXC描述&#xff1a; LT9611UXC是一个高性能的MIPI DSI/CSI到HDMI2.0转换器。MIPI DSI/CSI输入具有可配置的单端口或双端口&#xff0c;1高速时钟通道和1~4高速数据通道&#xff0c;最大2Gbps/通道&#xff0c;可支持高达16Gbps的总带宽。LT9611UXC支持突发模式DSI视…

GStreamer安装——iOS

安装iOS开发 支持从iOS6开始的所有版本 先决条件 iOS开发需要下载Xcode和iOSSDK。Xcode 可以在App Store或 这里 iOSSDK&#xff0c;如果它还没有包含在您的Xcode版本中&#xff0c; 可以从下载选项卡下的Xcode首选项菜单下载。 最低要求iOS版本为6.0。的最低要求版本 Xcode…

Android帧绘制流程深度解析 (二)

书接上回&#xff1a;Android帧绘制流程深度解析 &#xff08;一&#xff09; 5、 dispatchVsync&#xff1a; 在请求Vsync以后&#xff0c;choreographer会等待Vsync的到来&#xff0c;在Vsync信号到来后&#xff0c;会触发dispatchVsync函数&#xff0c;从而调用onVsync方法…

栈(Stack)汇总

栈简介 栈&#xff08;Stack&#xff09;是只允许在一端进行插入或者删除操作的线性表。它的操作特性可以概括为——后进先出&#xff08;Last In First Out&#xff0c;LIFO&#xff09;。栈顶&#xff08;Top&#xff09;——线性表允许进行插入删除的一端&#xff1b; 栈底…

SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具

关于SwaggerSpy SwaggerSpy是一款针对SwaggerHub的自动化公开资源情报&#xff08;OSINT&#xff09;安全工具&#xff0c;该工具专为网络安全研究人员设计&#xff0c;旨在简化广大红队研究人员从SwaggerHub上收集已归档API信息的过程&#xff0c;而这些OSINT信息可以为安全人…

BigDecimal-解决java中的浮点运算

《阿里巴巴 Java 开发手册》中提到&#xff1a;“为了避免精度丢失&#xff0c;可以使用 BigDecimal 来进行浮点数的运算”。浮点数的运算竟然还会有精度丢失的风险吗&#xff1f;确实会&#xff01; 示例代码&#xff1a; float a 2.0f - 1.9f; float b 1.8f - 1.7f; Syst…

制作带有目录的电子书

有时候想自己制作一些.mobi格式的电子书在kindle上进行阅读&#xff0c;有两种简单做法。 方法一&#xff1a; 工具&#xff1a;markdown编辑器、calibre 在markdown编辑器中编辑想要制作电子书的文本&#xff0c;在想要设置目录的地方加一个#&#xff08;我只制作了一级标题…

线程安全问题【snychornized 、死锁、线程通信】

目录 一、线程安全1.1 线程安全问题?1.2 如何解决线程安全问题方法具体如何实现? 1.3 同步方法1.4 同步代码块1.5 总结1.6 售票例子1.8 补充 二、线程安全的集合三、死锁【了解】四、线程通信4.1 同步方法4.2 同步代码块4.3 wait和sleep本篇的思维导图 最后 一、线程安全 1.…

使用PHP对接企业微信审批接口的问题与解决办法(二)

在现代企业中&#xff0c;审批流程是非常重要的一环&#xff0c;它涉及到企业内部各种业务流程的规范和高效运转。而随着企业微信的流行&#xff0c;许多企业希望将审批流程整合到企业微信中&#xff0c;以实现更便捷的审批操作。本文将介绍如何使用PHP对接企业微信审批接口&am…