【抢客网】获取QQ好友共同好友列表信息_【百度霸屏推广软件】【手机号码获取软件】【QQ好友列表获取软件】【微信好友列表提取软件】【百度霸屏劫持软件】【抢客户软件】一切为用户转化而生【牛B的精准营销拓客神器】- 【抢客系统4.0】

【抢客网】获取QQ好友共同好友列表信息

时间:2018-05-27 15:21 作者:admin 点击量:

QQ推出过可以了解你和你的好友之间有多少个共同好友的功能。

 共同好友功能 

​有时候,我会好奇。咦,这个共同好友都会有谁呢,咱们的交际圈子相互认识的都会有谁呢?这是一个好玩的问题哈。会不会觉得很神奇。是的,我们活在圈子下,指不定哪天,大家聚在一起,才发现世界这么的小,原来你我之间的距离这么近。好了,抒情了一段,下面说说本文要做的事情:本文的最终目的旨在揪出这些共同好友的QQ号码。(因为当时做这个实验是一年多前做的,现在凭借回忆写的,所有有一些地方可能写的不对或者有错,或者没有写出来)

​思路: 1、获取双方的QQ好友列表

    2、求交集,得到共同好友。

​别看思路这么简单,实现起来可不容。本案例的难点重点在于如何获取到双方的QQ好友列表,这是个头疼的问题。想想,腾讯那么牛X。肯定不会轻易将这种信息给你破解的了。qq软件在本地缓存文件夹下建立本地数据库,以.db文件形式存在,这个路径可以在QQ的设置中找到。如图所示。

 对应QQ号缓存本地信息文件结构

这这里面的所有.db就是QQ软件所需的个人所有个人信息。包括好友信息、头像信息、聊天信息(聊天信息的加解密算法是最麻烦的)等等。我们需要在这些.db文件中找到我们要的好友列表信息。这个工作可不好做。

First ofall,我找了一篇大牛的文章来研究。文章名字叫做“基于QQ的DB文件格式解析”​这个网上应该找的到,自己去找一下啦。他说讲的QQ本地数据文件结构应该是好几年前的了,文件结构可能对不上,当时加密算法是OK的。我把其中一段截图下来来作说明。

基于QQ的DB文件格式解析 文章截图

非常感谢这篇文章的作者。在这篇文章中,我们知道了QQ对​好友列表信息是如何加密的。51 44 代表是QQ好友信息;A9B5 B2 是1S标志,即QQ号码标志;04 00 00 00是1S数据的长度;9A 4D 1F 04是QQ号码,即69160346 0x041F4D9A(高位在前)。OK ,这便是我们需要的——好友的QQ号。把所有的QQ号码都找到就能找到该QQ号的所有好友列表了。​

这一步操作目的明确了后,那么我们就需要知道到底哪个.db文件是存储的​QQ好友列表信息的。(这里我忘记是怎么找到得了,确实忘记了。希望大神能帮我补充一下。)

这里用​EditPlus对.db文件查看,open with Encoding选择Hex viewer编码。这里看到的是十六进制的一系列数据,其中就有上述所说的QQ好友的信息。

Hex viewer编码下.db文件数据

假设已经找到对应的 xxxx.db文件是存储好友列表信息的。为了后面方便对这些十六进制数操作,我将对应的所有数据复制到txt文件中(注意:目前我发现只能用EditPlus将数据Ctrl+c,Ctrl+v复制到txt里面),如下如所示。

txt复制文件内容

接下来就是要实现筛选和转换数据的功能,我使用的是C#来作这件事,把对应的数据获取存到数据中就OK,要说的是,数据库我做的很简单,用的MSSQL,两张表,一张A表存QQ号A的好友列表,一张B表存QQ号B的好友列表。结构如下,最后用SQL查询做对比就OK了。

数据库表结构

​下面把实现提取数据存入数据库功能的主要代码贴上来(程序写的比较渣,没优化,没调整)。

