<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Malware on a7ca3's Blog</title><link>https://a7ca3.github.io/tags/malware/</link><description>feedId:144941137966342144+userId:78721118773581824 Recent content in Malware on a7ca3's Blog</description><image><title>a7ca3's Blog</title><url>https://a7ca3.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url><link>https://a7ca3.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link></image><generator>Hugo -- 0.145.0</generator><language>zh</language><copyright>©2025 a7ca3&amp;rsquo;s Blog</copyright><lastBuildDate>Sat, 29 Mar 2025 09:44:37 +0800</lastBuildDate><atom:link href="https://a7ca3.github.io/tags/malware/index.xml" rel="self" type="application/rss+xml"/><item><title>由MEMZ.exe浅谈MBR分区</title><link>https://a7ca3.github.io/post/%E7%94%B1memz.exe%E6%B5%85%E8%B0%88mbr%E5%88%86%E5%8C%BA/</link><pubDate>Sat, 29 Mar 2025 09:44:37 +0800</pubDate><guid>https://a7ca3.github.io/post/%E7%94%B1memz.exe%E6%B5%85%E8%B0%88mbr%E5%88%86%E5%8C%BA/</guid><description>&lt;p>初中的时候很喜欢在B站看彩虹猫病毒的视频。视频内容要么是“彩虹猫在xx系统运行”，要么就是&amp;quot;彩虹猫大战各种杀软&amp;quot;，实在没活了之后又能换款病毒像前两种继续水视频，基本上没有太多技术含量而言。如今也想不明白自己当初为什么会着迷这种视频。&lt;/p></description><content:encoded><![CDATA[<p>初中的时候很喜欢在B站看彩虹猫病毒的视频。视频内容要么是“彩虹猫在xx系统运行”，要么就是&quot;彩虹猫大战各种杀软&quot;，实在没活了之后又能换款病毒像前两种继续水视频，基本上没有太多技术含量而言。如今也想不明白自己当初为什么会着迷这种视频。</p>
<p>关于第一篇博客的题材想了许久，干脆就重拾当时的“兴趣”，尝试做些技术面分析。</p>
<h2 id="0x01-mbr分区介绍">0x01 MBR分区介绍</h2>
<p><strong>MBR（Master Boot Record）</strong>，中文翻译为<strong>主引导记录</strong>、主引导扇区，位于磁盘的首个扇区（LBA 0）。计算机开机启动时，BIOS会首先读取MBR，之后完成一系列开机操作。MEMZ.exe就是通过修改MBR分区，从而实现开机时播放彩虹猫动画，并操控蜂鸣器播放音乐。</p>
<p>MBR占用一个扇区，即512个字节。在该扇区中，前446字节称作<strong>主引导例程（Master Boot Routine）</strong>，随后的64个字节为<strong>分区表（Disk Partition Table, DPT）</strong>，最后两个字节为结束标识符，值为55AAH。</p>
<p>MBR的<a href="https://thestarman.pcministry.com/asm/mbr/STDMBR.htm">检查代码</a>有三个版本，他们分别是：</p>
<ul>
<li>标准版本，历经MS-DOS 3.30至Windows 95版本；</li>
<li>第二个版本，适用于Windows 95B, 98, 98SE, ME版本；</li>
<li>第三个版本，适用于Windows 7, 8/8.1, 10版本。</li>
</ul>
<p>当然Linux和macOS也支持或曾经支持MBR。</p>
<h3 id="主引导例程">主引导例程</h3>
<p>不同版本的主引导例程随着不同版本的检查代码而有些许差异，但大体结构不变。</p>
<p><img alt="image.png" loading="lazy" src="https://cdn.jsdelivr.net/gh/studyHard282/imgHost@main/blog/20250325165014.png"></p>
<p>以标准版本为例，绿色部分为可执行代码，随后的紫色部分为报错信息。红色和黄色部分分别为分区表和结束标识符，当然他们不在主引导例程的范围之内了。若读者需要进一步学习，可阅读MBR检查代码里的opcode。</p>
<h3 id="分区表">分区表</h3>
<p>分区表占据 $4\times16$ 个字节。每个分区的信息占据16字节，由此可以看出MBR型最多能划分4个主分区（或者3个主分区+1个扩展分区）。每个分区占据的16字节<a href="https://thestarman.pcministry.com/asm/mbr/PartTables.htm">规划</a>如下。</p>
<table>
  <thead>
      <tr>
          <th>偏移量</th>
          <th>长度（字节）</th>
          <th>内容与含义</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>0x00</td>
          <td>1</td>
          <td>引导标志。0x80表示活动分区，0x00表示非活动分区。</td>
      </tr>
      <tr>
          <td>0x01</td>
          <td>3</td>
          <td>起始CHS地址。三个字节分别表示分区的起始柱面（C）、磁头（H）、扇区（S）。</td>
      </tr>
      <tr>
          <td>0x04</td>
          <td>1</td>
          <td>分区类型标志位。</td>
      </tr>
      <tr>
          <td>0x05</td>
          <td>3</td>
          <td>结束CHS地址。三个字节分别表示分区的起始柱面（C）、磁头（H）、扇区（S）。</td>
      </tr>
      <tr>
          <td>0x08</td>
          <td>4</td>
          <td>起始LBA。记录从磁盘的第一个扇区（LBA 0）到当前分区第一个扇区的扇区数量。</td>
      </tr>
      <tr>
          <td>0x0C</td>
          <td>4</td>
          <td>本分区的总扇区数。</td>
      </tr>
  </tbody>
