linux物理内存地址与iomem,一种Linux系统物理内存镜像文件分析方法_4

本发明提供一种Linux系统物理内存分析方法,包括操作系统版本判断、页目录地址获取、地址转换和内核及模块符号表恢复。通过对vmcoreinfo_data的分析确定操作系统版本,利用swapper_pg_dir获取页目录地址,实现虚拟到物理地址的转换。同时,从内存镜像中提取内核和模块符号表,用于获取系统关键信息。该方法简化了分析流程,适用于不同版本的Linux系统。
摘要由CSDN通过智能技术生成

模块信息,如图7所示,给出了本发明的实施例中 模块结构关系图,modules变量指向某一个已加载模块结构体module地址,所有已加载模 块其module形成一个双向链表,如图7所示,据此可以获取到所有已加载模块。

[0099] 5-3) ·获取网络信息及系统信息;根据 rt_hash_mask、rt_hash_table、net_ namespace_l i st变量值获取网络配置及链接信息。

[0100] 根据boot_cpu_data变量可获取目标计算机CPU信息;根据log_buf变量可以获 取目标计算机系统日志和调试信息;根据iomemjesource变量可以获取系统物理内存分 段信息;根据file_systems变量可以获取系统文件系统信息。

[0101] 6) ·获取模块导出符号表;在module结构体中含有Elf_Sym*symtab、unsigned int num_symtab、char*strtab等变量(如图13所不),num_symtab指向模块导出符号个 数,symtab指向所有符号地址,strtab指向所有符号名字。根据这三个变量获取模块导出 符号,这些符号在进行内存分析时起着重要作用,如利用kvm模块导出vm_list可以获取当 前物理机中运行的虚拟机信息。

[0102] 虚拟地址转化为物理地址的方法叙述如下:

[0103] swapper_pg_dir所对应的页目录的物理地址记为CR3,待转化的虚拟地址的21至 29 位记为 Directory、30 至 31 位记为 Directory Pointer、30 至 38 位记为 Directory Ptr、 39至47位记为PML4、48至63位记为Sing Extended,小页模式下0至11位记为Offset、 12至20位记为Table,大页模式下0至20位记为Offset ;

[0104] 如图8所示,给出了本发明中64位小页模式下地址转换示意图,如果操作系统位 数是64位操作系统小页模式,则通过以下方法进行地址转换:取CR3寄存器的12位至51 位、低12位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的 内容记为Al ;取Al的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后 的数值相加,获取此地址在物理内存镜像对应的内容记为A2 ;取A2的12位至51位、低12 位均取为〇,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的 内容记为A3 ;取A3的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相 加,获取此地址在物理内存镜像对应的内容记为A4 ;取A4的12位至51位、低12位均取为 〇,将其与Offset相加,得到的数据即为的虚拟地址转化为物理地址之后的数值;

[0105] 如图9所示,给出了本发明中64位大页模式下地址转换示意图,如果操作系统位 数是64位操作系统大页模式,则通过以下方法进行地址转换:取CR3寄存器的12位至51 位、低12位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的 内容记为Bl ;取Bl的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后 的数值相加,获取此地址在物理内存镜像对应的内容记为B2 ;取B2的12位至51位、低12 位均取为〇,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的 内容记为B3 ;取B3的21位至51位、低21位均取为0,将其与Offset相加,得到的数据即 为的虚拟地址转化为物理地址之后的数值;

[0106] 如图10所示,给出了本发明中32位开启PAE小页模式地址转换示意图,如果操作 系统位数是32位操作系统开启PAE小页模式,则通过以下方法进行地址转换:取CR3寄存 器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获取 此地址在物理内存镜像对应的内容记为Cl ;取Cl的12位至51位、低12位均取为0,将其 与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为C2 ;取 C2的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在 物理内存镜像对应的内容记为C3 ;取C3的12位至35位、低12位均取为0,将其与Offset 相加,得到的数据即为的虚拟地址转化为物理地址之后的数值;

[0107] 如图11所示,给出了本发明中32位开启PAE下大页模式地址转换示意图,如果操 作系统位数是32位操作系统开启PAE大页模式,则通过以下方法进行地址转换:取CR3寄 存器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获 取此地址在物理内存镜像对应的内容记为Dl ;取Dl的12位至51位、低12位均取为0,将 其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为D2 ; 取D2的21位至35位、低21位均取为0,将其与Offset相加,得到的数据即为的虚拟地址 转化为物理地址之后的数值;

[0108] 在32位操作系统不开启PAE模式下:待转化的虚拟地址小页模式下的0至11位 记为Offset、12至21位记为Table、22至31位记为Directory ;大页模式下:0至21位记 为 0ffset、22 至 31 位记为 Directory ;

[0109] 如图12所示,给出了本发明中32位未开启PAE下小页模式地址转换示意图,如 果操作系统位数是32位操作系统不开启PAE小页模式,则通过以下方法进行地址转换:取 CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相加,获取 此地址在物理内存镜像对应的内容记为El ;取El的12位至51位、低12位均取为0,将其 与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为E2 ;取E2的 12位至31位、低12位均取为0,将其与Offset相加,得到的数据即为的虚拟地址转化为物 理地址之后的数值;

