08
2008
08

自己打造免密码本地QQ登陆器

  在网上看到过不少关于免密码本地QQ登陆器、QQ修改器、无密码查看QQ聊天记录等软件。这些软件都在干什么的呢?由于QQ把聊天记录、好友信息等很多资料都保存在本地的硬盘上,通常情况下没有密码是不能打开那些资料的。
 

  该图就是没有输入正确的密码登陆QQ时的情形。选“否”即退出本次登陆。选“是”即与腾迅服务器验证(呵呵,没有正确密码验证肯定通不过嘛!)。

   而这些软件的作用就是在没有密码的情况下打开保存在本地的那些数据。
我测试过一些这类软件,他们的作用原理大多是修改qq.exe这个文件,把验证本地密码的这一段指令修改或删除,以跳过本地密码验证。基于这种原理,它们都对QQ的版本要求都很严格(不同版本QQ中的qq.exe文件都不相同,其中进行本地密码验证的指令以及指令所在位置都不同),一款软件只适合一个版本的QQ,由于那些软件发布的都比较早,QQ版本更新的又快,所以为了使用那些免密码的QQ登陆器,不得不费尽千辛万苦去找适合该软件版本的QQ。
  找到了那种版本的QQ,一般情况都不会让它覆盖我们电脑上本来的较新的QQ,而是找一个新的目录安装,这样的话存放要登陆的QQ信息的文件夹,就不在新的QQ目录下,也没法使用。即使把存QQ信息的文件夹拷贝过去,由于QQ账号没在登陆列表里,所以还是不行。总的一句那些软件用起来很麻烦(至少我测试过的都不好用)。
现在我们来自己编一个可以实现同样功能的小程序。这的实现思路是这样的:
  当我们在同一台电脑上不是第一次登陆QQ时,如果输入的错误的密码,就会出现如上文图片所示的对话框。而且它出现的速度较快,说明它没有在QQ的服务器上进行验证,而是在本地进行的验证,也就是说登陆过的QQ的密码信息是保存在本地硬盘是的。我想试试能不能把这个密码找出来。
  首先我需要找出保存密码信息的文件。我申请了一个新的QQ,以避免好友资料、聊天记录等信息的干扰。
  例如我申请了一个号码294140345的QQ,密码先设为123456。在我的电脑上登陆。进入QQ的安装目录,就能发现一个名为294140345的文件夹,文件夹里有以下文件:
 

  打开以上的两个文件夹一个存的是PanelData.ini文件,里面以文本保存的是QQ面板信息。第二个可能是QQ空间的文件。把这个文件夹用WinRAR压缩,存为“123456.rar”。
然后把QQ密码改为654321。再来进入这个文件看这些文件。文件的个数没有变化。再一次把这个文件夹用WinRAR压缩,存为“654321.rar”
打开两个压缩文件,如下图所示:
 

123456.rar
 

654321.rar
  通过上图中最后一列的CRC32散列值。比较两次的文件,有变化的文件有:
  User.db   config.db   msgex.db   ewh.db
  失败!仅仅改变密码,有变化的文件居然有这么多,不能放弃,有一些文件保存的可能是QQ系统消息等数据。所以也会变化。我们继续进行这样的比较。
  再次登陆将密码改回123456。同样将文件夹294140345用WinRAR压缩,存为“第二次123456.rar”打开这个压缩文件。得到如下所示图片:
 

第二次123456.rar
  多了一个名为myrecvfiles的文件夹,里面是空的,无所谓。
  综合比较这三次的文件CRC32值,你就会惊喜的发现:ewh.db这个文件又变的和第一次一样了。其它文件在继续变化。
  我们继续进行多次同样的操作,不断更改密码,然后进行文件比较。当密码相同时ewh.db这个文件是相同的。密码不同时这个文件内容也不相同。而且这个文件也比较小,太好了,可以进行一些字节上的比较。但是不一定能成功,如果里面保存的加密信息是和QQ号码相关的话,这也就没法成功了。
  我将我的QQ密码设为123456,比较这两个文件,CRC32值不同。前面说过这个文件很小,可以进行字节的比较。用Winhex(十六进制编辑器)打开这两个文件。将其每个字节的十六进制码复制下来,如下所示:(黑色的是QQ294140345的ewh.db文件字节信息,红色的是QQ117909610的,两个QQ密码都是123456)
