工具开发心得——Disk2vmdk

admin 2024年12月17日13:40:30评论23 views字数 4570阅读15分14秒阅读模式

点击蓝字|关注我们

工具开发心得——Disk2vmdk

你身边的APT分析专家。

from 狼蛛安全实验室

 简介

本文将基于近期开发的磁盘备份工具,总结一些关于如何给磁盘制作镜像的开发原理及学习心得,文中有上期提到的增加工具实用性的彩蛋~
废话不多说,进入正题👇👇👇

如何将物理磁盘转为虚拟磁盘镜像格式

1. VBoxManage,很方便编程调用的接口

2. 虚拟磁盘的好处

3. 相关P2V软件的特点

备份磁盘相关功能的原理

1. 磁盘相关的设备文件名格式

2. 如何备份磁盘所有扇区

3. 如何仅备份磁盘已使用的扇区

    a)简述分析disk2vhd的过程

    b)解析Bitmap获得已分配使用的扇区

4. 如何备份Bitlocker分区解锁后的数据

5. 如何创建分区快照(还原点)

Start

一、物理磁盘转为虚拟磁盘镜像格式

    1. VBoxManage,很方便编程调用的接口
      VBoxManage是开源虚拟机项目virtualbox中的一个工具,主要特点是可以接受从stdin管道输入原始磁盘数据,然后按照指定格式生成磁盘镜像。从安装包中获取编译好的工具来调用是比较方便的,比起去研究编译源代码项目方便多了,比如希望输入原始磁盘数据后生成VMDK,使用命令行参数如下:
      VBoxManage.exe convertfromraw stdin "生成镜像的保存路径" --format VMDK "原始镜像数据的大小"
      这样开发者就可以自己把控源磁盘的数据读取和统计写入到stdin的速度来展示进度情况。
      Virtualbox最后的32位安装包版本是5.2.44,二进制程序可以运行在winxp至win10,通用性很好,只需从安装包中提取VBoxManage.exe、msvcp100.dll、msvcr100.dll、VBoxDDU.dll、VBoxRT.dll总共5个文件,开发者就可以方便的实现把原始镜像数据转换VMDK、VHD或VDI几种常见的虚拟磁盘镜像格式。
    2. 虚拟磁盘的好处
      对于备份来说,主要好处是比较节省存储空间,不像DD原始镜像,VMDK、VHD、VDI这几种格式都支持镜像文件按需增长,且具有类似压缩的效果,比如原磁盘有大量磁盘空间是全零数据,这些空间在转为VMDK时并不需要占用镜像文件的大小。
      对于安全分析员来说,备份包含系统分区的虚拟磁盘镜像可以很方便作为虚拟机磁盘加载启动,然后展开一些分析工作。
    3. 相关P2V软件的特点
      P2V是物理磁盘转虚拟磁盘的意思,类似的软件或命令有dd、winhex、qemu-img、disk2vhd、vmware converter,下面表格需要留意的是他们备份数据的区别,disk2vhd和vmware converter对磁盘制作镜像的速度通常比较快,因为他们只拷贝了磁盘中已使用的空间,这对于有些场景是不适合的,比如希望后期对磁盘镜像进行数据恢复相关的取证分析工作。
工具开发心得——Disk2vmdk
      由于工作需要,希望有一款绿色的工具,支持备份时直接生成虚拟机磁盘镜像,备份的数据是可选“全部”或“已使用”的扇区的,于是对磁盘备份的开发展开了一些研究。

彩蛋!

      打开工具后,点击4下版本号会出现日期,这时工具导出的机制就变了~
工具开发心得——Disk2vmdk
工具开发心得——Disk2vmdk
      当出现这个日期后,工具的运行方式就从调用管道运行exe生成镜像,变成直接调用dll生成镜像,此时,生成镜像的速度将会比之前更快~
工具开发心得——Disk2vmdk

二、备份磁盘相关功能的原理

      操作系统将整个磁盘设备抽象成了一个文件,在Windows下是可以用API CreateFile打开、ReadFile读取的方式去读取所有扇区的,跟读取普通文件的方式类似。操作系统还进一步根据磁盘的分区信息,把每个分区挂载并抽象成一个文件。这样开发者就能很方便的根据要备份的磁盘或分区进行备份。
    1. 磁盘相关的设备文件名格式
