|
一个编写传奇封外挂(反外挂)系统的完成过程 - 窗口监测篇
窗口检测就比较简单、就是通过窗口的类型和文本文字以及窗口大小位置特征来判断拥有指定特征外挂程序的方法。本方法比较简单、外挂作者也比较容易通过修改和隐藏这些特征来逃脱检测,但是本文还是要讲解一下,在实际的应用中还是能起到一定辅助作用的。
窗口检测方法需要用到函数有:FindWindowEx、GetWindowThreadProcessId、GetClassName、和GetWindowText、GetWindowRect、GetClientRect。 也可以使用 EnumWindows 枚举所有窗口。
通过 FindWindowEx 函数查找所有窗口的代码示例:
- void GetWindowsInfo(HWND hParent)
- {
- HWND hWnd = 0;
- char szClass[0xff];
- char szText[0xff];
- RECT wndRect;
- RECT cltRect;
- DWORD dwPID;
- while (TRUE)
- {
- hWnd = g_pApis->FindWindowExA(hParent, hWnd, NULL, NULL);
- if (hWnd == NULL)
- {
- break;
- }
- //获取窗口PID
- g_pApis->GetWindowThreadProcessId(hWnd, &dwPID);
-
- //获取窗口类名
- g_pApis->GetClassNameA(hWnd, szClass, sizeof(szClass));
-
- //获取窗口标题
- g_pApis->GetWindowTextA(hWnd, szText, sizeof(szText));
-
- //获取窗口区域和尺寸
- g_pApis->GetWindowRect(hWnd, & wndRect);
- g_pApis->GetClientRect(hWnd, &cltRect);
-
- GetWindowsInfo(hWnd);
- }
-
- //组合记录并上传PID、父窗口、类名、窗口标题和文本,以及窗口位置尺寸
- //在服务器端通过人工判断组成特征库
- }
复制代码 将PID,类型、窗口类名标题和窗口坐标尺寸信息组合上传到服务器,在通过人为判断生成窗口特征库。定时从游戏客户端获取窗口信息或者下发窗口匹配特征到游戏客户端判断。
比如说同进程下同时存在:
1、存在 className='msctls_statusbar32' ,text = "XXXX辅助"
2、 存在 className ="buffton" , text = "加速" ,父窗口 = 窗口1
等等条件可随意组合,使特征不与其它软件撞衫,但又能精准定位即可。
等等组合特征的判断。如果外挂使用图片作为按钮和Lable文字显示,也可使用窗口组成结构,以及尺寸大小来生成特征码判断。
本篇的方法也是较早些年封挂常用的方法,包括检测进程名称,模块名称等等。但是进程名称可以被随意修改,进程文件内容也可通过加壳后随意修改。但是窗口一般为了保持原本功能,最多就是变变标题文字,加点空白特殊符号这些,加得太奇怪,用户用着也别扭。可以使用模糊匹配,窗口坐标尺寸也可以写成范围来断定。
|
|