😀 今天我们讲一下如何编译一个随机的ja4指纹
📝 主旨内容
什么是ja4指纹?
JA4指纹(JA4 Fingerprint)是指通过分析网络通信中传输的TLS(传输层安全性)握手信息中的各种特征,来生成的一个独特标识。它与传统的IP地址、MAC地址等物理或网络层面的标识不同,JA4指纹主要通过对应用层协议中TLS握手数据的分析来识别用户和设备。下面是关于JA4指纹的几大要点讲解:
1. TLS握手中的重要信息
JA4指纹是通过分析TLS协议握手过程中的几个关键信息生成的,包括:
- 客户端版本号(Client Version) :标识客户端支持的TLS协议版本。
- 客户端支持的加密套件(Cipher Suites) :指客户端在TLS握手时支持的加密算法集合。
- 扩展字段(Extensions) :TLS协议允许在握手中传递扩展字段,其中包含了额外的协议信息。
- 随机数(Random Values) :TLS握手中的随机值也会对JA4指纹的生成产生影响。
2. JA4指纹的组成
JA4指纹是将这些TLS握手信息以一定格式组合起来,生成一个独一无二的标识。具体步骤如下:
- 抽取TLS握手中的相关字段(如版本号、加密套件、扩展字段等)。
- 按照一定顺序将这些字段的值进行拼接。
- 对拼接后的字符串进行哈希运算,生成最终的JA4指纹。
3. JA4指纹的作用
- 识别客户端特征:JA4指纹能够帮助识别访问服务器的客户端的类型和特征。不同的客户端(例如不同版本的浏览器或操作系统)在TLS握手时所传输的信息通常具有一定的差异,因此生成的JA4指纹也会有所不同。
- 反欺诈与网络安全:JA4指纹广泛应用于网络安全领域,尤其是在检测和防止欺诈、恶意攻击等方面。通过对JA4指纹的分析,安全专家可以识别和追踪潜在的恶意行为,如僵尸网络、网络钓鱼等。
- 避免IP伪装:由于JA4指纹主要通过TLS握手信息生成,而不是基于IP地址或MAC地址等物理信息,因此即使攻击者伪装其IP地址,JA4指纹仍能有效识别其身份。
4. 与其他指纹技术的对比
- JA3指纹:JA4指纹与JA3指纹有些相似。JA3指纹是专门针对TLS客户端生成的一种指纹,关注的是更详细的TLS握手信息,而JA4则是较为简化的版本。两者的目标相似,都是通过网络传输中的TLS数据生成唯一的识别码。
- IP指纹和MAC指纹:JA4指纹不同于基于IP地址或MAC地址的传统指纹识别技术。IP和MAC地址可以被伪造或隐藏,而JA4指纹通过TLS握手信息生成,不容易被伪装或篡改。
5. JA4指纹的应用场景
- 流量分析和监控:通过对网络中所有TLS通信的JA4指纹进行收集和分析,可以帮助安全团队了解网络中的流量特征,并发现潜在的异常行为。
- 恶意软件检测:JA4指纹可以用于检测恶意软件或自动化攻击工具,它们往往具有与常规客户端不同的TLS握手行为,因此通过JA4指纹能够快速识别这些恶意流量。
- 合规性检测:在一些需要高安全性的应用场景中,JA4指纹可用来确认访问者是否符合合规要求,例如确保只有经过认证的客户端才能与服务器通信。
源代码编译
如果你已经看过我的文章,相信你已经可以编译成功你自己的chromium浏览器。如果还没看请看我以往的文章。
我们之间定位需要修改的代码路径:src\net\socket\ssl_client_socket_impl.cc
我们需要再这里添加如下代码:
#include <random>
int getRandomIntForFoo12Modern() {
static std::mt19937 generator(std::random_device{}());
static std::uniform_int_distribution<int> distribution(0, 1);
return distribution(generator);
}
然后我们在找到如下代码:
std::string command("ALL:!aPSK:!ECDSA+SHA1:!3DES");
找到之后我们在进行用上面的函数进行随机添加
std::string command("ALL");
if (getRandomIntForFoo12Modern() == 0)command.append(":!aPSK");
if (getRandomIntForFoo12Modern() == 0)command.append(":!kRSA");
if (getRandomIntForFoo12Modern() == 0)command.append(":!ECDSA");
if (getRandomIntForFoo12Modern() == 0)command.append(":!ECDSA+SHA1");
if (getRandomIntForFoo12Modern() == 0)command.append(":!3DES");
这里就可以达到随机添加然后改变指纹的功能。
我们重新编译打开一下浏览器看一下效果。
刷新一下
image.png
再刷新一下
image.png
🤗 总结归纳
好了今天的文章就到这里了,我们下期见再见。