linux物理内存镜像获取工具,一种Linux系统物理内存镜像文件分析方法_3

图;

[0053] 图4为本发明的实施例中update_iter函数的调用关系图;

[0054] 图5为本发明的实施例中update_iter在内存中的内容;

[0055] 图6为本发明的实施例中进程结构关系图;

[0056] 图7为本发明的实施例中模块结构关系图;

[0057] 图8为本发明中64位小页模式下地址转换示意图;

[0058] 图9为本发明中64位大页模式下地址转换示意图;

[0059] 图10为本发明中32位开启PAE小页模式地址转换示意图;

[0060] 图11为本发明中32位开启PAE下大页模式地址转换示意图;

[0061] 图12为本发明中32位未开启PAE下小页模式地址转换示意图;

[0062] 图13为本发明中32位未开启PAE下大页模式地址转换示意图。

【具体实施方式】

[0063] 下面结合附图与实施例对本发明作进一步说明。

[0064] 如图1所示,给出了本发明的Linux系统物理内存镜像文件分析方法的流程图,其 通过以下步骤来实现:

[0065] 1.操作系统版本判断以及页目录地址的获取;

[0066] 在系统初始化时,crash_save_vmcoreinfo_init函数初始化函数被调用,它将初 始化vmcoreinfo_data内容,此内容就是ELF文件中的ΡΤ_Ν0ΤΕ结构的desc信息,信息格 式如图2所示,给出了本发明的内存镜像文件中vmcoreinfo_data的部分数据内容。

[0067] 从图2可以看到,如果能够获取到vmcoreinfo_data便可获取到操作系统版本以 及内核符号 _stext、swapper_pg_dir 的值。vmcoreinfo_data 内容以 "0SRELEASE = " 开 头,同时包含 " SYMBOL (swapper_pg_dir) = "、" SYMBOL (_stext)= " 以及 " SYMBOL (vml i st) ="字符串,所以这些特征值在内存镜像文件中进行搜索,获取到操作系统版本以及内核 变量SWapper_pg_dir、_stext的值。操作系统版本信息若含有i686字符或者获取到的 swapper_pg_dir的值为八位16进制地址,则此系统为32位操作系统;若操作系统版本信 息含有x86_64字符或者获取到的swapper_pg_dir的值为十六位16进制地址,则此系统为 64位操作系统。获取到的swapper_pg_dir的值为页目录虚拟地址,如果操作系统为32位, 则虚拟地址减去OxcOOOOOOO即为页目录物理地址;如果操作系统为64位,则虚拟地址减去 0xffffffff80000000为页目录物理地址。

[0068] 2.地址转换;

[0069] 有了页目录地址,便可实现虚拟地址向物理地址的地址转换。32位操作系统地址 分为开启PAE模式和未开启PAE模式,这两种模式分别分为大页模式和大页模式,转换方法 如图10-13所示。64位操作系统地址转换分为小页模式和大页模式两种,转换方法如图8 和图9所示。在物理内存镜像文件中保存的地址皆是虚拟地址,所以地址转换是物理内存 分析的基础。虚拟地址向物理地址转换的方法,在后面详细给出。

[0070] 3.数据库中已存系统内核符号表的恢复;

[0071] 获取到了物理内存镜像文件操作系统版本后,向内核变量数据库中进行查询是否 已保存此版本内核信息。内核变量数据库中保存了各个Linux内核版本对应的kailsyms_ addresses、 kallsyms-num-syms、 kallsyms-names、 kallsyms-markers、 kallsyms_token_ table 以及 kallsyms_token_index 内核变量的值D

[0072] 若在内核变量数据库中查询到目标操作系统版本后,获取目标操作系统版本的上 述六个内核变量的值,根据这几个内核变量的值在内存获取内核符号表,获取方法描述如 下:

[0073] 将获取到的kal Isyms_num_syms变量虚拟地址利用页目录地址转换为物理地 址,获取此物理地址对应的物理内存信息为/proc/kallsyms中系统内核符号个数,而 kallsyms_addresses变量对应经过排序的所有内核符号的地址,kallsyms_names是符号 名组成的字符串,包含了若干个子字符串,每个子字符串的格式为字符串长度和压缩串,为 了解析压缩串而设置了变量 kailsyms_token_table 和 kailsyms_token_index,kailsyms_ token_table记录每个ascii字符的替代串,kallsyms_token_index记录每个ascii字符 的替代串在kallsym S_t〇ken_table中的偏移,依次解析压缩串中每个字符,将获取到的字 符串连接起来即为此内核符号的类型和名称。

[0074] 以内核版本为"3. 6. 10-4. fc 18. i686. PAE"的物理内存镜像为例说明上述恢复方 法:

[0075] 在数据库中搜索到此版本对应的内核变量的地址如下:

[0076] c09e8c0c R kallsyms_addresses

[0077] c0a247b0 R kallsyms_num_syms

[0078] c0a247b4 R kallsyms_names

