《QQ列表精灵》源代码分析!公布

类别:Delphi 点击:0 评论:0 推荐:

    软件名称:《QQ列表精灵》
    下载地址:http://redyunlong.51.net/redlegend/download.php

    
    该软件是本人在2002年根据“腾讯QQ”的“oicq2000.cfg”文件的漏洞,制作的可以更改,编辑,删除登陆列表的程序,并且可以里面的信息得到自动登陆的密码。
    发现漏洞:
    我们在一台电脑登陆过QQ之后,下次启动QQ的时候就会看到在号码列表的下拉菜单中会出现这个号码,这些号码实际上是保存在QQ安装目录的“dat\oicq2000.cfg”文件里,用记事本打开就可以看到登陆过的号码了。
    分析漏洞:
    样本:
     
下面来研究“oicq2000.cfg”这个文件,用任何一个16进制的编辑器打开文件就会看到所有登陆过的号码,它的格式是这个样子的。
    例如00 00 00 00 00 00 00 00 05 00 00 00 06 00 00 00 31 32 33 34 35 36 06 00  00 00 32 32 32 32 32 32
    第1位  表示是否有密码,如果你在登陆QQ的时候选择了“记住密码”的话,这个位就是01,否则是00
    第2位—>第8位 无内容 00 00 00 00 00 00 00
    第9位 表示这个列表文件共有几个号码,之后用三个“00”进行分隔,之后的“05”表示第一个QQ号码的位数,之后在用三个“00”进行分隔,接下来的“31 32 33 34 35 36”表示的是16进制的123456。紧接其后的是下一个号码的位数,如此循环,最后几位就是列表中最后一个QQ号码了。
    例如:(这个是带自动记录密码的列表文件的格式)
    01
00 00 00 02 00 00 00 92 86 00 00 00  05 00 00 00 06 00 00 00 31 32 33 34 35 36 
    假设我们的号码123456的密码是my,则它记录的格式如上。
    第1位 表示这个列表中含有密码,然后是分隔符号,接下来的“02”表示保存的密码的位数为2位,然后是分隔符,接着的“92 86”就是密码了,我们的密码为“my”,对应的16进制为“6D 79”,对比如下:
                          92   86
                          6D  79

  原来每一位与下面对应的相加都是“FF”,如 92+6D=FF,86+79=FF,这样我们就可以轻易的将密码破解了。

Delphi实现代码:
     下面给出的是不含密码的数据读取过程
                    procedure getQQList();
                    var
                         k,i,j:integer;
                         cfg:File;
                         Number,Weishu,Hao:Byte;//Number
                    begin
                        assignFile(cfg,'x:\xx\oicq2000.cfg');
                        try
                          reset(cfg,1);
                          k:=8;
                          seek(cfg,8);
                          Blockread(cfg,Number,1,ret);//读取号码的个数
                          inc(k,4);
                          for i:=1 to Number do //循环读取各个号码 
                          begin
                              x:='';
                              seek(cfg,k);
                              Blockread(cfg,Weishu,1,ret);//读取号码的位数
                              inc(k,4);
                              for j:=1 to Weishu do //循环读取号码
                              begin
                                  seek(cfg,k);
                                  Blockread(cfg,hao ,1,ret);
                                  inc(k);
                                  x:=x+char($+hao);//x中保存就是号码
                              end;
                              listbox1.items.add(x);
                           end;

                      end;
关于带密码的列表文件的读取和该过程类似,只是在第一位的时候进行判断就可以了。
到此为止,你就可以自己根据这个原理制作各种各样的列表软件了,比如添加,删除,更改,改变顺序等功能都可以自己设计了,并且还可以自己更改密码,设置自己的登陆密码。好省下的就看你了。
                                

本文地址:http://com.8s8s.com/it/it4754.htm