在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
http://www.cnblogs.com/sunsoft/archive/2011/02/25/1964967.html
以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 至此,整个的流程完毕了最后,还可以增加上检测该QQ号码是否已经登录 以下是最后进去的界面,直接的将QQ信息保管在数据库当中,密码采用了AES加密,所以也不用担心密码信息被泄 以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 至此,整个的流程完毕了最后,还可以增加上检测该QQ号码是否已经登录 以下是最后进去的界面,直接的将QQ信息保管在数据库当中,密码采用了AES加密,所以也不用担心密码信息被泄 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论