逆向 Virustotal 搜索接口 X-VT-Anti-Abuse-Header

搜索示例

搜索 123,网页地址为:https://www.virustotal.com/gui/search/123/comments

请求接口

GET /ui/search?limit=20&relationships%5Bcomment%5D=author%2Citem&query=123 HTTP/1.1
Accept-Encoding: gzip, deflate, br, zstd
Accept-Ianguage: en-US,en;q=0.9,es;q=0.8
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: _gid=GA1.2.1662779803.1728383656; _ga=GA1.2.686372046.1728383655; _gat=1; _ga_BLNDV9X2JR=GS1.1.1728383655.1.1.1728383759.0.0.0
DNT: 1
Host: www.virustotal.com
Pragma: no-cache
Referer: https://www.virustotal.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
X-Tool: vt-ui-main
X-VT-Anti-Abuse-Header: MTgwNjgyNDI1ODItWkc5dWRDQmlaU0JsZG1scy0xNzI4MzgzNzYxLjMxMg==
accept: application/json
content-type: application/json
sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
x-app-version: v1x304x0

注意观察,其中发现参数:X-VT-Anti-Abuse-Header 需要逆向,目测是 base64 加密,这个参数的含义也很明确——“反滥用头”。在编写爬虫的代码层的实现时,尽量将 User-AgentX-Toolx-app-version 补全,因为它们是网站特有的亦或者常见的反爬识别参数。

值得注意的是,X-Toolx-app-version 是固定值,x-app-version 需要定期去官网查看一下更新,不更新可能也行,自行测试。

也就是说,目前我们得到如下 Headers:

{
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
'X-Tool': 'vt-ui-main',
'x-app-version': 'v1x304x0',
}

开始逆向

接下来,逆向 X-VT-Anti-Abuse-Header,总体没啥难度,不过这个网站具备反调试措施(无法断点调试、无法从请求的启动器回溯),这个反调试我没有去解决,而是通过直接查找。

搜索 X-VT-Anti-Abuse-Header,可得到:

直接进入该 js 文件中:

可以看到,我们的目标参数由方法 r.computeAntiAbuseHeader() 计算而来。全局搜索 computeAntiAbuseHeader

序号1为我们所需的,也就是函数的实现,序号2为该函数的调用,也就是上方的 X-VT-Anti-Abuse-Header 来源。进入 1 所在的 js 文件。

可以看到,这个方法真的非常简单,不需要任何回溯和断点,可以直接的手搓出来。这个网站典型的将反爬中的防君子不防小人做得很好。言归正传,这个方法:

  1. 首先获取当前时间的秒级时间戳
  2. 然后生成一个介于 1e10 和 5e14 之间略大的随机数,如果生成的数小于 50,则返回 "-1",否则返回该数的整数部分
  3. 最后将生成的随机数、固定字符串 "ZG9udCBiZSBldmls"(意为 "不要作弊")和当前时间戳拼接并进行 base64 加密

有趣的一点是:

> atob('ZG9udCBiZSBldmls ')
< 'dont be evil'

固定的字符串告诉我们不要作恶……这尼玛绝了,哈哈哈哈

加密实现

# header.py
import base64
import random
import time def computeAntiAbuseHeader():
e = time.time()
n = 1e10 * (1 + random.random() % 5e4)
raw = f'{n:.0f}-ZG9udCBiZSBldmls-{e:.3f}'
res = base64.b64encode(raw.encode())
return res.decode() if __name__ == '__main__':
print(computeAntiAbuseHeader())

结束了吗?

看到这里你以为结束了?oh~不,还差一点点,尽管你有了上述的分析和实现,你发现你怎么请求都没用!数据还是不给你,为啥?

再次将你的眼光挪移到请求接口中:

Accept-Ianguage: en-US,en;q=0.9,es;q=0.8
Accept-Language: zh-CN,zh;q=0.9

此处有个容易忽略的老6请求头:Accept-Ianguage,好了,到此才算结束了,看一下下方完整的代码示例吧。

"""
翻页采集实现
2024年9月27日 solved
https://www.virustotal.com/gui/
"""
import time
import requests
import header
from urllib.parse import urlencode, urlparse base_url = "https://www.virustotal.com/ui/search"
initial_params = {
"limit": 20,
"relationships[comment]": "author,item",
"query": "baidu"
} proxies = {
'http': None,
'https': None
} def build_url(url, params): # ☆
return urlparse(url)._replace(query=urlencode(params)).geturl() def get_headers():
return {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
'X-Tool': 'vt-ui-main',
'X-VT-Anti-Abuse-Header': header.computeAntiAbuseHeader(),
'x-app-version': 'v1x304x0',
'accept-ianguage': 'en-US,en;q=0.9,es;q=0.8'
} def fetch_data(url):
response = requests.get(url, headers=get_headers(), proxies=proxies)
return response.json() def process_data(data):
for item in data['data']:
print(f"ID: {item['id']}, Type: {item['type']}") # 主循环
next_url = build_url(base_url, initial_params)
while next_url:
print(f"Fetching: {next_url}")
json_data = fetch_data(next_url) # 检查是否有数据
if not json_data.get('data'):
print("No more data.")
break # 处理当前页面的数据
process_data(json_data) # 获取下一页的 URL
next_url = json_data.get('links', {}).get('next') if not next_url:
print("No more pages.")
break time.sleep(1) print("Finished fetching all pages.")