[0079] c0ad8e54 R kallsyms_markers

[0080] c0ad9210 R kallsyms_token_table

[0081] c0ad95a0 R kallsyms_token_index

[0082] 将kal I syms_num_syms变量的虚拟地址进行地址转换获取其物理地址为 0xa247b0,获取此物理地址在物理内存镜像文件中信息为0xeee9,即在/proc/kallsyms中 系统内核变量个数为61161个。读取kallsyms_addresses物理地址指向内容,依次获取 61161个变量的虚拟地址,如图3所示,给出了本实施例中kallsyms_addresses物理地址指 向内容的局部示意图。

[0083] 表1给出了 kallsyms_names物理地址所指向内容的开始部分;

[0084] 表 1

[0085]

[0086] 读取kallsyms_names物理地址指向内容,读取第一个子字符串为表1中的画面部 分的内容:〇71F FE 7274A23332。

[0087] 第一个07表示长度,然后依次处理每一个压缩符,第一个为Oxlf,乘以2后 为0x3e,在kallsyms_token_index变量指向内容偏移0x3e处获取内容为0x88,然后在 kallsyms_token_table变量指向内容偏移0x88处获取内容为Ts,依次处理余下六个字符, 最后获取到第一个内核变量名称为startup_32,类型为T,结合根据kallsyms_addresses 内核变量获取到的地址,内核变量startup_32对应的虚拟地址为0xc0400000。

[0088] 4.数据库中未存系统内核符号表的恢复;

[0089] 若在内核变量数据库中没能查询到目标操作系统版本,则根据内核变量_stext 的值在内存中进行搜索,在搜索到的地址处往前追溯寻找内核变量_text的值,内核变量_ text的值为_stext的值去掉后十六位的偏移。/proc/kallsyms中第一个内核变量一般情 况下是内核变量_七6乂1:,有的64位系统中在_text变量前还保存了其它变量,所以找到内核 变量_text的值为kallsyms_address的近似值,即不确定是否为kallsyms_address的地 址。

[0090] 用获取到的kallsyms_address的近似值转换为虚拟地址在内存镜像文件中进行 搜索,对搜索到的地址向后查看是否含有"Of b7 84 00"或者"Of b7 94 00",对搜索到的 地址从前七位开始截取至后11位,此段内容对应update_iter函数所调用的kallsyms_ get_symbol_type 函数中的"kallsyms_token_table[kallsyms_token_index[kallsyms_ names[off+l]]]; "语句在内存中内容,如图4所示,给出了本发明的实施例中update_iter 函数的调用关系图。反编译后获取变量kallsyms_token_table、kallsyms_token_index以 及 kallsyms_names 的值,变量 kallsyms_num_syms 的值为 kallsyms_names 的值减去 4(32 位操作系统下)或者减去8 (64位操作系统)下。

[0091] 然后根据获取到的内核变量值进行所有内核变量的恢复,恢复方法与第三步中 恢复方法相同。从恢复出来的内核变量中抽取_stext变量与第一步中获取到的_stext 变量进行比较,如果变量值相同,说明获取到的值是正确的;如果变量值不同,则改变 kallsyms_address近似值,重复以上分析。

[0092] 以内核版本为"3. 6. 10-4. fc 18. i686. PAE"的物理内存镜像为例说明上述获取方 法:

[0093] 根据第一步中获取到_stext的值为c04010e8,在内存镜像文件中搜索 "e81040c0"字符串。在搜索到地方往前搜索C0400000,地址为0x9e8c0c,加上OxcOOOOOOO 转换为虚拟地址为0xc09e8c0C。然后在内存镜像文件中搜素 "0c 8c 9e c0"字符串,搜索 到后向后查看内存内容是否包含"Of b7 84 00"或者"Of b7 94 00"标志位,如图5所示, 给出了本发明的实施例中update_iter在内存中的内容;

[0094] 反编译上述数据获取到 kallsyms_names 值为 0xc0a247b4、kallsyms_token_ table 值为 0xc0ad9210,kallsyms_token_index 值为 Ox c0ad95a0,kallsyms_num_syms 值 为 kallsyms_names 的值减去 4 即 0xc0a247b0。

[0095] 5.获取系统关键信息,获取到系统内核变量值后,从中抽取对获取系统关键信息 较为重要的内核变量:

[0096] 5-1).根据init_task变量值获取进程信息,根据进程信息获取文件信息;init_ task变量指向swapper进程对应task_struct结构体地址,所有正在运行的进程其task_ struct结构体形成一个双向链表,获取到swapper进程地址后,根据双向链表获取到所有 的正在运行的进程。

[0097] 在结构{本 task-struct 中含有 struct mm_struct氺mm、struct fs_struct^fs、 struct files_struct*files、struct thread_struct thread 等变量,如图 6 所不,给出了 本发明的实施例中进程结构关系图,根据这些变量获取进程相关文件信息。

[0098] 5-2).根据modules变量值获取

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值