21xrx.com
2024-11-05 18:47:39 Tuesday
登录
文章检索 我的文章 写文章
如何使用C++防止修改mbr?
2023-07-02 19:53:18 深夜i     --     --
C++ MBR 防止修改 保护机制 安全措施

计算机的主引导记录(Master Boot Record,MBR)是存储在硬盘第一个扇区的重要数据结构。MBR中包含了引导程序、分区表和磁盘签名等信息,它们对系统启动和硬盘的分区工作有着至关重要的作用。因此,如果MBR被恶意软件篡改,可能会导致系统无法启动或者数据丢失。为了防止MBR被非法修改,下面介绍如何使用C++编写程序进行保护。

第一步:获取MBR

程序首先需要获取硬盘的MBR。在Windows操作系统中,可以通过读取物理磁盘的方式来获得MBR。获取MBR的代码如下所示:


#include <Windows.h>

#include <WinBase.h>

#include <iostream>

using namespace std;

int main()

{

  HANDLE hDevice = CreateFile(L"\\\\.\\PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);

  if (hDevice == INVALID_HANDLE_VALUE)

  

    cout << "Open PhysicalDrive0 failed." << endl;

    return 0;

  

  unsigned char mbr[512];

  DWORD readLen;

  BOOL bResult = ReadFile(hDevice, mbr, 512, &readLen, NULL);

  if (!bResult || readLen != 512)

  {

    cout << "Read MBR failed." << endl;

    CloseHandle(hDevice);

    return 0;

  }

  CloseHandle(hDevice);

  cout << "Get MBR successfully!" << endl;

  return 1;

}

运行程序后,可以在控制台看到输出“Get MBR successfully!”,表示MBR已经成功读取。

第二步:检查MBR是否被篡改

程序接着需要检查MBR是否被篡改。这里采用的方法是对MBR进行校验和计算。计算过程只需要将MBR中的所有字节相加,并计算出结果的低位字节值,这个值就是校验和。如果校验和不匹配,就说明MBR已被篡改。

下面是计算校验和的代码:


unsigned char CalcChecksum(unsigned char* buf, int size)

{

  unsigned char checksum = 0;

  for (int i = 0; i < size; i++)

  {

    checksum += buf[i];

  }

  return checksum;

}

计算校验和的代码可以加入到第一步的代码中,如下所示:


// 计算校验和

unsigned char checksum = CalcChecksum(mbr, 512);

if (checksum != mbr[510] || checksum != mbr[511])

  cout << "MBR is modified!" << endl;

else

  cout << "MBR is OK!" << endl;

运行程序后,如果MBR被篡改,则控制台会输出“MBR is modified!”的提示信息。

第三步:使用Windows API修改MBR

最后一步是使用Windows API修改MBR。在这里为了演示如何保护MBR,程序将禁止任何进程或用户对MBR进行修改。Windows提供了一个名为ZwSetInformationFile的API函数,可以将磁盘文件标记为只读。以下是将MBR标记为只读的代码:


HANDLE hDevice = CreateFile(L"\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);

if (hDevice == INVALID_HANDLE_VALUE)

  cout << "Open PhysicalDrive0 failed." << endl;

  return 0;

FILE_ATTRIBUTE_TAG_INFORMATION TagInfo;

TagInfo.TagFileAttributes = FILE_ATTRIBUTE_READONLY;

NTSTATUS status = ZwSetInformationFile(hDevice, &IoStatusBlock, &TagInfo, sizeof(FILE_ATTRIBUTE_TAG_INFORMATION), FileAttributeTagInformation);

if (NT_SUCCESS(status))

  cout << "MBR is ReadOnly!" << endl;

else

  cout << "Set ReadOnly failed!" << endl;

CloseHandle(hDevice);

将MBR标记为只读后,任何进程或用户都无法修改MBR了。

总结

通过使用C++编写程序可以很好地防止MBR被非法修改。程序通过获取MBR并检查校验和,判断MBR是否被篡改,最后将MBR标记为只读状态,确保MBR的安全性。这里只是简单的示范,实际应用中还需要考虑更多的安全因素和实现细节。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复