我见过安服小伙汁在安全济急反馈时,回来现场分析遗漏,在授权的情况下,在失陷的主机上装置vmware converter并把硬盘转为假造磁盘带走分析,可能是硬盘不方便拆也可能是不方便关机。近似的器具还有微软的disk2vhd或winhex将硬盘转为假造磁盘文献。这些步地我皆了解过。在这个安服场景下这些器具皆有些不及,举例要装置个软件jk 白丝,要么即是全扇区备份太耗时,要么即是转后的容貌不方便vmware来指挥仿真启动。
为了写一个更贴切这个安服场景的器具,我通过逆向分析 Disk2VHD 的使命机制和关系代码,最终齐备一个近似器具的过程。这既是一段工夫上的探索,亦然一场编程智商的挑战。
先放代码仓库勾通 github.com/threatexpert/disk2vmdk
最初,编程之前有几个主要问题要管制:
VBoxManage是开源假造机名堂virtualbox中的一个器具,主要特色是不错罗致从stdin管说念输入原始磁盘数据,然后按照指定容貌生成磁盘镜像。从装置包中获取编译好的器具来调用是比拟方便的,比起去商量和编译virtualbox弘大的源代码名堂方便太多了,比如但愿输入原始磁盘数据青年景VMDK到h:\test.vmdk,原始磁盘大小假定是1024209543168字节,那么使用该器具+参数如下就不错了。
Virtualbox终末的32位装置包版块是5.2.44,二进制要领不错运行在winxp至win11,通用性很好,只需从装置包中索要VBoxManage.exe、msvcp100.dll、msvcr100.dll、VBoxDDU.dll、VBoxRT.dll统共5个文献,开辟者就不错方便的齐备把原始镜像数据逶迤VMDK、VHD或VDI几种常见的假造磁盘镜像容貌。
若是不思调用VBoxManage程度管说念输入,还不错推敲径直动态调用VBoxDDU.dll的4个导出接口VDCreate、VDCreateBase、VDWrite、VDClose就不错齐备,特殊方便。函数原型不错从Virtualbox开源中赢得。更快捷的步地是不错从我的源码中找到VDCreate关系的源码文献VBoxSimple,
这是一经从Virtualbox源码中编订出来的关系代码jk 白丝,接口是不是很简便很方便。
关于备份来说,主要克己是比拟简易存储空间,不像DD原始镜像,VMDK、VHD、VDI这几种容貌皆相沿镜像文献按需增长,且具有近似压缩的后果,比如原磁盘有多数磁盘空间是全零数据,这些空间在转为VMDK时并不需要占用镜像文献的大小。
关于安全分析员来说,备份包含系统分区的假造磁盘镜像不错很方便手脚假造机磁盘加载启动,然后张开一些分析使命。
关于备份磁盘数据来说,也口角常方便的,绝顶是当今7z软件不错融会假造磁盘文献。咱们就粗略把通盘磁盘数据打包成一个文献,从底层拷贝磁盘数据是径直跳过文献权限问题的,后续不错径直用7z右键绽开径直浏览这个假造磁盘文献里的通盘文献。
操作系统将通盘磁盘建树空洞成了一个文献,在Windows下是不错用API CreateFile绽开、ReadFile读取的步地去读取通盘扇区的,跟读取等闲文献的步地近似。操作系统还进一步凭据磁盘的分区信息,把每个分区挂载并空洞成一个文献。这么开辟者就能很方便的凭据要备份的磁盘或分区进行备份。
\\.\PhysicalDriveX 这是通盘磁盘的文献名容貌,X是序号,可在磁盘管制了解。\\?\Volume{GUID} 这是分区的文献名容貌。磁盘建树不错通过QueryDosDevice以第一个参数为NULL来获取通盘建树列表,再筛选建树名伊始是PhysicalDrive来得到系统挂载的通盘磁盘建树,然后就不错使用CreateFile绽开相应建树,得到建树的句柄,有了句柄后主要即是通过DeviceIoControl和建树驱动通讯了,常见通讯限定代码举例IOCTL_DISK_GET_DRIVE_GEOMETRY_EX可查询磁盘大小信息、IOCTL_DISK_GET_DRIVE_LAYOUT_EX可查询分区信息等等,在网上搜索这些限定代码不错找到好多参考代码。
这个功能不错说是最简便的,比如磁盘建树名是\.\PhysicalDrive0,把它当等闲文献用重新读取,直到ReadFile碰到扫尾,最佳照旧先赢得磁盘的大小,凭据总大小来读取,使用的缓冲区应该是扇区大小(512字节)的倍数。防范你可能弗成用等闲文献的步地用SetFilePointer 诊疗文献指针到末尾,然后凭据文献指针位置来赢得磁盘的原始大小,而是应该用DeviceIoControl协调参数IOCTL_DISK_GET_DRIVE_GEOMETRY_EX来查询磁盘大小信息。
最初把磁盘的鉴识按“分区”和“非分区”区别对待,“非分区”的区域比如分区表、莫得识别的分区空间等等皆以为是已使用的扇区,“分区”区域的使用情况是由关系文献系统决定的,可是文献系统非论是NTFS照旧FAT32,皆不错通过DeviceIoControl协调参数FSCTL_GET_VOLUME_BITMAP向分区建树查询一经分派使用的空间位图。其实这亦然disk2vhd的旨趣,在一初始并不明晰disk2vhd备份速率比winhex克隆磁盘快好多是什么原因,通过Procmon和静态反编译分析等步地对disk2vhd进行商量后才有所了解,旨趣disk2vhd并不是全扇区备份。
最初是使用Procmon过滤出disk2vhd的通盘行为,发现备份数据过程有好多ReadFile是从分区建树读取数据,仔细分析每个ReadFile的详备发现,偏移不是有规章递加,会“智能”的跳进,似乎会跳过一些未使用的空间,往前追忆到CreateFile隔邻发现,有两个DeviceIoControl查询行为很可疑,分别是FSCTL_GET_VOLUME_BITMAP(0x9006F)和FSCTL_FILESYSTEM_GET_STATISTICS(0x90060),通过搜索网上贵寓了解,这两个限定代码的作用应该即是赢得磁盘在使用的扇区的关节作用,然后用反编译器具对disk2vhd 2.01 (MD5 AD3E0AB4C552584FDDCD1DAC4388A0A9)商量了一番,找到“某函数”关系代码考据了disk2vhd的旨趣,disk2vhd的过程是,先得到BITMAP信息,然后还尝试把根目次的页文献\Pagefile.sys和睡眠文献Hiberfil.sys的关系偏移也在BITMAP中置0,再判断分区若是是FAT则需要计较首个簇(cluster)的偏移,终末拷贝分区的时辰就不错凭据BITMAP信息中的非0位“智能”的跳进。
对逆向分析感兴味的小伙伴,通过定位DeviceIoControl的援用函数1400055C0,稽查参数有0x9006F或0x90060的函数应该不错很容易找到“某函数”的地址,该函数前部分还有一些代码是获取簇(cluster)的大小,以及计较装载通盘分区的Bitmap需要多大内存。簇是什么呢?还谨记容貌化磁盘的时辰界面有个“分派单元大小”的选项吧,这个就等于一个簇的大小,比如每每NTFS一个簇是4096,等于是8个扇区(512字节)构成一个簇。
用FSCTL_GET_VOLUME_BITMAP查询到的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的偏移,感兴味的同学不错去分析样本中的func_1400056B0,看他奈何融会的,不错把代码径直抠出来用。
裸舞推特防范Bitlocker是以分区来加密的,不是通盘磁盘。若是用户一经解锁了加密分区,通过\?\Volume{XXXX}方绽开建树,读取的数据即是解密后的数据。若是从\.\PhysicalDriveX建树读取通盘磁盘,这特殊于绕过了Bitlocker的驱动模块,那么磁盘中Bitlocker分区相应的位置读取到的会是加密的数据。
通过了解掌持一种假造磁盘的组件的接口、windows的磁盘管制接口,以及分区Bitmap的一些常识,咱就不错开辟近似disk2vhd这种物理磁盘转假造磁盘的功能了。另外辛苦备份的步地则仅仅多开辟层网罗通讯,详备不错见源代码。
[招生]科锐逆向工程师培训(2024年11月15日实地jk 白丝,辛苦训诫同期开班, 第51期)
上传的附件: src.zip (8.40MB,14次下载)