工具开发心得——Disk2vmdk
      磁盘设备可以通过QueryDosDevice以第一个参数为NULL来获取所有设备列表,再筛选设备名开头是PhysicalDrive来得到系统挂载的所有磁盘设备,然后就可以使用CreateFile打开相应设备,得到设备的句柄,有了句柄后主要就是通过DeviceIoControl和设备驱动通信了,常见通信控制代码例如IOCTL_DISK_GET_DRIVE_GEOMETRY_EX可查询磁盘大小信息、IOCTL_DISK_GET_DRIVE_LAYOUT_EX可查询分区信息等等,在网上搜索这些控制代码可以找到很多参考代码。
    2. 如何备份磁盘所有扇区
      这个功能可以说是最简单的,比如磁盘设备名是\.PhysicalDrive0,把它当普通文件用从头读取,直到ReadFile遇到结尾,最好还是先获得磁盘的大小,根据总大小来读取,使用的缓冲区应该是扇区大小(512字节)的倍数。注意你可能不能用普通文件的方式用SetFilePointer 调整文件指针到末尾,然后根据文件指针位置来获得磁盘的原始大小,而是应该用DeviceIoControl结合参数IOCTL_DISK_GET_DRIVE_GEOMETRY_EX来查询磁盘大小信息。
    3. 如何仅备份磁盘已使用的扇区
      首先把磁盘的划分按“分区”和“非分区”区别对待,“非分区”的区域比如分区表、没有识别的分区空间等等都认为是已使用的扇区,“分区”区域的使用情况是由相关文件系统决定的,然而文件系统不管是NTFS还是FAT32,都可以通过DeviceIoControl结合参数FSCTL_GET_VOLUME_BITMAP向分区设备查询已经分配使用的扇区。其实这也是disk2vhd的原理,在一开始并不清楚disk2vhd备份速度比winhex克隆磁盘快很多是什么原因,通过Procmon、IDA等方式对disk2vhd进行研究后才有所了解。
         a)简述分析disk2vhd的过程
      首先是使用Procmon过滤出disk2vhd的所有行为,发现备份数据过程有很多ReadFile是从分区设备读取数据,仔细分析每个ReadFile的详细发现,偏移会“智能”的跳进,似乎会跳过一些未使用的空间,往前追溯到CreateFile附近发现,有两个查询行为很可疑,分别是FSCTL_GET_VOLUME_BITMAP和FSCTL_FILESYSTEM_GET_STATISTICS,通过搜索网上资料了解,这两个控制代码的作用应该就是获得磁盘在使用的扇区的关键作用,然后用IDA对disk2vhd研究了一番,找到相关代码验证了disk2vhd的原理,下图中可清晰看出,disk2vhd的流程是,先得到BITMAP信息,然后还尝试把根目录的页文件和休眠文件的相关偏移也在BITMAP中置0,再判断分区如果是FAT则需要计算首个簇(cluster)的偏移,最后拷贝分区的时候就可以根据BITMAP信息中的非0位“智能”的跳进。
      下图是disk2vhd 2.01版本运行时释放出来的x64版样本的“某函数”的IDA F5代码截图(加了点注释)。
工具开发心得——Disk2vmdk
      对逆向分析感兴趣的小伙伴应该可以很容易找到“某函数”的地址,代码截图前部分还有一些代码是获取簇(cluster)的大小,以及计算装载整个分区的Bitmap需要多大内存。簇是什么呢?还记得格式化磁盘的时候界面有个“分配单元大小”的选项吧,这个就等于一个簇的大小,比如通常NTFS一个簇是4096,等于是8个扇区(512字节)组成一个簇。
        b)解析Bitmap获得已分配使用的扇区
      用FSCTL_GET_VOLUME_BITMAP查询到的BITMAP信息结构体如下,开发者根据其中的Buffer进行解析。
struct {    LARGE_INTEGER StartingLcn;    LARGE_INTEGER BitmapSize;    BYTE  Buffer[1];} VOLUME_BITMAP_BUFFER;
      Bitmap是以cluster为单位描述一块磁盘空间是否有被使用,用1个位的1或0描述是否被使用。一个cluster的大小通常是格式化时的“分配单元大小”决定的,所以Buffer中每个字节可以描述8个cluster单元的磁盘空间的使用状态。
      假设StartingLcn 为0时,Buffer的第一字节最低位描述第0个cluster的状态,然后按顺序去分析所有cluster状态。第0个cluster的偏移在NTFS下就是分区起始位置,这样按cluster单元大小可直接算出每个cluster在分区的绝对逻辑偏移,而FAT的首个cluster不是在分区起始位置,需要从分区的起始512个字节的内容(BootSector)去分析首个cluster的偏移,感兴趣的同学可以去分析上面截图中的ReadFirstSectorAndParse_sub_1400056B0,可以把代码直接抠出来用。
    4. 如何备份Bitlocker分区解锁后的数据
      注意Bitlocker是以分区来加密的,不是整个磁盘。如果用户已经解锁了加密分区,通过\?Volume{XXXX}方打开设备,读取的数据就是解密后的数据。如果从\.PhysicalDriveX设备读取整个磁盘,这相当于绕过了Bitlocker的驱动模块,那么磁盘中Bitlocker分区相应的位置读取到的会是加密的数据。
    5. 如何创建分区快照(还原点)
      备份数据时创建快照可以较好的保证备份数据的完整性,disk2vhd和vmware converter在备份时都会提示创建快照(snapshot),根据disk2vhd的官方介绍,这个功能是系统自带的VSS特性(Volume Shadow Copy Service),相信你可以在网上找到很多C++样例代码。
      开发者只需要在创建完快照后,把得到像这样的路径\?GLOBALROOTDeviceHarddiskVolumeShadowCopyX,代替原分区的\?Volume{XXXX}进行备份,ShadowCopy设备同样可以查询FSCTL_GET_VOLUME_BITMAP,然后根据需要可以把页文件和休眠文件的簇在Bitmap中置为0。
      注意VSS从Windows XP时代就系统内置支持,API接口由vssapi.dll模块提供,但是接口直到Vista才纳入windows SDK,早期需要另外下载VSS SDK包,注意其中接口IVssBackupComponents和IVssAsync的成员函数在XP到2003期间发生了调整,也就是用最新的SDK是不兼容XP的。

END

工具开发心得——Disk2vmdk
实验室介绍:
狼蛛安全实验室以”情报驱动的威胁猎手”为核心,构建了面向威胁狩猎的全流程解决方案,可为客户解决网络攻击发现、线索扩线、落地核查、追踪溯源全流程业务需求。
公众号介绍:
公众号将每周更新当周较为重要的安全事件以供读者参考和发现新线索,不定期更新实用小工具、网络安全各方向(逆向、渗透、情报等)干货分享、重大安全事件梳理跟进情况等内容……
招贤纳士:
请发简历到 [email protected] 每一份简历我们都会认真对待。

狼蛛安全实验室

工具开发心得——Disk2vmdk

原文始发于微信公众号(狼蛛安全实验室):工具开发心得——Disk2vmdk

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月17日13:40:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   工具开发心得——Disk2vmdkhttps://cn-sec.com/archives/1041931.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息