java tcp指纹模拟 chrome akamai_hash

1.前言

若有侵权请联系我

前两篇文章已经搞定了chrome的ja3,ja4指纹,在请求目标时发现在返回头里有akamai的信息,必须解决akamai指纹。

akamai_hash计算的tcp内容

    1. SETTINGS(client_settings)
    1. WINDOW_UPDATE(窗口)

2. 代码

在发送h2协议后直接发送对应的client_settings和windowUpdata,chrome的akamai_text如下直接设置就行

bash 复制代码
   // 1. HTTP/2 客户端前言
        tlsOut.write("PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n".getBytes(StandardCharsets.UTF_8));

        // 2. 客户端 SETTINGS
        sendClientSettings();
        sendWindowUpdate(tlsOut, 0, 15663105); // connection window 15663105

具体实现

bash 复制代码
 /**
     * 设置setting帧
     *
     * @throws IOException
     */
    private void sendClientSettings() throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        // payload length = 24
        out.write(0x00);
        out.write(0x00);
        out.write(0x18);

        out.write(0x04); // SETTINGS
        out.write(0x00); // flags
        out.write(new byte[]{0x00, 0x00, 0x00, 0x00}); // stream 0

        // SETTINGS_HEADER_TABLE_SIZE (0x01)
        writeSetting(out, 0x01, 65536);

        // SETTINGS_ENABLE_PUSH (0x02)
        writeSetting(out, 0x02, 0);

        // SETTINGS_INITIAL_WINDOW_SIZE (0x04)
        writeSetting(out, 0x04, 6291456);

        // SETTINGS_MAX_HEADER_LIST_SIZE (0x06)
        writeSetting(out, 0x06, 262144);

        tlsOut.write(out.toByteArray());
        tlsOut.flush();
    }

    private void writeSetting(ByteArrayOutputStream out, int id, int value) {
        out.write((id >> 8) & 0xFF);
        out.write(id & 0xFF);

        out.write((value >> 24) & 0xFF);
        out.write((value >> 16) & 0xFF);
        out.write((value >> 8) & 0xFF);
        out.write(value & 0xFF);
    }

/**
     * 发送窗口
     *
     * @param out
     * @param streamId
     * @param increment
     * @throws IOException
     */
    public static void sendWindowUpdate(OutputStream out, int streamId, int increment) throws IOException {
        byte[] frame = new byte[13];

        // length = 4
        frame[0] = 0;
        frame[1] = 0;
        frame[2] = 4;

        frame[3] = 0x8; // WINDOW_UPDATE
        frame[4] = 0;

        frame[5] = (byte) ((streamId >> 24) & 0x7F);
        frame[6] = (byte) ((streamId >> 16) & 0xFF);
        frame[7] = (byte) ((streamId >> 8) & 0xFF);
        frame[8] = (byte) (streamId & 0xFF);

        frame[9] = (byte) ((increment >> 24) & 0xFF);
        frame[10] = (byte) ((increment >> 16) & 0xFF);
        frame[11] = (byte) ((increment >> 8) & 0xFF);
        frame[12] = (byte) (increment & 0xFF);

        out.write(frame);
        out.flush();
    }

验证网站链接

bash 复制代码
https://tls.peet.ws/api/all

指纹对比左边是java指纹,右边是chrome指纹

3. notice

最开始问chatgpt如何实现akamai_hash,涉及版权问题,chatgpt拒绝了。在网上查了部分资料后发现不难,具体实现提交给chatgpt直接拿代码。

相关推荐
Mahir085 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
RyFit6 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码7 小时前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事7 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海7 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠8 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
德思特8 小时前
从 Dify 配置页理解 RAG 的重要参数
java·人工智能·llm·dify·rag
YOU OU9 小时前
Spring IoC&DI
java·数据库·spring
один but you9 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
pengyi8710159 小时前
共享 IP 与独享 IP 怎么选?被封后升级方案避坑
网络·网络协议·tcp/ip