原文連結:https://www.dubby.cn/detail.html?id=9105
複製抓包抓到的資料:
81 85 30 6c e2 9a 54 19 80 f8 49
複製程式碼
欄位分析:
81 | 85 | 30 | 6c | e2 | 9a | 54 | 19 | 80 | f8 | 49 |
---|---|---|---|---|---|---|---|---|---|---|
10000001 | 10000101 | 00110000 | 01101100 | 11100010 | 10011010 | 01010100 | 00011001 | 10000000 | 11111000 | 01001001 |
FIN:1,RSV1-3=0,OpCode=1 | mask=1,payloadLen=101 | Masking-key | Masking-key | Masking-key | Masking-key | Payload Data | Payload Data | Payload Data | Payload Data | Payload Data |
- FIN=1,說明這是這個訊息的最後一個片段,我們這次的訊息很短,第一個也就是最後一個
- RSV1, RSV2, RSV3:分別是1bit,且一般時候都是0
- OpCode=1(表示是一個text frame)
- %x0 連續的frame
- %x1 文字frame
- %x2 二進位制frame
- %x3-7 預留
- %x8 連線關閉
- %x9 ping
- %xA pong
- %xB-F 預留
- 如果mask=1,那麼Masking-key存在,且都是4個位元組(32位)
- payloadLen=101(5),說明位元組長度是4
最後我們看到資料部分是:
01010100 | 00011001 | 10000000 | 11111000 | 01001001 |
---|---|---|---|---|
54 | 19 | 80 | f8 | 49 |
掩碼解碼邏輯:
//掩碼
byte[] maskingKeyBytes = {(byte) 0x30, (byte) 0x6c, (byte) 0xe2, (byte) 0x9a};
//掩碼編碼過得payload
byte[] maskedBytes = {(byte) 0x54, (byte) 0x19, (byte) 0x80, (byte) 0xf8, (byte) 0x49};
int length = maskedBytes.length;
//解碼的結果
byte[] unmaskedByte = new byte[length];
for (int i = 0; i < length; ++i) {
byte masking = maskingKeyBytes[i % 4];
unmaskedByte[i] = (byte) (maskedBytes[i] ^ masking);
}
for (byte b : unmaskedByte) {
System.out.print(b + " ");
}
複製程式碼
輸出:
100 117 98 98 121
複製程式碼
轉成16進位制,正好是
64 75 62 62 79
複製程式碼
dubby的utf-8編碼後是:
01100100 | 01110101 | 01100010 | 01100010 | 01111001 |
---|---|---|---|---|
64 | 75 | 62 | 62 | 79 |
沒錯,我發的訊息就是dubby。