linux 内存映像,一种Linux系统物理内存镜像文件分析方法

一种Linux系统物理内存镜像文件分析方法【

技术领域:

】[0001]本发明涉及一种Linux系统物理内存镜像文件分析方法,更具体的说,尤其涉及一种无需获知操作系统的版本信息即可从物理内存镜像中恢复出内核变量符号表的Linux系统物理内存镜像文件分析方法。【

背景技术:

】[0002]美国空军特别调查办公室的Kornblum于2002年在DFRWS(DigitalForensicResearchWorkshop)中发表了名为〈〈PreservationofFragileDigitalEvidencebyFirstResponders》的主题报告,在报告中提出需要调查易失性内存信息以全面而准确地获取网络攻击和网络犯罪证据。为推进物理内存分析技术的发展,DFRWS于2005年发起了针对Windows系统的内存取证分析挑战赛,旨在通过分析给定的一个Windows2000物理内存转储文件提取该文件中所包含的隐匿进程及其隐匿方式;DFRWS于2008年又发起了针对Linux系统的内存取证分析挑战赛。从此,对于物理内存的分析和获取成为计算机取证的研究热点,各种物理内存取证技术和方法相继出现。[0003]在物理内存分析方面,当前研究工作主要集中在Windows平台下,代表性的成果包括:(1)A.Schuster于2006年提出了Windows内存镜像文件中进程和线程的查找方法;(2)Carvey提出了Windows注册表可作为取证源;(3)2007年,SeokheeLee等人研究了虚拟内存文件Pagefile.sys的获取和分析问题;(4)王连海在2008年提出了基于KPCR定位进程控制块的方法,适用于windows2000以后所有版本的。(5)Dolan-Gavitt提出了利用VAD树提取内存进程和线程信息的方法,详尽地分析了内存注册表数据结构,提出了内存注册表键值信息提取方法。(6)Petroni等人提出了一种模块化的、可扩展的VolatilityFramework,通过对底层内存数据获取的封装而向上提供数据接口,从而使物理内存取证研究者专注于高层的内存数据分析与挖掘。[0004]相比之下,对于Linux操作系统物理内存分析技术,当前研究工作较少。MariuszBurdach根据System,map文件提出了查找用户态进程和内核态进程的方法,高宇航等人提出了根据init线性队列、散列表、进程家谱和运行队列查找进程的方法,VolatilityFramework也支持对Linux物理内存镜像文件的分析。[0005]在实际对Linux操作系统的物理内存镜像文件进行分析过程中,我们发现,以上分析方法存在一定的局限性,主要表现在以下几个方面:[0006](1)给定一个物理内存镜像文件,分析前需要预知其操作系统版本;[0007](2)除了操作系统版本外,还需要此内核版本对应的System,map内核符号表;[0008](3)目前分析方法实现的工具使用起来操作步骤较为复杂,以目前使用较为广泛的VolatilityFramework为例,在使用前需要做如下配置:[0009]a)首先确保系统中有dwarfdump、GCC以及make工具;[0010]b)解压缩下载的volatility包,到volatility/tools/linux目录下执行"make"操作生成module,dwarf文件;[0011]c)找到系统System,map文件,执行操作"sudozipvolatility/volatility/plugins/overlays/linux/Ubuntul204.zipvolatility/tools/linux/module.dwarf/boot/System.map-3.2.〇-23-generic"生成Ubuntul204.zip文件;[0012]d)执行操作"pythonvol.py-info|grepLinux",如果可以看到刚才生成的配置文件信息"LinuxUbuntul204x64_AProfileforLinuxUbuntul204x64",说明可以对内核为3.2.0.23的物理内存镜像文件进行分析了。[0013]综上所述,当前针对Linux操作系统的物理内存分析技术只能针对已知操作系统的物理内存镜像文件进行分析,且需要附加内核符号表文件。如果给定一个未知操作系统版本的物理内存镜像文件,将无法处理。为了克服上述技术存在的缺点,本发明提出一种新的Linux操作系统物理内存镜像文件分析方法,该方法能够自动判断操作系统版本、并获取指向页目录指针,在地址转换的基础上,从内存镜像文件中获取/proc/kalIsyms内核符号表信息,根据内核符号表中相关内核变量获取系统进程、驱动以及网络等信息。[0014]涉及概念及专业术语如下:[0015]物理内存镜像文件:物理内存镜像文件是指把目前正在运行的计算机或者移动终端设备中物理内存信息按照一个比特对应一个比特的方式映射出来所组成的文件,该文件中数据的位置与物理内存中数据的位置是--对应的。物理内存镜像文件获取方法目前主要有两类方法,一类是软件方法,另一类是硬件方法。软件方法主要有微软提供的CrashDump方法、DD(datadumper)工具、虚拟机(Virtualization)、BradleySchatz构建的BodySnatcher工具。硬件方法主要有BrianCarrier提出的基于PCI扩展卡的方法和Becher、B0ILEAUA等人提出的基于FireWire的方法。[0016]内核符号表:所谓内核符号表就是在内核内部函数或变量中可供外部引用的函数和变量的符号表。Windows操作系统编译器一般把符号存储在以PDB为扩展名的外部文件中。在MacOSX操作系统中,编译器把符号文件存放在内核可执行文件的_LINKEDIT节中。Linux内核符号表位于两个部分:/boot/System.map和/proc/kallsyms。两者都是内核函数、变量的符号表,结构一致,对于可导出的内核符号,包括内核变量、函数其运行时在物理内存中的位置是一样的。区别在于System,map文件面向内核,是GCC在编译连接时生成的,同一内核的System,map文件是固定大小的,没有动态添加模块中的变量、函数名;而/proc/ka11syms在内核启动过程中创建,并实时更新,反映的是系统的当前最新情况,同时也包含动态加载的模块导出的函数、变量名称。内存符号表的变量可以用来获取系统进程、驱动以及网络等信息,当前的物理内存分析技术多使用System,map文件进行辅助分析。[0017]模块:模块是一种向Linux内核添加设备驱动程序、文件系统及其他组件的有效方法,而无需连编新内核或重启系统。模块代码导出一些函数,可以由其他核心模块使用。【

