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