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