发明内容】[0018]本发明为了克服上述技术问题的缺点,提供了一种Linux系统物理内存镜像文件分析方法。[0019]本发明的Linux系统物理内存镜像文件分析方法,其特别之处在于,通过以下步骤来实现:[0020]a).操作系统版本判断以及页目录地址的获取,在对Linux系统初始化时,通过调用初始化函数crash_save_vmcoreinfo_int函数,将vmcoreinfo_data的内容进行初始化;从获取的vmcoreinfo_data数据中提取操作系统版本信息以及内核符号_stext、swapper_pg_dir的值;[0021]如果操作系统版本信息中含有i686字符或者获取到的swapper_pg_dir的值为八位16进制表示的地址,则判断出该Linux系统为32位操作系统;如果操作系统版本信息中含有x86_64字符或者获取到的swapper_pg_dir的值为十六位16进制表示的地址,则此系统为64位操作系统;[0022]获取到的swapper_pg_dir的值为页目录虚拟地址,如果操作系统为32位,则将其减去OxcOOOOOOO即为页目录的物理地址;如果操作系统为64位,则将其减去0xffffffff8000000,即可获取页目录的物理地址;[0023]b).地址转换,32位操作系统地址分为开启PAE模式和未开启PAE模式,这两种模式下又分为大页模式和小页模式,利用页目录的物理地址,便可实现虚拟地址向物理地址的地址转换;64位操作系统地址分为小页模式和大页模式,利用步骤a)中获取的页目录的物理地址,亦可实现虚拟地址向物理地址的转换;[0024]c).数据库中已存系统内核符号表的恢复,判断在物理内存镜像文件的内核变量数据库中是否能查询到操作系统版本信息,如果能查询到操作系统的版本信息,则获取kailsyms_addresses、kailsyms_num_syms、kailsyms_names、kailsyms_markers、kallsyms_token_table以及kallsyms_token_index内核变量的值,再通过步骤c_l)至c-3)恢复系统的内核符号表;如果不能查询到操作系统的版本信息,则执行步骤d);[0025]c-1)·获取内核符号的数目,将获取的kallsyms_num_syms变量虚拟地址利用步骤b)中的地址转换方法,转换为对应的物理地址,并获取此物理地址对应的物理内存信息为/proc/kallsyms中系统内核符号的个数;[0026]c-2).获取内核符号的类型和名称,kallsyms_names对应经过排序的内核符号的类型和名称组成的字符串,首先将kallsyms_names变量虚拟地址按照步骤b)中的方法转化为物理地址,利用此物理地址在内存镜像文件中获取字符串,每个字符串的格式为字符串长度和压缩串;然后再利用内核变量kallsyms_token_table和kallsyms_token_index将字符串解析出来,以获取内核符号的类型、名称;[0027]c-3).获取内核符号的虚拟地址,kallsyms_addresses变量对应经过排序的所有内核符号的虚拟地址,对于经步骤c-2)获取的内核符号,按照其在kalIsyms_names变量中的次序,从kallsyms_addresses变量所对应的物理地址中获取内核符号表的虚拟地址;通过步骤c-2)和步骤c-3)即可获取系统数据库中所有内核符号表的类型、名称和虚拟地址信息;[0028]d).数据库中未存系统内核符号的恢复,如果在内核变量数据库中没能查询到目标操作系统版本,则根据步骤a)中获取的内核变量_stext的值在内存中进行搜索,在搜索到的地址处往前追溯寻找内核变量_text的值,内核变量_text的值为_stext去掉后十六位的偏移;获取到的_text的值为kallsyms_address的地址或其地址的近似值;[0029]将获取到的kallsyms_addresses地址或其地址的近似值转换为虚拟地址,在内存镜像文件中进行搜索,在搜索到的地址前后查找函数标志位,查找出函数updatejter在内存中的数据;反编译update_iter函数在内存中数据,即可获取kallsy当前第1页1&nbsp2&nbsp3&nbsp4&nbsp5&nbsp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值