中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 临时文章
《QQ列表精灵》源代码分析!公布
作者:redlegend_126_com 时间:2002-09-25 11:40 出处:互联网 责编:chinaitpower
              摘要:《QQ列表精灵》源代码分析!公布

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

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


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有