</table>
<h2 id="0x02-memzexe修改mbr分区">0x02 MEMZ.exe修改MBR分区</h2>
<p>MEMZ.exe中覆写MBR分区的代码部分如图所示。</p>
<p><img alt="image.png" loading="lazy" src="https://cdn.jsdelivr.net/gh/studyHard282/imgHost@main/blog/20250326232845.png"></p>
<p>样本首先以读写方式打开PhysicalDrive0（通常为主硬盘），之后分配一个大小为64KB（0x10000字节）的内存缓冲区。随后向内存缓冲区中写入byte_402118和byte_402248的内容。</p>
<p>byte_402118的内容如下图所示。</p>
<p><img alt="image.png" loading="lazy" src="https://cdn.jsdelivr.net/gh/studyHard282/imgHost@main/blog/20250327154217.png"></p>
<p>byte_402118长度为303字节，从缓冲区首个位置开始写入，很显然其目的是覆盖主引导例程部分。此部分的opcode主要用于为播放彩虹猫动画和音乐做准备。</p>
<p>byte_402248篇幅较长，若读者感兴趣可自行分析。其前两个字节的内容如下图所示。</p>
<p><img alt="image.png" loading="lazy" src="https://cdn.jsdelivr.net/gh/studyHard282/imgHost@main/blog/20250327160758.png"></p>
<p>byte_402248偏移了510个字节后向内存写入，而其开头的两个字节的内容为55h，AAh，很显然是为了补足MBR结束标识符，使得MBR的检查代码能够成功识别MBR。随后的内容为显示彩虹猫动画、播放音乐、阻止系统响应输入等。</p>
<h2 id="0x03-更好的替代品">0x03 更好的替代品</h2>
<p>20世纪90年代末期，Intel开发了一种新的分区表格式，随后成为了UEFI的一部分。<a href="https://uefi.org/specs/UEFI/2.11/05_GUID_Partition_Table_Format.html">GPT</a>也随UEFI而诞生。<strong>GPT（GUID Partition Table）</strong>，中文翻译为<strong>全局唯一标识分区表</strong>，相较于MBR有了更多优势。</p>
<h3 id="可支持的硬盘容量更大">可支持的硬盘容量更大</h3>
<p>受限于MBR的分区表长度限制，即上文提到的仅有4个字节（32位）存储LBA值，此时MBR可支持的最多扇区数为 $2^{32}−1=4,294,967,295$。扇区大小按照512字节计算，则MBR可支持的硬盘容量大小为 $4,294,967,295\times512=2,199,023,255,040$ 个字节，即大多数资料所描述的2.2TB。而GPT分区使用了8个字节（64位）存储LBA值，可支持的扇区数目就是MBR的 $2^{32}$ 倍。此时，可支持的硬盘容量受限的瓶颈在于操作系统、文件系统等等软件的限制了（当然现实中也很难造出如此大容量的硬盘）。</p>
<h3 id="可支持的分区更多">可支持的分区更多</h3>
<p>先前提到MBR的分区表大小为64个字节，按照设计每个分区的信息占据16字节，因此MBR最多只能划分4个主分区。而GPT的分区表是动态扩展的，理论上对分区数目没有限制。但一些操作系统（例如<a href="https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/configure-uefigpt-based-hard-drive-partitions#partition-requirements">微软</a>）默认GPT最多可支持128个分区。当然现实中需要用到128个分区以上的情况也是极少数的。</p>
<p>除此之外，GPT分区相较于MBR还有提供备份分区表、使用CRC32保证完整性等等优势。随着时间的车轮滚滚向前，MBR与BIOS两兄弟在GPT与UEFI的光芒下显得黯然失色。即使保持着兼容性，如今的操作系统也逐渐不认可MBR分区了。</p>
<p>GPT分区的LBA 0内容为传统的MBR（Legacy Master Boot Record）或保护性MBR（Protective MBR），这意味着MEMZ.exe仍然可以破坏这些地方。但可能UEFI不再会识别MEMZ.exe覆写MBR的代码，计算机感染后开机也不会播放彩虹猫动画和音乐。如今MEMZ.exe也已经迭代了<a href="https://www.youtube.com/watch?v=C19JfFKAogE">更安全的版本</a>，可以在不破坏电脑的情况下重温病毒感染时的动画效果。</p>
]]></content:encoded></item></channel></rss>