怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

kvm windows虚拟机dmp文件转储

kvm下的windows虚拟机转储可从子机侧和母机侧两方面进行。

子机侧

子机侧转储windows子机信息,主要是在主机内部执行virsh inject-nmi UUID指令,通过人为模拟nmi中断实现的,之后子机触发BSOD(蓝屏),继而执行核心文件转储和重启操作。转储的文件名为MEMORY.dmp,根据设置的windows内存核心转储方式不同,该文件一般存储于c:\Windows目录或c:\Windows\Minidump目录下。

母机侧

qemu-monitor-command指令

virsh qemu-monitor-command domain
使用该类指令时,需安装qemu-monitor相关组件,否则无法使用相关指令

#故意让windows蓝屏
virsh qemu-monitor-command instance-00000b2e --hmp  nmi
#导出guest内存
virsh qemu-monitor-command instance-00000b2e --hmp  dump-guest-memory  /home/qemu/instance-00000b2e.dump

dump指令

对应语法如下:

#virsh dump指令语法
virsh dump domain corefilepath [--bypass-cache]
   { [--live] | [--crash] | [--reset] }
   [--verbose] [--memory-only] [--format string]

–live :使用该参数后,qemu进程在内核转储完成后继续运行

–crash :使用该参数后,qemu进程在内核转储完成后因crash事件而暂停

–reset:使用该参数后,qemu进程在内核转储完成后重启
若没有使用上述三个参数,则进程在内核转储完成后保持pause状态

-bypass-cache:使用该参数后,转储文件不会保存os文件系统缓存文件

–memory-only:使用该参数后,转储文件为elf格式文件,且仅包含虚拟机内存及cpu通用寄存器数值

–format:该参数与memory-only绑定使用,指定保存的转储文件的格式,其支持的文件格式(即string的参数值)包含elf、kdump-zlib(使用zlib压缩的kdump压缩格式)、kdump-lzo(使用lzo压缩的kdump压缩格式)、kdump-sbappy(使用sbappy压缩的kdump压缩格式)、win-dmp(windows的完全转储格式)

如果仅使用最简单的dump语法:virsh dump domain corefilepath,则生成的转储文件格式如下:

windows_dump_no-memory-only.dmp:QEMU suspend to disk image

如果使用memory-only语法,但不指定format,则默认格式如下:

windows_dump_memory-only.dmp:ELF 64-bit LSB core file x86-64, version 1 (SYSV)

转储文件格式转换

virsh dump指令在低版本不支持win-dmp格式,因此生成的dump文件的格式以elf文件为主,而windbg是无法直接使用并分析elf文件的,因此需进行转换,将elf文件转换为windows的dmp格式文件。

文件格式的转换主要使用volatilitydistorm两个python库。

#安装工具
git clone https://github.com/volatilityfoundation/volatility
python setup.py install
#有inline失败的问题,把函数把inline变为非inline
git clone https://github.com/gdabah/distorm
python setup.py install
#复制distorm目录下的_distorm3.so库到python sys.path否则报错
cp build/lib.linux-x86_64-2.7/_distorm3.so  /usr/lib64/python2.7/

#分析guest内存布局
[root@rg1-ostack37 /home/huiwei]# file instance-00000b2e.dump
instance-00000b2e.dump: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style

[root@rg1-ostack37 /home/huiwei]# /bin/vol.py imageinfo -f instance-00000b2e.dump
Volatility Foundation Volatility Framework 2.6.1
INFO: volatility.debug: Determining profile based on KDBG search...
  Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418
 AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
 AS Layer2 : QemuCoreDumpElf (Unnamed AS)
 AS Layer3 : FileAddressSpace (/home/huiwei/instance-00000b2e.dump)
  PAE type : No PAE
   DTB : 0x187000L
  KDBG : 0xf8000164f110L
  Number of Processors : 2
 Image Type (Service Pack) : 1
KPCR for CPU 0 : 0xfffff80001650d00L
KPCR for CPU 1 : 0xfffff880009c5000L
 KUSER_SHARED_DATA : 0xfffff78000000000L
   Image date and time : 2020-10-22 09:37:00 UTC+0000
 Image local date and time : 2020-10-22 17:37:00 +0800
#进行转换
[root@rg1-ostack37 /home/huiwei]# /bin/vol.py -f instance-00000b2e.dump --profile Win2008R2SP1x64  raw2dmp -O   instance-00000b2e.dmp
Volatility Foundation Volatility Framework 2.6.1
Writing data (5.00 MB chunks): |..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................|
[root@rg1-ostack37 /home/huiwei]# file instance-00000b2e.dmp
instance-00000b2e.dmp: MS Windows 64bit crash dump, full dump, 1310720 pages

windows目标文件的格式需选择,可通过/bin/vol.py -f XXX.dump –profile相关指令获取本机相关库支持的windows格式进行参数填写。

经过上述处理之后,即可使用windbg工具对相关dmp文件进行分析,以查找系统异常原因。