需要工具:安卓手机, 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
现在我们就得到数据了,接下来使用解密工具解密即可,将数据粘贴进去即可
Z实验室在线解密工具
解密源码如下
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; }