[0110] 如图13所示,给出了图13为本发明中32位未开启PAE下大页模式地址转换示意 图,如果操作系统位数是32位操作系统不开启PAE大页模式,则通过以下方法进行地址转 换:取CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相 加,获取此地址在物理内存镜像对应的内容记为Fl ;取Fl的21位至30位、低22位均取为 〇,将其与Offset相加,得到的数据即为的虚拟地址转化为物理地址之后的数值。

[0111] 本发明针对目前Linux系统物理内存分析技术存在的只能分析已知操作系统版 本的物理内存镜像文件、需要附加内核符号表文件、使用起来操作步骤较为复杂等问题,给 出了一种新的针对Linux系统物理内存分析方法,与现有技术相比,本发明所提出的方法 有以下优点:

[0112] 1、本发明所提出的方法能够自动判断物理内存镜像文件对应的操作系统版本,无 需预知目标计算机的操作系统版本;同时获取页目录地址,实现虚拟地址到物理地址的转 换。

[0113] 2、本发明提出了一种从物理内存镜像文件中进行符号表提取的新方法,根据 kallsyms_addresses、kallsyms_num_syms、kallsyms_names、kallsyms_token_table 以及 kallsyms_token_index这几个内核变量从物理内存中提取/proc/kallsyms中的符号表, 同一内核版本,这几个变量值是相同的,根据分析出的版本从内核变量数据库中获取上述 内核变量的值。对于内核变量数据库中不存在的值,对内核函数update」ter在内存中的 二进制码进行反编译获取上述内核变量的值。

[0114] 3、本发明除了获取内核符号表外,获取各个模块导出的符号表,根据这些符号表 中的某些变量或者函数将获取目标计算机的重要信息。

[0115] 4、据此开发的系统操作简单,无需指定物理内存镜像文件对应的操作系统版本及 进行相关系统配置即可进行。

【主权项】

1. 一种Linux系统物理内存镜像文件分析方法,其特征在于,通过以下步骤来实现: a) .操作系统版本判断以及页目录地址的获取,在对Linux系统初始化时,通过调用初 始化函数crash_save_vmcoreinfo_int函数,将vmcoreinfo_data的内容进行初始化;从获 取的vmcoreinfo_data数据中提取操作系统版本信息以及内核符号_stext、swapper_pg_ dir的值; 如果操作系统版本信息中含有i686字符或者获取到的swapper_pg_dir的值为八位16 进制表示的地址,则判断出该Linux系统为32位操作系统;如果操作系统版本信息中含有 x86_64字符或者获取到的swapper_pg_dir的值为十六位16进制表示的地址,则此系统为 64位操作系统; 获取到的swapper_pg_dir的值为页目录虚拟地址,如果操作系统为32位,则 将其减去OxcOOOOOOO即为页目录的物理地址;如果操作系统为64位,则将其减去 0xffffffff8000000,即可获取页目录的物理地址; b) .地址转换,32位操作系统地址分为开启PAE模式和未开启PAE模式,这两种模式下 又分为大页模式和小页模式,利用页目录的物理地址,便可实现虚拟地址向物理地址的地 址转换;64位操作系统地址分为小页模式和大页模式,利用步骤a)中获取的页目录的物理 地址,亦可实现虚拟地址向物理地址的转换; c) .数据库中已存系统内核符号表的恢复,判断在物理内存镜像文件的内核变量 数据库中是否能查询到操作系统版本信息,如果能查询到操作系统的版本信息,则获 取 kallsyms_addresses、 kallsyms_num_syms、 kallsyms_names、 kallsyms_markers、 kallsyms_token_table 以及 kallsyms_token_index 内核变量的值,再通过步骤 c_l)至 c-3)恢复系统的内核符号表;如果不能查询到操作系统的版本信息,则执行步骤d); c-1).获取内核符号的数目,将获取的kallsyms_num_syms变量虚拟地址利用步骤b) 中的地址转换方法,转换为对应的物理地址,并获取此物理地址对应的物理内存信息为/ proc/kalIsyms中系统内核符号的个数; c-2).获取内核符号的类型和名称,kallsyms_names对应经过排序的内核符号的类型 和名称组成的字符串,首先将kallsyms_names变量虚拟地址按照步骤b)中的方法转化为 物理地址,利用此物理地址在内存镜像文件中获取字符串,每个字符串的格式为字符串长 度和压缩串;然后再利用内核变量kallsyms_token_table和kallsyms_token_index将字 符串解析出来,以获取内核符号的类型、名称; c-3).获取内核符号的虚拟地址,kallsyms_addresses变量对应经过排序的所有内核 符号的虚拟地址,对于经步骤c-2)获取的内核符号,按照其在kallsyms_names变量中的 次序,从kallsyms_addresses变量所对应的物理地址中获取内核符号表的虚拟地址;通过 步骤c-2)和步骤c-3)即可获取系统数据库中所有内核符号表的类型、名称和虚拟地址信 息; d) .数据库中未存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值