滴水逆向联盟

标题: VC++实现U盘开机锁 [打印本页]

作者: 大灰狼    时间: 2014-10-15 10:18
标题: VC++实现U盘开机锁
  1. #include <windows.h>  
  2. #include <winioctl.h>  
  3. #include <stdio.h>  
  4. #include <initguid.h>  
  5. #include <setupapi.h>  
  6. #include <string.h>  
  7.   
  8.   
  9. #define MAX_DEVICE 256  
  10. wchar_t USBSerial[5][100] = {TEXT("")};  
  11. int gTag = 0;  
  12. DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);  
  13. // SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大  
  14. #define INTERFACE_DETAIL_SIZE    (1024)  
  15. // IOCTL控制码  
  16. #define IOCTL_STORAGE_QUERY_PROPERTY   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)  
  17.   
  18. #pragma comment(lib,"setupapi.lib")  
  19.   
  20.   
  21. //自动关机函数  
  22. void ExitWindowsCode()  
  23. {     
  24.     OSVERSIONINFO   stOSVI;     
  25.     ZeroMemory(&stOSVI   ,   sizeof   (   OSVERSIONINFO   ))   ;     
  26.     stOSVI.dwOSVersionInfoSize   =   sizeof   (   OSVERSIONINFO   )   ;     
  27.     if (!GetVersionEx   (   &stOSVI   ))   return;     
  28.               
  29.     if ( ( VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId ) && (  4  <= stOSVI.dwMajorVersion ) )     
  30.     {     
  31.        HANDLE   hToken;         
  32.        TOKEN_PRIVILEGES   tkp;         
  33.        if   (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES   |   TOKEN_QUERY,   &hToken))         
  34.          return;     
  35.       // Get the LUID for the shutdown privilege.         
  36.       LookupPrivilegeValue(NULL,   SE_SHUTDOWN_NAME,   &tkp.Privileges[0].Luid);         
  37.       
  38.       tkp.PrivilegeCount   =   1;   //   one   privilege   to   set         
  39.       tkp.Privileges[0].Attributes   =   SE_PRIVILEGE_ENABLED;         
  40.       AdjustTokenPrivileges(hToken,   FALSE,   &tkp,   0,(PTOKEN_PRIVILEGES)NULL,   0);         
  41.       
  42.       if   (GetLastError()   !=   ERROR_SUCCESS)         
  43.         return;     
  44.       
  45.       if   (!ExitWindowsEx(EWX_SHUTDOWN   |   EWX_FORCE|EWX_POWEROFF,   0))         
  46.         return;     
  47.       
  48.      }     
  49.      else//WIN9X     
  50.      {  
  51.          ExitWindowsEx(EWX_SHUTDOWN   |   EWX_FORCE   |   EWX_POWEROFF,   0);//   关机     
  52.      }   
  53. }  
  54.   
  55. // 根据GUID获得设备路径,用来判断U盘设备  
  56. // lpGuid: GUID指针  
  57. // pszDevicePath: 设备路径指针的指针  
  58. // 返回: 成功得到的设备路径个数,可能不止1个  
  59. int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)  
  60. {  
  61.     HDEVINFO hDevInfoSet;    //设备信息集句柄;  
  62.     SP_DEVICE_INTERFACE_DATA ifdata;  
  63.     PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;  
  64.     int nCount;  
  65.     BOOL bResult;  
  66.   
  67.     // 取得一个该GUID相关的设备信息集句柄  
  68.     hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&UsbClassGuid,     // class GUID   
  69.         NULL,                    // 无关键字  
  70.         NULL,                    // 不指定父窗口句柄  
  71.         DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备  
  72.   
  73.     // 失败...  
  74.     if (hDevInfoSet == INVALID_HANDLE_VALUE)  
  75.     {  
  76.       return 0;  
  77.     }  
  78.   
  79.     // 申请设备接口数据空间  
  80.     pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);  
  81.   
  82.     pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);  
  83.   
  84.     nCount = 0;  
  85.     bResult = TRUE;  
  86.   
  87.     // 设备序号=0,1,2... 逐一测试设备接口,到失败为止  
  88.     while (bResult)  
  89.     {  
  90.         ifdata.cbSize = sizeof(ifdata);  
  91.   
  92.         // 枚举符合该GUID的设备接口  
  93.         bResult = ::SetupDiEnumDeviceInterfaces(  
  94.             hDevInfoSet,     // 设备信息集句柄  
  95.             NULL,            // 不需额外的设备描述  
  96.             lpGuid,          // GUID  
  97.             (ULONG)nCount,   // 设备信息集里的设备序号  
  98.             &ifdata);        // 设备接口信息  
  99.   
  100.         if (bResult)  
  101.         {  
  102.             // 取得该设备接口的细节(设备路径)  
  103.             bResult = SetupDiGetInterfaceDeviceDetail(  
  104.                 hDevInfoSet,    // 设备信息集句柄  
  105.                 &ifdata,        // 设备接口信息  
  106.                 pDetail,        // 设备接口细节(设备路径)  
  107.                 INTERFACE_DETAIL_SIZE,   // 输出缓冲区大小  
  108.                 NULL,           // 不需计算输出缓冲区大小(直接用设定值)  
  109.                 NULL);          // 不需额外的设备描述  
  110.             if (bResult)  
  111.             {  
  112.                 // 复制设备路径到输出缓冲区  
  113.                 wcscpy_s(pszDevicePath[nCount],wcslen(pDetail->DevicePath)+1, pDetail->DevicePath);  
  114.                // 调整计数值  
  115.                 nCount++;  
  116.             }  
  117.         }  
  118.     }  
  119.     // 释放设备接口数据空间  
  120.     ::GlobalFree(pDetail);  
  121.     // 关闭设备信息集句柄  
  122.     ::SetupDiDestroyDeviceInfoList(hDevInfoSet);  
  123.    return nCount;  
  124. }  
  125.   
  126. // 返回U盘设备句柄 hDevice  
  127. HANDLE OpenDevice(wchar_t* DevicePath)  
  128. {  
  129.     HANDLE hDevice;  
  130.     hDevice = CreateFileW(DevicePath,  
  131.         GENERIC_READ && GENERIC_WRITE,  
  132.         FILE_SHARE_READ && FILE_SHARE_WRITE,  
  133.         NULL,  
  134.         OPEN_EXISTING,  
  135.         0,  
  136.         NULL);  
  137.     return hDevice;  
  138. }  
  139.   
  140. int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)   
  141. {  
  142.     int i, nDevice; // nDevice 表示有多少个USB设备  
  143.     int ndevice = 0; // 表示多少个U盘设备(可进行读写的设备)  
  144.     wchar_t* szDevicePath[MAX_DEVICE];        // 设备路径  
  145.     HANDLE hDevice;  
  146.   
  147.     // DWORD dwOutBytes; // IOCTL输出数据长度  
  148.     // 定义一个 PSTORAGE_DEVICE_DESCRIPTOR 变量,存放设备属性  
  149.     PSTORAGE_DEVICE_DESCRIPTOR DeviceDesc;  
  150.     // 变量初始化  
  151.     DeviceDesc=(PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1];  
  152.     DeviceDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;  
  153.   
  154.     // 分配需要的空间  
  155.     for (i = 0; i < MAX_DEVICE; i++)  
  156.     {  
  157.         szDevicePath = new wchar_t[256];  
  158.     }  
  159.   
  160.     // 取设备路径  
  161.     nDevice = ::GetDevicePath((LPGUID)&UsbClassGuid, szDevicePath);  
  162.   
  163.   
  164.     // 逐一获取设备信息  
  165.     for (i = 0; i < nDevice; i++)  
  166.     {  
  167.         // 打开设备  
  168.         hDevice = OpenDevice(szDevicePath);  
  169.       
  170.         if (hDevice != INVALID_HANDLE_VALUE)  
  171.         {  
  172.             for(int j = 0; j < 4; j++)  
  173.             {  
  174.                 USBSerial[ndevice][j] = szDevicePath[j+12];   
  175.             }  
  176.             for(int j = 4; j < 28; j++)  
  177.             {  
  178.                 USBSerial[ndevice][j] = szDevicePath[j+22];   
  179.             }  
  180.             //printf("U盘序列号为:");  
  181.             //wprintf(L"%ws\n", USBSerial[ndevice]);  
  182.             ndevice ++;  
  183.       
  184.             ::CloseHandle(hDevice);  
  185.          }  
  186.          
  187.   
  188.     }   
  189.   
  190.     // 释放空间  
  191.     for (i = 0; i < MAX_DEVICE; i++)  
  192.     {  
  193.         delete []szDevicePath;  
  194.     }  
  195.   
  196. ////////////////// 文件操作 ////////////////////////////////////////  
  197. HANDLE hFile;   
  198. DWORD nBytesRead = 0, dwBytesWritten = 0;  
  199.   
  200.       
  201.      
  202.   
  203. // 打开文件  
  204. hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),    // file to open  
  205.                    GENERIC_READ | GENERIC_WRITE,          // open for reading  
  206.                    FILE_SHARE_READ | FILE_SHARE_WRITE,       // share for reading  
  207.                    NULL,                  // default security  
  208.                    OPEN_EXISTING ,         // existing file only  
  209.                    FILE_ATTRIBUTE_NORMAL, // normal file  
  210.                    NULL);                 // no attr. template  
  211. if (hFile != INVALID_HANDLE_VALUE)  
  212. {  
  213.     long nFileSize = GetFileSize(hFile, NULL);  
  214.     if (nFileSize == 0)  
  215.     {  
  216.         bool flag2 = CloseHandle(hFile);  
  217.          
  218.         if(::SetFileAttributes(TEXT("C:\\Windows\\system32\\USBID.ID"),FILE_ATTRIBUTE_NORMAL))  
  219.         {  
  220.            if (DeleteFile(TEXT("C:\\Windows\\system32\\USBID.ID")))  
  221.            {  
  222.                //MessageBox(NULL,TEXT("oo"),TEXT("oo"),MB_OK);  
  223.            }  
  224.         }  
  225.     }  
  226. }  
  227.   
  228.   
  229. // 打开文件  
  230. hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),    // file to open  
  231.                    GENERIC_READ | GENERIC_WRITE,          // open for reading  
  232.                    FILE_SHARE_READ | FILE_SHARE_WRITE,       // share for reading  
  233.                    NULL,                  // default security  
  234.                    OPEN_EXISTING ,         // existing file only  
  235.                    FILE_ATTRIBUTE_NORMAL, // normal file  
  236.                    NULL);                 // no attr. template  
  237. if (hFile == INVALID_HANDLE_VALUE)   
  238. {  
  239.    hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),     // file to create  
  240.                    GENERIC_READ | GENERIC_WRITE,          // open for writing  
  241.                    FILE_SHARE_READ | FILE_SHARE_WRITE,                      // do not share  
  242.                    NULL,                   // default security  
  243.                    CREATE_ALWAYS,          // overwrite existing  
  244.                    FILE_ATTRIBUTE_NORMAL | // normal file  
  245.                    FILE_ATTRIBUTE_NORMAL,   // asynchronous I/O  
  246.                    NULL);   
  247.    
  248. }  
  249. else  
  250. {  
  251.     if (ndevice < 1)  
  252.        {  
  253.            ExitWindowsCode();  
  254.        }  
  255. }  
  256. long nFileSize = GetFileSize(hFile, NULL);  
  257. wchar_t   *tempbuf =   new   wchar_t[nFileSize]   ;   
  258. // 读文件内容  
  259. if (nFileSize == 0)   
  260. {   
  261.    // 创建文件,并把序列号写入文件中  
  262.    hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBID.ID"),     // file to create  
  263.                    GENERIC_READ | GENERIC_WRITE,          // open for writing  
  264.                    FILE_SHARE_READ | FILE_SHARE_WRITE,                      // do not share  
  265.                    NULL,                   // default security  
  266.                    CREATE_ALWAYS,          // overwrite existing  
  267.                    FILE_ATTRIBUTE_NORMAL | // normal file  
  268.                    FILE_ATTRIBUTE_NORMAL,   // asynchronous I/O  
  269.                    NULL);                  // no attr. template  
  270.   
  271.    if (hFile == INVALID_HANDLE_VALUE)   
  272.     {   
  273.      return 0;   
  274.     }  
  275.    // 把序列号写入文件中  
  276.    WriteFile(hFile,   
  277.       USBSerial,   
  278.       2*wcslen(* USBSerial),   
  279.       &dwBytesWritten,   
  280.       NULL);   
  281.    nFileSize = GetFileSize(hFile, NULL);  
  282.   
  283.    if (nFileSize == 0)  
  284.    {  
  285.        bool flag1 = CloseHandle(hFile);  
  286.    }  
  287.    else  
  288.    {  
  289.        if (ndevice < 1)  
  290.        {  
  291.            ExitWindowsCode();  
  292.        }  
  293.    }  
  294.   
  295. }  
  296. else  
  297. {  
  298.    //进入比较序列号  
  299.    ReadFile(hFile,   
  300.     tempbuf,   
  301.     nFileSize,   
  302.     &nBytesRead,   
  303.     NULL);  
  304.   
  305.    // 比较已经有的序列号与新读的是否相等  
  306.    for(int i = 0; i< ndevice; i ++)  
  307.    {  
  308.     for(int j = 0; j < nFileSize/2; j++)  
  309.     {  
  310.      if(tempbuf[j] == USBSerial[j])      
  311.         gTag = 1;  
  312.      else  
  313.      {  
  314.         ExitWindowsCode();  
  315.      }  
  316.     }  
  317.     if(gTag == 1)  
  318.      break;  
  319.   
  320.    }  
  321.    delete tempbuf;  
  322. }  
  323. return 0;  
  324. }  
复制代码






欢迎光临 滴水逆向联盟 (http://www.dtdebug.com/) Powered by Discuz! X3.2