分享

【新提醒】修改硬盘MBR引导区(Windows各系统通用),Win32汇编语言案例解析,典型案例解析(VIP免费),鱼C论坛

 firefox_zyw 2014-12-01

知识普及:

硬盘的引导扇区位于 0 磁道 0 磁头 1 扇区位置,该扇区存放着系统的引导程序和硬盘的分区表等重要信息。另外小甲鱼八卦一下,该扇区常常是病毒的重点攻击目标!


警告:MBR乃引导硬盘加载系统的核心,该操作危险,有可能使您的硬盘数据丢失,请先用栗子 2.1 备份硬盘MBR以作为恢复使用!


实现要求:用准备好的boot.ini文件改写、覆盖硬盘MBR。

程序演示:

STEP1. 先用WINHEX等工具查看当前MBR的数据

STEP2. 准备好修改过的boot.ini文件放在编译后的程序同个文件夹

STEP3. 执行修改程序

STEP4. 用WINHEX查看硬盘MBR引导区,这时候已经成功修改了。

STEP5. 重启系统,硬盘引导区错乱,已经无法启动了


喜讯:在STEP4修改后的MBR数据中,选中部分数据被小甲鱼用凯撒密码加密过,第一个还原出原文的童鞋奖励100鱼币。

提示1. 还原后的原文是中文哦
提示2. 可以用小甲鱼在 密码学系列教程中 给大家提供的破解工具。

题外话:不知道为啥,众杀软居然无视我对MBR的修改,然后我成功毁了自己的虚拟机 。。。你没的杀软,坑爹的杀软,然后没有然后了 。。。。。。

实现原理:
上节课小甲鱼不是说会告诉大家如何在用户模式下直接访问硬盘么?嗯,而且承诺绝对简单通俗。好吧,事实上,硬盘内核驱动程序将硬盘作为一个文件,文件名为:"\\.\\physicaldrive0"

我们可以利用这个鲜为人知的文件名,通过 CreateFile, ReadFile, WriteFile 和 DeviceIoControl API 来进行访问硬盘。


代码及详细注释:

本帖隐藏的内容


  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; by 小甲鱼, http://www.
  3. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4. ; 功能:用boot.ini文件恢复MBR硬盘引导区,也就是MBR修复器
  5. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  6.         .386
  7.         .model flat,stdcall
  8.         option casemap:none

  9. include windows.inc
  10. include comdlg32.inc
  11. include user32.inc
  12. include kernel32.inc
  13. includelib comdlg32.lib
  14. includelib user32.lib
  15. includelib kernel32.lib

  16.     .data
  17. szFileName      db  '\\.\\physicaldrive0', 0            ; 硬盘设备名

  18.     .data?
  19. szBuffer        db  512 dup (?)
  20. @hFile          dd  ?
  21. @hFile_boot     dd  ?
  22. @dwBytesRead    dd  ?
  23. @szLogFile      db  MAX_PATH dup (?)

  24.     .const
  25. szNewFile       db  'boot.ini', 0
  26. szErrOpenFile   db  '无法打开硬盘文件!', 0
  27. szErrCreateFile db  '无法打开boot.ini文件,请检查该文件是否存在?!', 0
  28. szSuccess       db  '成功将boot.ini写入到硬盘MBR引导区', 0   
  29. szCaption       db  '鱼C工作室', 0   
  30. szWarning       db  '该程序将改写MBR引导区,将可能导致硬盘无法正常启动,请务必在虚拟机尝试以及备份原来MBR数据!您确定理解风险所在?!', 0
  31.    
  32.     .code
  33. start:
  34.     invoke MessageBox,
  35.         NULL,
  36.         addr szWarning,
  37.         addr szCaption,
  38.         MB_YESNO
  39.         
  40.     .if eax != IDYES   
  41.         jmp exit;
  42.     .endif   
  43.    
  44.     invoke CreateFile,              ; 打开文件
  45.         addr szNewFile,             ; 文件的名字, boot.ini
  46.         GENERIC_READ,               ; 允许读访问
  47.         FILE_SHARE_READ,            ; 允许对文件进行共享访问
  48.         0,                          ; 指向一个SECURITY_ATTRIBUTES结构的指针
  49.         OPEN_EXISTING,              ; 文件必须存在
  50.         FILE_ATTRIBUTE_NORMAL,      ; 默认属性
  51.         0
  52.    
  53.     .if eax == INVALID_HANDLE_VALUE ; 打开文件成功
  54.         invoke MessageBox,
  55.             NULL,
  56.             addr szErrCreateFile,
  57.             addr szCaption,
  58.             MB_OK
  59.             
  60.         jmp exit
  61.     .endif
  62.    
  63.     mov @hFile_boot, eax            
  64.    
  65.     invoke ReadFile,                ; 从文件(boot.ini)中读取数据
  66.         @hFile_boot,                ; 文件句柄
  67.         addr szBuffer,              ; 用于保存读入数据的缓冲区
  68.         sizeof szBuffer,            ; 需要读入的字符数
  69.         addr @dwBytesRead,          ; 实际读入的字节数
  70.         0
  71.    
  72.     invoke CloseHandle, @hFile_boot ; 小甲鱼温馨提醒:记得文件打开后要擦屁股->关闭文件,否则造成内存泄漏
  73.    
  74.     invoke CreateFile,              ; 打开硬盘
  75.         addr szFileName,
  76.         GENERIC_WRITE,              ; 之前做过详细注释的小甲鱼就不再罗嗦了,可以查看以前的内容
  77.         FILE_SHARE_WRITE,
  78.         0,
  79.         OPEN_EXISTING,
  80.         FILE_ATTRIBUTE_NORMAL,
  81.         0
  82.    
  83.     .if eax != INVALID_HANDLE_VALUE ; 打开文件错误
  84.         mov @hFile, eax
  85.         
  86.         invoke WriteFile,
  87.             @hFile,
  88.             addr szBuffer,
  89.             sizeof szBuffer,
  90.             addr @dwBytesRead,
  91.             0
  92.             
  93.         invoke CloseHandle, @hFile
  94.         
  95.         invoke MessageBox,
  96.             NULL,
  97.             addr szSuccess,
  98.             addr szCaption,
  99.             MB_OK
  100.             
  101.     .else
  102.         invoke MessageBox,
  103.             NULL,
  104.             szErrOpenFile,
  105.             NULL,
  106.             MB_OK
  107.             
  108.     .endif
  109.         
  110. exit:
  111.     invoke ExitProcess, NULL
  112.         
  113.     end start
复制代码



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多