514401010300040300BDAFA80400000093940600070300B9ABB4100000005
514401010300040300BDAFA80400000093940600070300B9ABB4100000005

 71D0419E6BA237AE4A6DEB04CF45093040300A9B5B204000000B9398811
71D0419E6BA237AE4A6DEB04CF45093040300A9B5B2040000006A280707

很容易发现,这个60个字节的文件只有后4个字节不同,前56个字节都相同。
在Winhex中将鼠标定位在我的QQ(117909610)的ewh.db文件最后倒数第四个字节上,数据解释器将会如下显示:
 

最后一行后面就是我的QQ号码了。再打开一些QQ的ehw.db文件,会发现最后四节就是QQ号码的16进制数。
  按照这个思路进行下去,就会发现相同密码则ehw.db文件中前56个字节相同。密码不同时前16个字节总是相同。这些可能是用来表述这些数据结构的。我将我QQ中的ewh.db文件最后四个字节的信息改为7000974的十六进制,这个十六进制是反向排列的。然后用这个文件覆盖掉我的7000974文件夹中的ewh.db。然后登陆7000974这个QQ。
登陆成功!!
把上面的过程简化,写成一个C程序来生成ewh.db文件,默认密码设为123456。
/*  QQ免密码登陆器 */
#include "stdio.h"
#include "conio.h"

 main()
{   long qq;  /*QQ号码*/
    char i;      /*循环变量*/
    char qs[60]={0x51,0x44,0x01,0x01,0x03,0x00,0x04,0x03,0x00,0xBD,0xAF,0xA8,0x04,0x00,0x00,0x00,0x93,0x94,0x06,0x00,0x07,0x03,0x00,0xB9,0xAB,0xB4,0x10,0x00,0x00,0x00,0x57,0x1D,0x04,0x19,0xE6,0xBA,0x23,0x7A,0xE4,0xA6,0xDE,0xB0,0x4C,0xF4,0x50,0x93,0x04,0x03,0x00,0xA9,0xB5,0xB2,0x04,0x00,0x00,0x00};        /*这就是密码为123456的QQewh.db的前56个字节*/
    FILE *fp;
    printf("Please Input QQ number:");
    scanf("%ld",&qq);
    qs[56]=qq%256;
    qq=qq/256;
    qs[57]=qq%256;
    qq=qq/256;
    qs[58]=qq%256;
    qq=qq/256;
    qs[59]=qq%256;   /*将输入的QQ号码转为16进制反排*/
    fp=fopen("ewh.db","wb");
    for(i=0;i<60;i++)
      fputc(qs[i],fp);
    fclose(fp);
    printf("Please any key exit!");
    getch();
}
  使用方法:执行该程序输入要登陆的QQ号码,就会在程序目录下生成ewh.db文件。将这个文件拷贝到要登陆的QQ账号目录下,覆盖掉原来的文件,就可以用密码123456来登陆QQ了。登陆后会弹出对话框说密码错误,不用管,点确定就可以了。然后QQ会处于离线状态,不能聊天。要查看聊天记录的话要进入菜单->好友与资料->消息管理器。
  经过进一步实验, ewh.db这个文件里面的加密信息,很复杂,以我无法破解,放弃了。
  然后用类似的CRC32值比较法,可以找到QQ用来保存曾经登陆过的QQ账号名的文件是LoginUinList.dat,里面的QQ号码也是用十六进制数反排列的。替换就可以将需要的QQ号码添加到登陆列表里了。

« 上一篇下一篇 »

相关文章:

评论列表:

3.水和米  2009/1/29 1:15:15 回复该留言
有些聊天记录查看器,不需要QQ.EXE的。
.admin  2009/2/2 10:27:18 回复该留言
那一类的软件是直接分析MsgEx.db文件的。
2.123  2008/12/10 21:38:32 回复该留言
想问一下,这个能用吗?
.admin  2008/12/11 22:27:38 回复该留言
最新版本的文件格式没有试过,以前版本验证过,是没有问题的。
1.比特中国  2008/9/25 12:04:10 回复该留言
老同学打开你的网站就有点知音的感觉!!真希望咱们都能快速跑起来!~~~加油

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。