www.pudn.com > DetourQQ.rar > DetourQQ.cpp
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 预处理 #include "Define.h" #include#include "AboutDlg.h" #include "CodeAtom.h" #include "Resource.h" #pragma warning(disable:4244) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 补丁数据 /* 00405D9C |. 50 PUSH EAX 00405D9D |. 51 PUSH ECX 00405D9E |. 53 PUSH EBX 00405D9F |. FF75 08 PUSH DWORD PTR SS:[EBP+8] 00405DA2 |. 52 PUSH EDX 00405DA3 |. FF57 20 CALL DWORD PTR DS:[EDI+20] 00405DA6 85C0 TEST EAX,EAX 00405DA8 |. 5F POP EDI 00405DA9 |. 0F84 99000000 JE QQ.00405E48*/ #define STR_LoginStamp "\x50\x51\x53\xFF\x75\x3F\x52\xFF\x57\x3F\x85\xC0\x5F\x0F\x84" #define STR_LoginPatch "\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x3F\x33\x3F\x3F\x3F\x3F" CODEATOM caPatch[] = { {0x00400000, 0x000A0000, sizeof(STR_LoginStamp) - 1, STR_LoginStamp, STR_LoginPatch}, }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 命令处理 VOID OnCommand(HWND hWnd, WPARAM wParam) { OPENFILENAME ofnFile; TCHAR tzPath[MAX_PATH]; switch (LOWORD(wParam)) { case IDC_Path: // 路径文本改变 if (HIWORD(wParam) == EN_CHANGE) { EnableWindow(GetDlgItem(hWnd, IDOK), (BOOL) SendDlgItemMessage(hWnd, IDC_Path, WM_GETTEXTLENGTH, 0, 0)); } break; case IDC_Browse: // 浏览获取文件名 tzPath[0] = 0; ZeroMemory(&ofnFile, sizeof(OPENFILENAME)); ofnFile.lStructSize = sizeof(OPENFILENAME); ofnFile.hwndOwner = hWnd; ofnFile.lpstrFile = tzPath; ofnFile.nMaxFile = MAX_PATH; ofnFile.lpstrFilter = STR_Filter; ofnFile.lpstrDefExt = STR_Exe; ofnFile.Flags = OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; if (GetOpenFileName(&ofnFile)) { SetDlgItemText(hWnd, IDC_Path, tzPath); } break; case IDC_About: // 显示关于对话框 CAboutDlg::Show(hWnd); break; case IDOK: // 执行 GetDlgItemText(hWnd, IDC_Path, tzPath, MAX_PATH); if (CCodeAtom::Execute(tzPath, caPatch, _NumberOf(caPatch))) { MessageBox(hWnd, STR_Sucess, STR_AppName, MB_ICONINFORMATION | MB_TOPMOST); } else { if (MessageBox(hWnd, STR_Failure, STR_AppName, MB_ICONQUESTION | MB_TOPMOST | MB_YESNO) == IDYES) { ShellExecute(NULL, NULL, STR_WebUrl, NULL, NULL, SW_NORMAL); } } break; case IDCANCEL: // 退出 EndDialog(hWnd, 0); break; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 初始化对话框 VOID OnInitDialog(HWND hWnd) { HKEY hKey; DWORD dwLength; TCHAR tzPath[MAX_PATH]; // 设置图标 SetClassLongPtr(hWnd, GCL_HICON, (LONG_PTR) LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_Main))); // 搜索路径 tzPath[0] = 0; if (SearchPath(NULL, STR_ExeName, NULL, MAX_PATH, tzPath, NULL) == 0) { // 查询注册表中的路径 if (RegOpenKey(HKEY_LOCAL_MACHINE, STR_SubKey, &hKey) == 0) { dwLength = sizeof(tzPath); RegQueryValueEx(hKey, STR_Install, NULL, NULL, (PBYTE) tzPath, &dwLength); RegCloseKey(hKey); } SearchPath(tzPath, STR_ExeName, NULL, MAX_PATH, tzPath, NULL); } // 设置路径 if (tzPath[0]) { SetDlgItemText(hWnd, IDC_Path, tzPath); } else { OnCommand(hWnd, IDC_Browse); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 回调函数 INT_PTR CALLBACK MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: OnInitDialog(hWnd); break; case WM_COMMAND: OnCommand(hWnd, wParam); break; case WM_CLOSE: OnCommand(hWnd, IDCANCEL); break; default: return FALSE; } return TRUE; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 程序入口 INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pszCmdLine, INT iCmdShow) { return (INT) DialogBox(hInstance, MAKEINTRESOURCE(IDD_Main), NULL, MainDlgProc); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////