分享

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

 firefox_zyw 2014-12-01

知识普及:

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


实现要求:读取硬盘引导扇区并保存为boot.ini文件



实现原理:

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

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

代码及详细注释:

本帖隐藏的内容


  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; by 小甲鱼, http://www.
  3. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4. ; 功能:读取硬盘引导扇区并保存于boot.ini文件中
  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. @dwBytesRead    dd  ?
  22. @szLogFile      db  MAX_PATH dup (?)

  23.     .const
  24. szNewFile       db  'boot.ini', 0
  25. szErrOpenFile   db  '无法打开硬盘文件!', 0
  26. szErrCreateFile db  '无法创建boot.ini文件!', 0
  27. szSuccess       db  '成功读取硬盘引导区并写入boot.ini文件!', 0   
  28. szCaption       db  '鱼C工作室', 0   
  29.    
  30.     .code
  31. start:
  32.     invoke CreateFile,              ; 打开或创建文件
  33.         addr szFileName,            ; 文件的名字
  34.         GENERIC_READ,               ; 允许读访问
  35.         FILE_SHARE_READ,            ; 允许对文件进行共享访问
  36.         0,                          ; 指向一个SECURITY_ATTRIBUTES结构的指针
  37.         OPEN_EXISTING,              ; 文件必须存在
  38.         FILE_ATTRIBUTE_NORMAL,      ; 默认属性
  39.         0
  40.    
  41.     .if eax == INVALID_HANDLE_VALUE ; 打开文件错误
  42.         invoke MessageBox,
  43.             NULL,
  44.             addr szErrOpenFile,
  45.             addr szCaption,
  46.             MB_OK
  47.             
  48.         jmp exit
  49.     .endif
  50.    
  51.     mov @hFile, eax                 ; 返回文件句柄,这时候硬盘被看成是一个文件的哦~
  52.    
  53.     invoke ReadFile,                ; 从文件中读取数据
  54.         @hFile,                     ; 文件句柄
  55.         addr szBuffer,              ; 用于保存读入数据的缓冲区
  56.         sizeof szBuffer,            ; 需要读入的字符数
  57.         addr @dwBytesRead,          ; 实际读入的字节数
  58.         0
  59.    
  60.     invoke CloseHandle, @hFile      ; 小甲鱼温馨提醒:记得文件打开后要擦屁股->关闭文件,否则造成内存泄漏
  61.    
  62.     invoke lstrcpy,                 ; 拷贝字符串
  63.         addr @szLogFile,
  64.         addr szNewFile
  65.    
  66.     invoke CreateFile,              ; 创建boot.ini文件
  67.         addr @szLogFile,            
  68.         GENERIC_WRITE,              
  69.         FILE_SHARE_READ,            
  70.         0,                          
  71.         CREATE_ALWAYS,              
  72.         FILE_ATTRIBUTE_NORMAL,      
  73.         0
  74.    
  75.     .if eax != INVALID_HANDLE_VALUE
  76.         mov @hFile, eax
  77.         
  78.         invoke WriteFile,           ; 将数据写入boot.ini文件
  79.             @hFile,
  80.             addr szBuffer,
  81.             sizeof szBuffer,
  82.             addr @dwBytesRead,
  83.             0
  84.    
  85.         invoke CloseHandle, @hFile  ; 擦屁股
  86.         
  87.         invoke wsprintf,            ; 这个事实上常用的函数,如果有问题的鱼油可以在论坛搜索下,有篇文章中小甲鱼已经做好了详细的解释给大家。
  88.             addr szBuffer,
  89.             addr szSuccess
  90.          
  91.         invoke MessageBox,
  92.             NULL,
  93.             addr szBuffer,
  94.             addr szCaption,
  95.             MB_OK
  96.             
  97.     .else
  98.         invoke MessageBox,
  99.             NULL,
  100.             addr szErrCreateFile,
  101.             addr szCaption,
  102.             MB_OK
  103.     .endif   
  104.         
  105. exit:
  106.     invoke ExitProcess, NULL
  107.         
  108.     end start
复制代码



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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多