需要工具:安卓手機, 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;
}



