天天看點

Delphi制作QQ自動登入器源碼

以TM2009為例,檢查了一下,未登入之前一個窗體,上邊兩個控件,登入以後,窗體捕獲到一個控件,根據這個,首先找到QQ登入框,輸入使用者名,密碼的位置,擷取窗體句柄的具體代碼如下:

這裡先定義了一個record類型,

1   TQQWnd= record

2     QQWnd,QStatusWnd: HWND;  //QQ視窗句柄,QQ彈出登入狀态句柄

3     QQNumWnd, QQPassWnd: HWND; //QQ号碼輸入句柄,QQ密碼輸入句柄

4   end;

5

 1   function GetQQLoginHwdvar A QQWnd: TQQWnd: Boolean;

 2   var

 3     WinTitle: array[0..254] of Char;

 4     WinClass: array[0..254] of Char;

 5   begin

 6     Result:= False;

 7     A QQWnd.QQWnd:= 0;

 8     A QQWnd.QQNumWnd:= 0;

 9     A QQWnd.QQPassWnd:= 0;

10     A QQWnd.QQWnd:= FindWindownil, 'TM2009';

11     while A QQWnd.QQWnd<> 0 do begin

12       A QQWnd.QQNumWnd:= FindWindowExAQQWnd.QQWnd, 0, 'A TL:30A 4D1D8', nil;

13       A QQWnd.QQPassWnd:= FindWindowExAQQWnd.QQWnd, 0, 'Edit', nil;

14       if AQQWnd.QQNumWnd<> 0and AQQWnd.QQPassWnd<> 0 then begin

15         Result:= True;

16         FOpened:= True;

17         Exit;

18       end else begin

19         A QQWnd.QQWnd:= GetWindowAQQWnd.QQWnd, GW_HWNDNEXT;

20         if A QQWnd.QQWnd=0 then Continue;

21         GetWindowTextAQQWnd.QQWnd, @WinTitle, SizeOfWinTitl;

22         if WinTitle<>'TM2009' then Continue;

23       end;

24     end;

25   end;

26

因為騰訊的密碼輸入框,采用的低級鈎子,然後定時的釋放,建立鈎子這種方式來防止木馬順序去捕獲,嘗試了下,直接的用Sendmessag去發送密碼資訊,沒反應,是以這裡我采用了SendInput方式去輸入密碼,而使用者框因為沒有做任何的維護措施,是以可以直接的通過發送消息,将QQ賬戶資訊給指派過去,具體代碼為

 1       SetForegroundWindowQQWnds.QQWnd; //QQ窗體設定為活動窗體

 2       //設定QQ号碼

 3        SendMessagQQWnds.QQNumWnd,WM_SETFOCUS,0,0; //聚焦至QQ号碼輸入框

 4       Sleep20;

 5       SendMessagQQWnds.QQNumWnd,WM_SETTEXT,0,LPA RA MFQQNum; //設定QQ号碼

 6

 7       SendMessagQQWnds.QQPassWnd,WM_SETFOCUS,0,0; //聚焦密碼輸入框

 8       Sleep20;

 9       //設定QQ密碼

10       SIKeyInputFQQPass, 10; //QQ密碼采取SENDINPUT方式

11

12

13

解下來要操作的就是設定登入方式了譬如說“線上”隐身”等狀态,由于騰訊的登入窗體是采用的GUI是以是捕獲不到句柄的隻能通過坐标來捕獲,之前的時候,用的固定坐标,然後有的電腦可以用,有的不能用,後來才發現,由于騰訊的界面可以拉動,隻要一拉動,坐标位置就變了是以我這裡采取相對坐标,根據QQ密碼框的坐标,來設定點選的坐标。騰訊的狀态是窗體上點選以後,彈出一個跟登入框平級的視窗,是以點選以後,需要檢測是否彈出選擇狀态視窗,找到那個視窗句柄以後,再發送相應的點選指令,這樣就完成整個的流程了

 1 const

 2   QQStatusYA rray: array[0..5] of Integer= 19, 38, 62, 86, 105, 131;

 3

 4

 5       ClickTimes:= 0; //為防止有的時候點選過程中出現其他不可預料的錯誤,這裡可以重複點選三次

 6       QQWnds.QStatusWnd:= 0; //設定QQ狀态初始句柄為0

 7       //滑鼠點選

 8       while ClickTimes<3 do begin

 9         PostMessagQQWnds.QQWnd,$201,MK_LBUTTON,StrToInt#36+IntToHexQQNumRec.Bottom- QQRect.Top+21,4+IntToHexQQNumRec.Left-QQRect.Left+25,4; //發送點選消息,這裡如果采用SendMessag會死線程,是以我采用了PostMessage

10         PostMessagQQWnds.QQWnd,$202,MK_LBUTTON,StrToInt#36+IntToHexQQNumRec.Bottom- QQRect.Top+21,4+IntToHexQQNumRec.Left-QQRect.Left+25,4;

11         Sleep200;

12         QQWnds.QStatusWnd:= FindWindow'TXGuiFoundation','TXMenuWindow'; //檢測是否存在QQ設定狀态窗體

13         if QQWnds.QStatusWnd<>0 then begin

14           try

15             PostMessagQQWnds.QStatusWnd,$201,MK_LBUTTON,StrToInt#36+IntToHexQQStatusYA rray[FQQStatus],4+IntToHex27,4; //如果存在窗體,直接的發送點選資訊

16             PostMessagQQWnds.QStatusWnd,$202,MK_LBUTTON,StrToInt#36+IntToHexQQStatusYA rray[FQQStatus],4+IntToHex27,4;

17           except

18           end;

19           Break;

20         end;

21         ClickTimes:=ClickTimes+1;

22       end;

23       if QQWnds.QStatusWnd=0 then begin //如果一直沒有捕捉到設定狀态窗體,順序則自動退出

24         Task.Comm.SendMSG_QQ_ERR, IntToStrQQRect.Left+''+ IntToStrQQRect.Top+ ''+ In

tToStrQQRect.Right+ ''+ IntToStrQQRect.Bottom

25           +''+ IntToStrQQNumRec.Left+''+ IntToStrQQNumRec.Top+ ''+ IntToStrQQNu

mRec.Right+ ''+ IntToStrQQNumRec.Bottom

26           + IntToStrQQNumRec.Bottom- QQRect.Top+21+'設定狀态失敗';

27 //        Task.Comm.SendMSG_QQ_ERR, IntToStrQQNumRec.Left-QQRect.Left+25+''+ IntToStrQQNumRec.Bottom- QQRect.Top+21+'設定狀态失敗';

28         Exit;

29       end;

30

最後,直接的點選登入按鈕就可以了這個地方,也是要計算相對于密碼輸入框的坐标

1       //點選登入按鈕

2       try

3         PostMessagQQWnds.QQWnd,$201,MK_LBUTTON,StrToInt#36+IntToHexQQNumRec.Bottom- QQRect.Top+114,4+IntToHexQQNumRec.Left-QQRect.Left+64,4;

4         PostMessagQQWnds.QQWnd,$202,MK_LBUTTON,StrToInt#36+IntToHexQQNumRec.Bottom- QQRect.Top+114,4+IntToHexQQNumRec.Left-QQRect.Left+64,4;

5       except

6       end;

7

繼續閱讀