C++如何指定MBR偏移量?仅覆盖MBR末尾2字节引导签名的方法
如何仅覆盖MBR末尾的2字节引导签名?
嘿,这完全可以实现!你目前的代码已经走对了方向,只需要调整一下文件指针的位置,精准命中MBR最后那两个字节的引导签名就行。下面是具体的修改步骤和完整代码示例:
关键修改点
- 精准定位目标位置:MBR总大小是512字节,引导签名
55h AAh位于第510和511字节(从0开始计数),所以需要把文件指针移动到偏移量510的位置(起始点为文件开头)。 - 调整写入数据的长度:你只需要写入2个0字节,所以数组可以简化为
char dataWrite[2] = {0x00, 0x00};。 - 增加错误检查:对
CreateFile、SetFilePointer、WriteFile的返回值做判断,避免操作失败却不知情。
完整修正代码
#include <windows.h> #include <stdio.h> int main() { // 准备要写入的2个0字节 char dataWrite[2] = {0x00, 0x00}; DWORD bytesWritten; // 打开物理驱动器0(注意:必须以管理员权限运行) HANDLE MasterBootRecord = CreateFile( "\\\\.\\PhysicalDrive0", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); if (MasterBootRecord == INVALID_HANDLE_VALUE) { printf("打开驱动器失败!错误码:%d\n", GetLastError()); return 1; } // 将文件指针移动到MBR的第510字节位置(从0开始计数) DWORD dwPtr = SetFilePointer( MasterBootRecord, 510, // 偏移量:MBR最后2字节的起始位置 NULL, FILE_BEGIN // 从文件开头开始计算偏移 ); if (dwPtr == INVALID_SET_FILE_POINTER) { printf("设置文件指针失败!错误码:%d\n", GetLastError()); CloseHandle(MasterBootRecord); return 1; } // 写入2个0字节覆盖引导签名 BOOL writeSuccess = WriteFile( MasterBootRecord, dataWrite, sizeof(dataWrite), &bytesWritten, NULL ); if (!writeSuccess || bytesWritten != sizeof(dataWrite)) { printf("写入失败!错误码:%d,实际写入字节数:%d\n", GetLastError(), bytesWritten); CloseHandle(MasterBootRecord); return 1; } printf("成功覆盖MBR引导签名!\n"); CloseHandle(MasterBootRecord); return 0; }
重要注意事项
- 必须管理员权限:操作物理驱动器需要极高权限,一定要以管理员身份运行程序,否则
CreateFile会失败。 - 风险预警:修改MBR可能导致系统无法启动,操作前务必备份MBR(可以先读取512字节保存到文件)。
- 错误处理:代码里的错误检查非常重要,能帮你快速定位问题,比如驱动器不存在、权限不足等情况。
内容的提问来源于stack exchange,提问作者x3kuro
相关产品推荐
相关产品推荐

