移动存储安全

日期: 2008-02-21 来源:TechTarget中国

  当你的U盘,移动硬盘遗失了,被盗了,或者是遗忘在公共场所,里面的资料就会完全被别人窥探,如果涉及一些隐私,机密,那后果是很严重的。本课题就是在这样一个情况下产生的。这里剖析的只是一个最初的演示原型,详细设计,以及一些细节可以参考源代码。源代码在WinXP,VC6.0编译通过。

  1、访问注册表读取计算机上的移动存储设备

  在注册表

  HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDiskEnum

  下面可以看到计算机当前的状态,这里可以看到所有的存储设备的情况,包括计算机的硬盘,通过情况下,名称为0的是计算机硬盘,所以在列出的选择设备时,会把名称为0的屏蔽,不然太危险,一旦造成系统的破坏,后果会很麻烦。对注册表的读写:

  HKEY hkey;
  char sz[256];
  DWORD dwtype,sl = 256;
  for(int i=1;i<8;i++)
  {
          if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Services\Disk\Enum",
                  NULL, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS)
          {
                  CString id;
                  id.Format("%d",i);
                  if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)
                  {
                          CString str=(CString)sz;
                          m_select.AddString(sz);
                  }
          }
  }
  RegCloseKey(hkey);
  <上面这段代码好像有资源泄漏问题。注册表打开与关闭没有成对,应该在循环外面打开注册表才对–man.fish注>

  2、对磁盘的扇区的操作

  Windows 操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOS、BIOS中断等等),其实Windows在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,即把所有的硬件设备全部看做“文件”,并允许按照对文件的读写方式来对其进行数据存取访问。对于磁盘扇区的读写,可以通过C++的CreateFile()函数来实现。由MSDN可查询到该函数原型:

  HANDLE CreateFile(
  LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDisposition,
  DWORD dwFlagsAndAttributes,
  HANDLE hTemplateFile );

  由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。

  使用的时候,如果需要定位到某一个具体的扇区,可以使用SetFilePointer()函数:

  DWORD SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);

  在定位到要访问的扇区开始位置后就可以通过ReadFile()或WriteFile()函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。最后,在完成访问操作后以CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据访问操作。

  int ReadDisk(CString driver,unsigned char *Buf,long addr)
  {
          HANDLE hDevice;
          BOOL bResult;
          DWORD bytesread;
       
          hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
                  FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
          if(hDevice==INVALID_HANDLE_VALUE)
          {
                  AfxMessageBox("Error!");
                  return 0;
          }
          if(addr!=0)
          {
                  SetFilePointer(hDevice,512*addr,NULL,NULL);
          }
       
          bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);
          if((bResult==FALSE)||(bytesread<512))
          {
                  AfxMessageBox("Error!");
                  return 0;
          }
          CloseHandle(hDevice);
          return 1;
  }

  3、用RC4加密算法对磁盘加密。

  /* RC4加密,KEY是密钥,此处Key[]="MobileStorageSecurity",后期可以用户输入的密码作为密钥 */
  RC4_KEY rc4_key;
  build_rc4_key(Key,strlen((char*)Key),&rc4_key);
  rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);

  4、U盘插入计算机时的自动感知

  LRESULT CRawDiskDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  {
          if ( WM_DEVICECHANGE == message && FALSE == bCopy )
          {
                  //刷新设备列表
          }
          return CDialog::WindowProc(message, wParam, lParam);
  }

  后期改进

  这样就必须要求在电脑上有这个程序,所以在后期采用同样的原理,将这个程序放在U盘里,在加密的时候实现对自身的屏蔽,这样大大提高程序的易用性。

  可以让用户输入密码,将密码作为密钥去加密和解密。

  这个只是对一个磁盘最初的512字节加密,后期可以通过对扇区的定位和计算,对目录表及数据加密。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