逆向 Virustotal 搜索接口 X-VT-Anti-Abuse-Header的更多相关文章

  1. 【微信公众平台开发】百度周边搜索接口php封装

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl2YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  2. 使用Groovy+Spock构建可配置的订单搜索接口测试用例集

    概述 测试是软件成功上线的安全网.基本的测试包含单元测试.接口测试.在 "使用Groovy+Spock轻松写出更简洁的单测" 一文中已经讨论了使用GroovySpock编写简洁的单 ...

  3. Groovy元编程应用之自动生成订单搜索接口测试用例集

    背景 在 "Groovy元编程简明教程" 一文中,简明地介绍了 Groovy 元编程的特性. 那么,元编程可以应用哪些场合呢?元编程通常可以用来自动生成一些相似的模板代码. 在 & ...

  4. 利用bing图片搜索接口开发图片搜索应用程序

    概述:通过bing的图片搜索引擎,开发自己的图片搜索应用程序.bing的图片搜索接口是收费的,但是初次注册使用,key可以免费试用30天 程序运行效果如下 一,代码如下 static SearchRe ...

  5. 第 11 篇:基于 drf-haystack 的文章搜索接口

    作者:HelloGitHub-追梦人物 在 django 博客教程中,我们使用了 django-haystack 和 Elasticsearch 进行文章内容的搜索.django-haystack 默 ...

  6. ABP Zero示例项目登录报错“Empty or invalid anti forgery header token.”问题解决

    ABP Zero项目,登录时出现如图"Empty or invalid anti forgery header token."错误提示的解决方法: 在 WebModule.cs的P ...

  7. 逆向bfs搜索打表+康拓判重

    HDU 1043八数码问题 八数码,就是1~8加上一个空格的九宫格,这道题以及这个游戏的目标就是把九宫格还原到从左到右从上到下是1~8然后最后是空格. 没了解康托展开之前,这道题怎么想都觉得很棘手,直 ...

  8. 专业5 laravel框架添加,删除,恢复,分页,搜索接口

    //////////////////////资源路由 //商品资源路由恢复Route::get('/restore/{id}','goodController@restore');//商品资源路由添加 ...

  9. 如何使用百度音乐搜索接口API

    百度有开放音乐搜索的api 比如: http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$ http://b ...

  10. 通过ajax访问Tomcat服务器web service接口时出现No 'Access-Control-Allow-Origin' header问题的解决办法

    问题描述 通过ajax访问Web服务器(Tomcat7.0.42)中的json web service接口的时候,报以下跨域问题: XMLHttpRequest cannot load http:// ...

随机推荐

  1. midjourney 入门操作

    midjourney 入门操作 settings面板 选择模型 当从 V6 切换到 Niji模型时,Current suffix会添加参数 default V6面板功能介绍 RAW Mode功能 -- ...

  2. GeoScene Pro处理并发布倾斜摄影(OSGB)

    前言 看了网上好多教程,很多都不全,在自己操作的过程中遇到了很多问题,最后将我完整的流程整理出来,以供大家参考 从数据处理.优化.发布.加载完整流程都有 一.数据格式转换 1.全局搜索"创建 ...

  3. 【Java】Excel 读写图片工具类

    一.需求背景: 做一个大屏管理系统,基础信息包括管理的应用名称,大屏的截图,通过一个excel批量导入 excel的单元格里要插入图片,对应一个大屏应用的信息 导入需要读取到大屏截图,至于存哪还没说. ...

  4. 【Vue】Re21 VueX 第二部分(Mutations)

    一.Mutations携带参数处理 Store状态的更新唯一方式:提交Mutations Mutations包含两部分: 1.字符串的事件类型[TYPE] 2.一个回调函数[HANDLER] 该函数的 ...

  5. 【Java】IDEA普通JavaEE项目实现SSM整合

    一.需要的组件 首先是解决组件问题,非Maven项目构建的jar包 [Servlet & JSP & JSTL] 虽然不是Maven项目,但是JSTL的组件是需要引入的 这里就按照Ma ...

  6. disconf分布式配置管理(一) 安装与配置

    一.背景 在生产部署过程中,遇到以下问题: 1.由于节点较多,每次增量修改配置文件后都需要每个节点替换配置文件. 2.有些动态配置修改后,需要重启服务. 二.解决方案 1.使用linux文件共享配置文 ...

  7. shell编程入门-适合小白

    一.变量的使用 1. 变量命名 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="yikoulinux" 注意,变量名和等号之间不能有空格,这 ...

  8. 代码随想录Day17

    654.最大二叉树 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在最大值 左边 的 子数组前缀 ...

  9. Python开发中,SQLAlchemy 的同步操作和异步操作封装,以及常规CRUD的处理。

    在我们使用Python来和数据库打交道中,SQLAlchemy是一个非常不错的ORM工具,通过它我们可以很好的实现多种数据库的统一模型接入,而且它提供了非常多的特性,通过结合不同的数据库驱动,我们可以 ...

  10. 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型

    NextChat介绍 One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 & Gem ...