本发明属于计算机软件开发,具体涉及一种基于全局内存保护的内核内存访问越界的调试方法。
背景技术:
1、内存访问越界是一种编程错误,它发生在程序试图访问超出其分配的内存范围时。这种错误可能导致程序崩溃、数据损坏、未定义行为以及安全漏洞等问题。内存访问越界的常见原因包括数组越界、字符串操作越界和指针越界等。例如,当程序试图访问数组的非法索引时,或者在使用指针时指向了不属于它的内存区域,都会导致内存访问越界。此外,未对字符串长度进行检查的字符串操作,或者在使用malloc等函数时分配的内存大小不正确,也容易导致内存访问越界。
2、根据程序运行级别的不同,内存访问越界可分为用户态程序内存访问越界和内核态程序内存访问越界。现有技术中,针对用户态程序内存访问越界的定位、调试和诊断方法有很多种,也有很多比较有效的辅助工具。
3、内核态程序内存访问越界导致的问题往往会使操作系统出现蓝屏故障进而重启,虽然这一过程可能会生成保存内存信息的dump文件以便后续的问题定位,但是由于现有机制的局限性使定位仍十分困难,主要问题有:无法在发生异常的现场进行动态调试和分析,具体来说,由于故障现象具有一定的滞后性,即当发生内存访问越界后系统往往会再运行一段时间内核才会崩溃,而这时生成的dump文件很难还原出内存访问越界时的调用栈信息,此外,对于非开源的操作系统则无法采用在内核中增加调试选项或打印语句的方式进行辅助调试。
技术实现思路
1、有鉴于此,本发明提供了一种基于全局内存保护的内核内存访问越界的调试方法,实现了没有操作系统内核源码情况下的内核内存访问越界的第一时间检出。
2、本发明提供的一种基于全局内存保护的内核内存访问越界的调试方法,具体包括以下步骤:
3、构建内核监测器用于监测内核模块的加载过程及内核线程的创建过程,构建虚拟内核调试器用于监测堆内存访问、执行堆内存区域清零及捕获内存访问异常;
4、在待测系统启动时加载内核监测器及虚拟内核调试器,内核监测器执行对内核模块及内核线程的监测;将内核地址空间映射到的物理内存页记为内核物理内存页,虚拟内核调试器启动对堆内存访问的监测、初始化第一堆内存地址列表,第一堆内存地址列表用于记录不存在内存访问越界的堆内存访问的指令地址;
5、在待测系统运行过程中,内核监测器在监测到内核模块的加载操作时获取内核模块的基地址及模块大小,在监测到内核创建新线程时获取新线程的栈基地址及栈界限,将基地址及模块大小、栈基地址及栈界限发送至虚拟内核调试器;
6、虚拟内核调试器将接收到的基地址及模块大小保存在第一内核模块地址列表中,将由栈基地址及栈界限确定的地址空间保存在内核栈内存列表中;将内核物理内存页中除第一堆内存地址列表及内核栈内存列表记录的内存区域以外的内存区域设置为不可访问;
7、虚拟内核调试器监测到堆内存分配操作时,将为该堆内存分配操作建立的hook函数所对应的指令地址记为目标指令地址并将其加入目标指令地址列表中,对相关堆内存区域清零;
8、虚拟内核调试器监测到内存访问异常时获取异常指令地址,若异常指令地址在第一堆内存地址列表中则挂起待测系统,根据异常指令地址还原调用栈确定异常位置,比较异常指令地址与第一内核模块地址列表中地址确定异常相关的内核模块;若异常指令地址不在第一堆内存地址列表中且在目标指令地址列表中,则将当前的堆内存区域设置为可访问,将异常指令地址添加到第一堆内存地址列表中,将当前执行的指令地址改为异常指令地址,清除异常标志,恢复系统执行;若异常指令地址不在第一堆内存地址列表中且不在目标指令地址列表中,则挂起待测系统,根据异常指令地址还原调用栈确定异常位置,比较异常指令地址与第一内核模块地址列表中地址确定异常相关的内核模块。
9、进一步地,所述内核监测器以内核驱动的方式构建。
10、进一步地,所述以内核驱动的方式构建,为采用系统提供的内核接口注册回调函数,当内核模块被加载时调用该回调函数实现对内核模块的监测。
11、进一步地,所述将基地址及模块大小、栈基地址及栈界限发送至虚拟内核调试器,为采用libvmi实现的操作系统与hypervisor间的通信接口进行传递。
12、进一步地,所述虚拟内核调试器基于硬件虚拟化以hypervisor方式构建。
13、进一步地,所述基于硬件虚拟化以hypervisor方式构建,通过为堆内存访问操作建立hook函数实现。
14、进一步地,所述建立hook函数为通过hook内核的exallocatepool、exallocatepool2、exallocatepool3或exallocatepoolwithtag函数实现。
15、进一步地,对目标指令地址相关的当前堆内存区域清零,通过以二进制代码的形式写入待测系统内核中实现。
16、有益效果
17、本发明为待测系统构建内核监测器及虚拟内核调试器,内核监测器监测待测系统中内核模块的加载过程及内核线程的创建过程,并将获取的内核模块及内核线程的地址信息发送至虚拟内核调试器,虚拟内核调试器根据接收到的地址信息动态修改特定内核物理内存页的访问权限,并在监测到堆内存分配访问操作时对相关内存区域执行清零操作以触发内存访问异常,通过对内存访问异常的判断实现内核堆内存访问越界的识别及处理,实现了没有操作系统内核源码情况下的内核内存访问越界的第一时间检出,以及基于检出结果的内核动态调试分析。
1.一种基于全局内存保护的内核内存访问越界的调试方法,其特征在于,具体包括以下步骤:
2.根据权利要求1所述的调试方法,其特征在于,所述内核监测器以内核驱动的方式构建。
3.根据权利要求2所述的调试方法,其特征在于,所述以内核驱动的方式构建,为采用系统提供的内核接口注册回调函数,当内核模块被加载时调用该回调函数实现对内核模块的监测。
4.根据权利要求1所述的调试方法,其特征在于,所述将基地址及模块大小、栈基地址及栈界限发送至虚拟内核调试器,为采用libvmi实现的操作系统与hypervisor间的通信接口进行传递。
5.根据权利要求1所述的调试方法,其特征在于,所述虚拟内核调试器基于硬件虚拟化以hypervisor方式构建。
6.根据权利要求5所述的调试方法,其特征在于,所述基于硬件虚拟化以hypervisor方式构建,通过为堆内存访问操作建立hook函数实现。
7.根据权利要求6所述的调试方法,其特征在于,所述建立hook函数为通过hook内核的exallocatepool、exallocatepool2、exallocatepool3或exallocatepoolwithtag函数实现。
8.根据权利要求1所述的调试方法,其特征在于,对目标指令地址相关的当前堆内存区域清零,通过以二进制代码的形式写入待测系统内核中实现。