python、go、node的ja3指纹实现

2023-10-18 04:40
文章标签 python 实现 go node 指纹 ja3

本文主要是介绍python、go、node的ja3指纹实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.初识

1.什么是ja3相信大家都有所耳闻,这里就不做太多概述,简单来讲就是就是基于tls/ssl协议的客户端指纹特征识别技术。

2.绕过ja3的四种方法

  • 1.访问ip指定host绕过waf
  • 2.代理中转请求(go版本有实现可以去了解下)
  • 3.更换request工具库
  • 4.魔改requests

3.tls检测网站

  • akamai 1.75
  • akamai2.0
  • Cloudflare(5秒盾)

这里我们讲解各语言版本的实现,详细了解ja3的可以移步到一下文章。

参考1

参考2

参考3

二.语言实现——(案例猿人学19题)
  • python

    一.pyhttpx

import pyhttpx
sess= pyhttpx.HttpSession()
url = f"https://match.yuanrenxue.com/api/match/19?page=1"
response = sess.get(url,headers=Headers)

​ 二. Pycurl(pycurl是curl的一个python版本)

import pycurl, json
from io import BytesIOClass getAll():def __init__(self):self.pyc=pycurl.Curl()self.buffer=BytesIO()def getoutPut():self.pyc.setopt(pycurl.URL, 'http://some-url')#跳过验证self.pyc.setopt(pycurl.SSL_VERIFYHOST,0)self.pyc.setopt(pycurl.SSL_VERIFYPEER,0)self.pyc.setopt(pycurl.POST,1)self.pyc.setopt(pycurl.WRITEDATA,self.buffer)self.pyc.setopt(pycurl.HTTPHEADER, ['content-type: 		   	     				application/json','content-type:multipart/form-data'])data = json.dumps({"name": "abc", "path": "def", "target": "ghi"})self.pyc.setopt(pycurl.POSTFIELDS, data)self.pyc.perform()self.pyc.close()print(self.buffer.getvalue().decode('utf-8'))

​ 三.魔改open_ssl

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_contextORIGIN_CIPHERS = ('ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES')class DESAdapter(HTTPAdapter):def __init__(self, *args, **kwargs):"""A TransportAdapter that re-enables 3DES support in Requests."""CIPHERS = ORIGIN_CIPHERS.split(':')random.shuffle(CIPHERS)CIPHERS = ':'.join(CIPHERS)self.CIPHERS = CIPHERS + ':!aNULL:!eNULL:!MD5'super().__init__(*args, **kwargs)def init_poolmanager(self, *args, **kwargs):context = create_urllib3_context(ciphers=self.CIPHERS)kwargs['ssl_context'] = contextreturn super(DESAdapter, self).init_poolmanager(*args, **kwargs)def proxy_manager_for(self, *args, **kwargs):context = create_urllib3_context(ciphers=self.CIPHERS)kwargs['ssl_context'] = contextreturn super(DESAdapter, self).proxy_manager_for(*args, **kwargs)import requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67'}
s = requests.Session()
s.headers.update(headers)for _ in range(5):s.mount('https://ja3er.com', DESAdapter())resp = s.get('https://ja3er.com/json').json()print(resp)

提示:cycletls是一个针对go和node的ja3实现

项目地址:cycletls

  • go(cycletls)

    1.安装:go get github.com/Danny-Dasilva/CycleTLS/cycletls

    2.使用

package mainimport ("github.com/Danny-Dasilva/CycleTLS/cycletls""log"
)func main() {client := cycletls.Init()response, err := client.Do("https://match.yuanrenxue.com/api/match/19?page=1", cycletls.Options{Body:      "",Ja3:       "771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-		 49161-49171-49172-51-57-47-53-10,0-23-65281-10-11-35-16-5-51-43-13-45-28-		  21,29-23-24-25-256-257,0",UserAgent: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) 			    	 Gecko/20100101 Firefox/87.0",}, "GET")if err != nil {log.Print("Request Failed: " + err.Error())}log.Println(response)
}
  • node(cycletls)

    1.安装:npm install cycletls

    2.使用

const initCycleTLS = require('cycletls');
// Typescript: import initCycleTLS from 'cycletls';(async () => {// Initiate CycleTLSconst cycleTLS = await initCycleTLS();// Send requestconst response = await cycleTLS('https://match.yuanrenxue.com/api/match/19?page=1', {body: '',ja3: '771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-	  	  49171-49172-51-57-47-53-10,0-23-65281-10-11-35-16-5-51-43-13-45-28-21,29-23-     24-25-256-257,0',userAgent: 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101       Firefox/87.0',timeout: 2,// proxy: 'http://username:password@hostname.com:443'}, 'get');console.log(response);// Cleanly exit CycleTLScycleTLS.exit();})();

效果

在这里插入图片描述

三.结语

好了,上面列举的这些ja3指纹工具实现相信能够应付绝大多是情况,兄弟们可以自行测试效果,如果遇到更多的情况,还得详细的分析,去进行魔改测试。

这篇关于python、go、node的ja3指纹实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/230225

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核