实验报告
云计算专题实验
姓名: *** 学号: **********
目录
1 2 3 4
实验目的 ............................................................................................................................. 3 实验原理 ............................................................................................................................. 3 实验平台 ............................................................................................................................. 3 实验内容 ............................................................................................................................. 3 4.1 搭建虚拟机环境..................................................................................................................... 3 4.1.1 安装并配置Linux操作系统 ......................................................................................... 3 4.1.2 安装Xen................................................................................................................................... 3 4.1.3 网络配置 ................................................................................................................................. 4 4.1.4 创建虚拟机 ............................................................................................................................ 4 4.2 安装并使用LIBVMI ................................................................................................................ 6 4.2.1 安装libvmi ............................................................................................................................. 6 4.2.2 配置libvmi ............................................................................................................................. 6 4.2.3 运行示例程序 ....................................................................................................................... 6 4.3 对进程的某一行为进行监控 ............................................................................................ 7 4.3.1 实验原理 ................................................................................................................................. 7 4.3.2 实验代码 ................................................................................................................................. 8 4.3.3 查找文件名存放地址 ........................................................................................................ 9 4.3.4 实验结果 ............................................................................................................................... 10 4.4 模拟加密监控 ...................................................................................................................... 11 4.4.1 实验原理 ............................................................................................................................... 11 4.4.2 实验代码 ............................................................................................................................... 11 4.4.3 实验结果 ............................................................................................................................... 14
1 实验目的
掌握Linux操作系统的安装、使用、开发环境搭建。
学习Xen虚拟机管理器的安装、使用,以及安装虚拟机操作系统。 学习使用Libvmi工具对虚拟机的行为(进程、内存、网络、I/O,以及
特定进程的行为)进行安全监控和分析。
2 实验原理
Xen是一个开源虚拟机管理系统。通过在其之上搭建虚拟机,我们可使用与之兼容的虚拟机内省工具libvmi进行对虚拟机的监控。
3 实验平台
外部实体机:
CPU: Intel Core i7-2600 3.40GHZ x 8 内存: 8GB
硬盘: 120GB 固态
操作系统: Ubuntu Desktop 32bit 13.10 虚拟机:
操作系统:Windows 7 sp1 32bit 开发操作机:
Apple Macbook Pro Retina with OS X 10.9
4 实验内容
4.1 搭建虚拟机环境
4.1.1 安装并配置Linux操作系统
Linux发行版使用流行的Ubuntu,版本号为13.10(当前最新)。 安装好Linux后安装openssh-server以便ssh登录进行实验: $ sudo apt-get install openssh-server 4.1.2 安装Xen
安装Xen: $ sudo apt-get install xen-hypervisor-amd64 $ update-grub 之后重启,使用sudo xm list查看信息: $ sudo xm list Name ID Mem VCPUs State Time(s) Domain-0 0 7947 8 r----- 59.5 完成Xen的安装。
4.1.3 网络配置
在/etc/network/interfaces中配置好物理端口信息后,加入以下文本以配置虚拟机网络使之桥接于物理端口: auto xenbr0 iface xenbr0 inet dhcp bridge ports eth0 之后重启网络: $ sudo service networking restart 4.1.4 创建虚拟机
重启计算机,引导选择Xen进入系统。 首先为虚拟机生成30G镜像空间: $ sudo dd if=/dev/zero of=/var/xen/images/Win7.img bs=1M count=30720 之后创建虚拟机的配置文件,配置为内存2G,一个CPU: #/etc/xen/win7 builder = 'hvm' memory = 2048 name = \"win7\" vcpus = 1 vif = [ '' ] disk = [ 'file:/var/xen/images/Win7.img,ioemu:hda,w', 'file:/home/xitianfz/cn_windows_7_ultimate_with_sp1_x86_dvd_u_677486.iso,hdc:cdrom,r' ] vnc = 1 boot = 'dc' 使用xm create命令启动虚拟机: $ sudo xm create win7 Using config file \"/etc/xen/win7\". Started domain win7 (id=3) 这样就成功使运行了虚拟机。
由于Ubuntu系统不方便使用VNC连接,故以下使用OS X下的VNC软件Chicken通过SSH隧道与虚拟机进行连接:
之后进行Windows 7系统安装,完成后的系统如下:
最后关闭系统,将虚拟机配置文件中的启动配置修改为硬盘启动: #/etc/xen/win7 … boot = 'c' 4.2 安装并使用libvmi
4.2.1 安装libvmi
$ sudo apt-get install libtool automake byacc flex $ sudo apt-get install libglib2.0-dev check libxen-dev $ git clone https://github.com/bdpayne/libvmi.git $ cd libvmi $ ./autogen.sh $ ./configure $ make $ sudo make install 由于以下代码(包括官方示例程序)将使用python版本,故还需安装PyVMI: $ sudo apt-get install python-dev $ cd tools/pyvmi $ sudo python setup.py install 4.2.2 配置libvmi
将以下虚拟机信息写入/etc/libvmi.conf: win7 { ostype = \"Windows\"; win_tasks = 0xb8; win_pdbase = 0x18; win_pid = 0xb4; win_pname = 0x16c; } 4.2.3 运行示例程序
在libvmi的./tools/pyvmi/examples文件夹下执行process-list.py示例程序: $ sudo python process-list.py win7 LibVMI Suggestion: set win_kdvb=0x83b35c28 in libvmi.conf for faster startup. [ 236] smss.exe [ 312] csrss.exe [ 360] wininit.exe [ 368] csrss.exe [ 396] winlogon.exe [ 456] services.exe [ 464] lsass.exe [ 472] lsm.exe [ 580] svchost.exe [ 656] svchost.exe [ 728] svchost.exe [ 788] svchost.exe [ 820] svchost.exe [ 952] svchost.exe [ 1036] svchost.exe [ 1204] spoolsv.exe [ 1236] svchost.exe [ 1276] taskhost.exe [ 1364] dwm.exe [ 1400] explorer.exe [ 256] SearchIndexer. [ 744] svchost.exe [ 1156] sppsvc.exe [ 100] svchost.exe [ 1780] taskhost.exe [ 4] System 4.3 对进程的某一行为进行监控
以下配合使用内存监控软件(Cheat Engine)监视虚拟机内的记事本程序(notepad.exe)当前打开的文件名。
4.3.1 实验原理
首先在虚拟机中使用Cheat Engine筛选查找出记事本程序内存中存放当前编辑的文件名字符串的地址,作为参数传入外部内省程序。外部内省程序通过调用vmi.read_str_va(vaddr)输出此va(虚拟机中程序的虚拟地址)所指向的字符串,即文件名。
4.3.2 实验代码
# -*- coding: utf-8 -*- ''' exp1.py 根据给定的地址获取虚拟机内记事本程序当前编辑的文件名 ''' import sys import pyvmi class MyException(Exception): pass def get_pids_by_name(vmi, name): ''' 根据进程名称获取进程ID 修改自examples/process_list.py ''' tasks_offset = vmi.get_offset('win_tasks') name_offset = vmi.get_offset('win_pname') - tasks_offset pid_offset = vmi.get_offset('win_pid') - tasks_offset list_head = vmi.read_addr_ksym('PsInitialSystemProcess') next_process = vmi.read_addr_va(list_head + tasks_offset, 0) list_head = next_process pids = [] while True: procname = vmi.read_str_va(next_process + name_offset, 0) pid = vmi.read_32_va(next_process + pid_offset, 0) next_process = vmi.read_addr_va(next_process, 0) if pid < 1<<16 and procname == name: pids.append(pid) if list_head == next_process: break return pids def main(argv): ''' @argv[1]: string 虚拟机名称 @argv[2]: string (hex) 记事本程序当前打开文件名内存存放地址 ''' try: # 初始化VMI vmi = pyvmi.init(argv[1], 'complete') # 查找PID process_name = 'notepad.exe' pids = get_pids_by_name(vmi, process_name) if not pids: raise MyException('未找到进程%s' % process_name); pid = pids[0] # 获取并输出文件名 print \"当前编辑文件名为: %s\" % vmi.read_str_va(int(argv[2], 16), pid) except MyException as e: print 'Error: ' + str(e) if __name__ == '__main__': main(sys.argv) 4.3.3 查找文件名存放地址
首先在虚拟机内用记事本打开一个文本文件(abcdef.txt)。
用Cheat Engine打开notepad.exe进程,在内存浏览器中查找字符串[abcdef.txt],记录下找到的多个内存地址:
再用打开的记事本程序打开另一个文件(aaabbb.txt),重复上一步操作。 比较两次找到的内存地址,选取其中两次都出现的一个,作为实验程序的输入参数(这里找到的是0x000fd35c)。
4.3.4 实验结果
运行实验程序(exp1.py),结果如下:
再在虚拟机中用打开的记事本文件打开第三个文件(qwert.txt):
用同样的参数运行实验程序,结果如下:
实验结果说明程序输出值与虚拟机中程序一致。
4.4 模拟加密监控
4.4.1 实验原理
虚拟机外部程序通过其它方法(这里由被监控程序输出)获得要监控数据的内存地址,后通过vmi.read_va()与vmi.read_str_va()取得相应的数据。
4.4.2 实验代码
外部程序exp2.py: # -*- coding: utf-8 -*- ''' exp2.py 监控程序加密数据 ''' import sys import pyvmi class MyException(Exception): pass def get_pids_by_name(vmi, name): ''' 根据进程名称获取进程ID 修改自examples/process_list.py ''' #略,见exp1.py def main(argv): ''' @argv[1]: string 虚拟机名称 @argv[2]: string 进程名称 @argv[3]: string (hex) 明文地址 @argv[4]: string (hex) 密文地址 @argv[5]: string (hex) 数据包地址 ''' try: # 初始化VMI vmi = pyvmi.init(argv[1], 'complete') # 查找PID process_name = argv[2] pids = get_pids_by_name(vmi, process_name) if not pids: raise MyException('未找到进程%s' % process_name); pid = pids[0] # 获取明文 message = vmi.read_str_va(int(argv[3], 16), pid) print '明文: %s' % message # 获取密文,这里由于不知道加密方式,故只能获取固定定长度(256)的数据 encrypted_message = vmi.read_va(int(argv[4], 16), pid, 256) print '密文: %s' % encrypted_message # 获取密文,这里由于不知道加密方式与数据包格式,故只能获取固定定长度(256)的数据 packet = vmi.read_va(int(argv[5], 16), pid, 256) print '数据包: %s' % packet except MyException as e: print 'Error: ' + str(e) if __name__ == '__main__': main(sys.argv) 虚拟机内程序exp2.c代码 //exp2.c #include 在虚拟机内运行exp2.c,结果如下: 根据输出,以0022ff30、0022fb30、0022f730为参数,在外部运行exp2.py,结果如下: 可见结果中包含了虚拟机内程序的数据信息。 5 实验总结 通过这次实验,进一步熟习了安装与配置Linux系统的步骤,学习并掌握了Xen的安装与配置,也初步学习了libvmi的使用。在实验过程中我也遇到了这么多问题。例如网上无法找到完整的libvmi api documentation,导致我不得不从其它人的使用代码和网上查询得到的资料中摸索libvmi的使用方法。另外对于最后一个实验步骤(加密内省),我也想不出太好的实验方式。总之,在这次实验中我有问题也有收获。 因篇幅问题不能全部显示,请点此查看更多更全内容