知识普及:
硬盘的引导扇区位于 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. 还原后的原文是中文哦
题外话:不知道为啥,众杀软居然无视我对MBR的修改,然后我成功毁了自己的虚拟机 。。。你没的杀软,坑爹的杀软,然后没有然后了 。。。。。。
实现原理: 上节课小甲鱼不是说会告诉大家如何在用户模式下直接访问硬盘么?嗯,而且承诺绝对简单通俗。好吧,事实上,硬盘内核驱动程序将硬盘作为一个文件,文件名为:"\\.\\physicaldrive0"
我们可以利用这个鲜为人知的文件名,通过 CreateFile, ReadFile, WriteFile 和 DeviceIoControl API 来进行访问硬盘。
代码及详细注释:
本帖隐藏的内容
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; by 小甲鱼, http://www.
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; 功能:用boot.ini文件恢复MBR硬盘引导区,也就是MBR修复器
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- .386
- .model flat,stdcall
- option casemap:none
- include windows.inc
- include comdlg32.inc
- include user32.inc
- include kernel32.inc
- includelib comdlg32.lib
- includelib user32.lib
- includelib kernel32.lib
- .data
- szFileName db '\\.\\physicaldrive0', 0 ; 硬盘设备名
- .data?
- szBuffer db 512 dup (?)
- @hFile dd ?
- @hFile_boot dd ?
- @dwBytesRead dd ?
- @szLogFile db MAX_PATH dup (?)
- .const
- szNewFile db 'boot.ini', 0
- szErrOpenFile db '无法打开硬盘文件!', 0
- szErrCreateFile db '无法打开boot.ini文件,请检查该文件是否存在?!', 0
- szSuccess db '成功将boot.ini写入到硬盘MBR引导区', 0
- szCaption db '鱼C工作室', 0
- szWarning db '该程序将改写MBR引导区,将可能导致硬盘无法正常启动,请务必在虚拟机尝试以及备份原来MBR数据!您确定理解风险所在?!', 0
-
- .code
- start:
- invoke MessageBox,
- NULL,
- addr szWarning,
- addr szCaption,
- MB_YESNO
-
- .if eax != IDYES
- jmp exit;
- .endif
-
- invoke CreateFile, ; 打开文件
- addr szNewFile, ; 文件的名字, boot.ini
- GENERIC_READ, ; 允许读访问
- FILE_SHARE_READ, ; 允许对文件进行共享访问
- 0, ; 指向一个SECURITY_ATTRIBUTES结构的指针
- OPEN_EXISTING, ; 文件必须存在
- FILE_ATTRIBUTE_NORMAL, ; 默认属性
- 0
-
- .if eax == INVALID_HANDLE_VALUE ; 打开文件成功
- invoke MessageBox,
- NULL,
- addr szErrCreateFile,
- addr szCaption,
- MB_OK
-
- jmp exit
- .endif
-
- mov @hFile_boot, eax
-
- invoke ReadFile, ; 从文件(boot.ini)中读取数据
- @hFile_boot, ; 文件句柄
- addr szBuffer, ; 用于保存读入数据的缓冲区
- sizeof szBuffer, ; 需要读入的字符数
- addr @dwBytesRead, ; 实际读入的字节数
- 0
-
- invoke CloseHandle, @hFile_boot ; 小甲鱼温馨提醒:记得文件打开后要擦屁股->关闭文件,否则造成内存泄漏
-
- invoke CreateFile, ; 打开硬盘
- addr szFileName,
- GENERIC_WRITE, ; 之前做过详细注释的小甲鱼就不再罗嗦了,可以查看以前的内容
- FILE_SHARE_WRITE,
- 0,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- 0
-
- .if eax != INVALID_HANDLE_VALUE ; 打开文件错误
- mov @hFile, eax
-
- invoke WriteFile,
- @hFile,
- addr szBuffer,
- sizeof szBuffer,
- addr @dwBytesRead,
- 0
-
- invoke CloseHandle, @hFile
-
- invoke MessageBox,
- NULL,
- addr szSuccess,
- addr szCaption,
- MB_OK
-
- .else
- invoke MessageBox,
- NULL,
- szErrOpenFile,
- NULL,
- MB_OK
-
- .endif
-
- exit:
- invoke ExitProcess, NULL
-
- end start
复制代码
|