C++-如何直接读取Windows磁盘扇区的数据?

C++-如何直接读取Windows磁盘扇区的数据?

归属感 发布于 2017-05-01 字数 222 浏览 1349 回复 3

很多时候我们读取磁盘文件,都是直接通过windows API,但很多恶意软件可以通过hook方式监控我们,我们读到的可能并非实际的文件或者自己的文件数据被盗取,直接读取windwos磁盘扇区可以解决这个问题,但是不知道如何实现求各位正解?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

虐人心 2017-11-11 3 楼

1.可以在驱动中调用int 13h进行处理
2.还可以利用ATAPI来完成,atapi的驱动系统已经提供,一般的刻录软件都是这样做的。

灵芸 2017-09-29 2 楼

直接打开物理磁盘,自己解析分区表,文件系统。
介绍一本书给你 涂彦晖 戴士剑《数据安全与编程技术》

因为相关的知识点比较多,这里就不贴那些理论了。
我手上也有一些文件系统的资料和代码,要的话我发给你吧,
同时你也可以参考一些开源的ARK,王斌的那个山寨IceSword 好像有这个功能.
http://bbs.pediy.com/showthread.php?t=78164

我的邮箱是microq#vip.qq.com

清晨说ぺ晚安 2017-08-01 1 楼

1.通过CreateFile系列来完成

读写扇区可以通过CreateFile打开磁盘逻辑分区,还要通过SetFilePointer以文件操作的方式把指针移到要操作的磁盘扇区开始处,在定位到要访问的扇区开始位置后就可以通过ReadFileWriteFile函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。

示例代码:

BOOL CDirectAccessHDDlg::WriteSectors(BYTE bDrive, DWORD dwStartSector,
WORD wSectors, LPBYTE lpSectBuff)
// 对磁盘扇区数据的写入
{
 if (bDrive == 0) return 0;
 char devName[] = "\\.\A:";
 devName[4] ='A' + bDrive - 1;
 HANDLE hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
 if (hDev == INVALID_HANDLE_VALUE) return 0;
 SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
 DWORD dwCB;
 BOOL bRet = WriteFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
 CloseHandle(hDev);
 return bRet;
}
BOOL CDirectAccessHDDlg::ReadSectors(BYTE bDrive, DWORD dwStartSector,
WORD wSectors, LPBYTE lpSectBuff)
// 对磁盘扇区数据的读取
{
 if (bDrive == 0) return 0;
 char devName[] = "\\.\A:";
 devName[4] ='A' + bDrive - 1;
 HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
 if (hDev == INVALID_HANDLE_VALUE) return 0;
 SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
 DWORD dwCB;
 BOOL bRet = ReadFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
 CloseHandle(hDev);
 return bRet;
}

2.通过ReadSectors直接读写磁盘扇区数据

示例代码:

if (ReadSectors(uDiskID, m_uFrom, (UINT)dwSectorNum, bBuf) == FALSE) {
 MessageBox("所选磁盘分区不存在!", "错误", MB_OK | MB_IConERROR);
 return;
}
//为了方便数据的显示,可做如下处理以完成格式转换等工作:

for (DWORD i = 0; i < dwSectorNum * 512; i++) {
 sprintf(cBuf, "%s%02X ", cBuf, bBuf[i]);
 if ((i % 512) == 511)
sprintf(cBuf, "%srn第%d扇区rn", cBuf, (int)(i / 512) + m_uFrom);
 if ((i % 16) == 15)
sprintf(cBuf, "%srn", cBuf);
 else if ((i % 16) == 7)
sprintf(cBuf, "%s- ", cBuf);
}