需要工具:安卓手機, Packet Capture(請自行百度后下載)
首先哈,安裝 Packet Capture APP,具體就不演示了哈
進入軟件
這樣就進入到主界面,左上角兩個綠色按鈕分別是抓取單一APP網絡請求與抓取全部請求
抓取請求
抓取前盡可能關掉除QQ與Packet Capture以外的所有軟件,提高成功率,還可以避免抓到其他無關數據
下面是重點,請嚴格按照如圖所示操作
提前打開這個頁面
切換到Packet Capture,點擊右上角的綠色按鈕,選擇第一個然后搜索 QQ 選擇QQ后開始抓取
第一次使用會提示,點擊"確定"即可
綠色按鈕變為紅色表示正在抓取中,同時出現提示信息
然后打開 我收到的坦白說的頁面 ,
進入此列表,等待一會,一定保證列表加載完全
繼續點擊進入,如果有下圖提示,一定點擊繼續訪問,原因是我們抓取數據時用了Packet Capture自帶證書替換了原證書.
切換到Packet Capture,點擊右上角的紅色停止按鈕,結束本次抓包,這樣我們就有了一次記錄,選擇最近時間點擊進入
重點尋找QQ發出/接收的數據包,包含坦白說列表數據的數據包大小在10KB以上,且為SSL類型
(抓到的數據包大約在30~50個左右,耐心尋找)
這個數據包很大,使勁往下翻,如果類似於發現下圖中的數據,就是我們所需分析的重點內容
接下來重點分析這些數據
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
{
"code"
:0,
"data"
:{
"list"
:[
{
"fromNick"
:
"一個認識y年的男生"
,
"fromEncodeUin"
:
"*S1*oKoezon5"
,
"fromFaceUrl"
:
"man.png"
,
"fromGender"
:0,
"toUin"
:1088668866,
"toNick"
:
""
,
"topicId"
:666,
"topicName"
:
"別人對你的匿名評價"
,
"timestamp"
:1534435200
},
{
"fromNick"
:
"一個x歲的女生"
,
"fromEncodeUin"
:
"*S1*oKoezon5"
,
"fromFaceUrl"
:
"woman.png"
,
"fromGender"
:1,
"toUin"
:1088668866,
"toNick"
:
""
,
"topicId"
:666,
"topicName"
:
"別人對你的匿名評價"
,
"timestamp"
:1534435200
}
]
}
}
|
參數名 | 含義 | 備注 |
---|---|---|
fromNick | 對方所顯示的匿名昵稱 | e.g."一個認識3年的男生" "一個南京的女生" |
fromEncodeUin | 編碼后的對方QQ | 重點,從這里入手 |
fromFaceUrl | 對方頭像圖片文件 | |
fromGender | 對方性別 | 0為男,1為女 |
toUin | 你的QQ號 | |
toNick | 你的昵稱 | 似乎都是空 |
topicId | 話題ID | 話題索引 |
topicName | 話題名稱 | e.g. "我身邊的最強大腦" "將來能干一番大事" "擁有迷人的長發" 也是對方給你發送的第一條消息 |
timestamp | 時間戳 | 1970年1月1日(UTC/GMT的午夜)開始所經過的秒數 |
1.去除*S1*這四個字符
結果變為 oKoezon5
現在我們就得到數據了,接下來使用解密工具解密即可,將數據粘貼進去即可
解密源碼如下
C++ Code
#include <memory.h> #include <iostream> static char* table[] = { "oe", "oK", "ow", "oi", "7e", "7K", "7w", "7i", "Ne", "NK", "n", "6", "-", "o", "v", "4", "C", "S", "c", "E", "z", "5", "A", "i", "P", "k", "s", "l", "F", "q" }; int matchChar(char a, char b, char* mNum); int decode(char* src, char * buf); int main() { /*待解碼fromEncodeUin放在這里,注意不要包含*S1*這四個字符*/ char str[30] = { "oKoezon5" }; char buf[30]; memset(buf, 0, 30); decode(str, buf); std::cout << "解碼結果:\n" << buf << std::endl; return 0; } int matchChar(char a, char b, char* mNum) { if (NULL == mNum) return -1; int i; if ('o' == a) { i = 0; while (i < 4) { if (table[i][1] == b) { *mNum = i % 10 + 48; return 2; } i++; } /*增加多條特殊情況,if語句太多了-_-*/ if ('n' == b) { *mNum = 0 + 48; return 2; } if ('z' == b) { *mNum = 3 + 48; return 2; } *mNum = 3 + 48; return 1; } else if ('7' == a) { i = 4; while (i < 8) { if (table[i][1] == b) { *mNum = i % 10 + 48; return 2; } i++; } if ('v' == b) { *mNum = 5 + 48; return 2; } if ('z' == b) { *mNum = 7 + 48; return 2; } return -1; } else if ('N' == a) { i = 8; while (i < 10) { if (table[i][1] == b) { *mNum = i % 10 + 48; return 2; } i++; } if ('v' == b) { *mNum = 9 + 48; return 2; } if ('n' == b) { *mNum = 8 + 48; return 2; } return -1; } i = 10; while (i < 30) { if (table[i][0] == a) { *mNum = i % 10 + 48; return 1; } i++; } return -1; } int decode(char* src, char * buf) { if (NULL == src || NULL == buf) { return -1; } char* p = src; char* q = buf; int rc = 0; while ('\0' != *p && -1 != (rc = matchChar(*p, *(p + 1), q))) { p += rc; q++; } return 0; }