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直接拿代码。

相关推荐
发光小北5 小时前
Modbus TCP 转 Profinet 主站网关如何应用?
网络·网络协议·tcp/ip
lee_curry7 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
John_ToDebug8 小时前
深入剖析 WebHostView:浏览器内核中的桌面级 Web 宿主
chrome
John_ToDebug8 小时前
隐于无形,触手可及:Chrome 互动滚动条的六个设计密码
chrome·windows·ui
九转成圣9 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
直奔標竿9 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵10 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
金色光环10 小时前
FreeModbus释放底层的 TCP 监听端口
服务器·网络·tcp/ip
野生技术架构师11 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展