class Program

    {

        byte[] byData = new byte[100];

        char[] charData = new char[1000];

        static void Main(string[] args)

        {

            Read("C:\\Users\\Administrator\\Desktop\\QQDB\\测试\\XXXXXXX.txt");//改成你的txt文件

        }

        static public void Read(string url)

        {

            StreamReader sr = new StreamReader(url, Encoding.Default);

            String line;

            while ((line = sr.ReadLine()) != null)

            {

                string before=line.ToString();//在做截取之前的字符串

                string after="";

                int index = line.ToString().IndexOf("04");

                int len=line.ToString().Length;

                string str = "";

                if(index==45)//"04位于最后面的位子,读取下一行的内容

                {

                    if((line=sr.ReadLine())!=null)//读取的下一行不为空

                    {

                        if(line.ToString().IndexOf("00 00 00")==0)//前一个位子是00 00 00

                        {

                            str=line.ToString().Substring(9,11);

                        }

                    }

                }

                else if(index==42)//在倒数第二个位子,后面是否为00,再读取下一行

                {

                    if (before.Substring(45) == "00")

                    {

                        if ((line = sr.ReadLine()) != null)//读取的下一行不为空

                        {

                            if (line.ToString().IndexOf("00 00") == 0)

                            {

                                str = line.ToString().Substring(6, 11);

                            }

                        }

                    }

                }

                else if (index == 39)

                {

                    if (before.Substring(42) == "00 00")

                    {

                        if ((line = sr.ReadLine()) != null)//读取的下一行不为空

                        {

                            if (line.ToString().IndexOf("00") == 0)

                            {

                                str = line.ToString().Substring(3, 11);

                            }

                        }

                    }

                }

                else if (index == 36)

                {

                    if (before.Substring(39) == "00 00 00")

                    {

                        if ((line = sr.ReadLine()) != null)//读取的下一行不为空

                        {

                            str = line.ToString().Substring(0, 11);

                        }

                    }

                }

                else

                {

                    if (before.Substring(index + 3, 8) == "00 00 00")

                    {

                        index = index + 12;

                        after = line.Substring(index);

                        if (after.Length < 11)

                        {

                            str = after;

                            

                            if ((line = sr.ReadLine()) != null)//读取的下一行不为空

                            {

                                str += " " + line.ToString().Substring(0, 11 - after.Length-1);

                            }

                        }

                        else

                        {

                            str=line.Substring(index,11);

                        }

                    }

                }

                if (str != "")

                {

                    string a = str.Substring(0, 2);

                    string b = str.Substring(3, 2);

                    string c = str.Substring(6, 2);

                    string d = str.Substring(9, 2);

                    string newstr = d + c + b + a;

                    int aaa  = Convert.ToInt32(newstr,16);

                    Add(aaa.ToString());

                }

            }

        }

        static public void Add(string sqlstr)

        {

            string aa = "server=.;database=QQFriendList;uid=sa;pwd=admin123";

            SqlConnection conn = new SqlConnection(aa);

            SqlCommand comm = new SqlCommand("insert into [dbo].[ListB]([ListBdeQQ]) values ('" + sqlstr + "')", conn);//ListA存了,存ListB

            conn.Open();

            comm.ExecuteNonQuery();

            conn.Close();

        }

    }

​将两方的数据都存入数据库后,在做个求交集的SQL语句,答案就出来了。代码如下。

select DISTINCT [ListBdeQQ] from 

(select * from [dbo].[ListB] where [ListBdeQQ] in (select [ListAdeQQ] from [dbo].[ListA]))

 as  C

where [ListBdeQQ]>10000

求交集结果

​这个便是两个QQ好友之间共同好友的QQ号,但是这里需要说的是,这里的QQ号,不一定都是的,有一些是无用数据,在QQ上手动一条一条看就可以了。

上一篇:获取QQ群数据的实现

下一篇:一步一步来做获取好友列表和群列表

注册体验: