当前位置:编程学习 > VC++ >>

VC++信息安全编程(13)Windows2000/xp/vista/7磁盘扇区读写技术

 

 

有些时候,我们读取磁盘文件,会被hook.我们读到的可能并非实际的文件。

 

我们直接读取磁盘扇区获取数据。

 

实现磁盘数据的读写,不依赖WindowsAPI。

 

 

 

void CSectorEdit2000Dlg::OnView()

{

       UpdateData(TRUE);

       if (m_uTo < m_uFrom)

              return;

      

       char cTemp[1];

       memcpy(cTemp, m_DrvListBoxSResult.Left(1), 1);

       UINT uDiskID = cTemp[0] - 64;

 

       DWORD dwSectorNum = m_uTo - m_uFrom + 1;

       if (dwSectorNum > 100)

              return;

 

       unsigned char* bBuf = new unsigned char[dwSectorNum * 512];

      

       if (ReadSectors(uDiskID, m_uFrom, (UINT)dwSectorNum, bBuf) == FALSE)

       {

              MessageBox("所选磁盘分区不存在!", "错误", MB_OK | MB_ICONERROR);

              return;

       }

      

       char* cBuf = new char[dwSectorNum * 5120];

       memset(cBuf, 0, sizeof(cBuf));

 

       for (DWORD i = 0; i < dwSectorNum * 512; i++)

       {

              sprintf(cBuf, "%s%02X ", cBuf, bBuf[i]);

 

              if ((i % 512) == 511)

                     sprintf(cBuf, "%s\r\n第%d扇区\r\n", cBuf, (int)(i / 512) + m_uFrom);

              if ((i % 16) == 15)

                     sprintf(cBuf, "%s\r\n", cBuf);

              else if ((i % 16) == 7)

                     sprintf(cBuf, "%s- ", cBuf);

       }

       SetDlgItemText(IDC_DATA, cBuf);

       delete[] bBuf;

       delete[] cBuf;

}

 

void CSectorEdit2000Dlg::OnCleardata()

{

       UpdateData(TRUE);

 

       char cTemp[1];

       memcpy(cTemp, m_DrvListBoxSResult.Left(1), 1);

       UINT uDiskID = cTemp[0] - 64;

       if (uDiskID > 2)

       {

              if (MessageBox("要清理的是硬盘分区,请确认是否继续?", "提示", MB_YESNO | MB_ICONWARNING) != 6)

                     return;

              if (uDiskID == 3)

              {

                     if (MessageBox("要清理的是系统分区,请再次确认是否继续?", "提示", MB_YESNO | MB_ICONWARNING) != 6)

                            return;

              }

       }

      

       unsigned char bBuf[512];

 

       UINT i = 0;

       BOOL bRet = TRUE;

       while (m_bAllDisk)       

       {

              memset(bBuf, 0xFF, sizeof(bBuf));

              bRet = WriteSectors(uDiskID, i, 1, bBuf);

              memset(bBuf, 0, sizeof(bBuf));

              bRet = WriteSectors(uDiskID, i, 1, bBuf);

             

              if (bRet == FALSE)

              {

                     if (i == 0)

                            MessageBox("所选磁盘分区不存在!", "错误", MB_OK | MB_ICONERROR);

                     else

                            MessageBox("磁盘数据擦除完毕!", "错误", MB_OK | MB_ICONERROR);

                     return;

              }

              i++;

       }    

 

       if (m_bAllDisk == FALSE)

       {

              for (DWORD i = m_uFrom; i <= m_uTo; i++)

              {

                     memset(bBuf, 0xFF, sizeof(bBuf));

           

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,