一种定位内存非法改写的方法、系统及存储介质与流程

文档序号:18257314发布日期:2019-07-24 10:21阅读:453来源:国知局
一种定位内存非法改写的方法、系统及存储介质与流程

本发明涉及嵌入式板级支持技术领域,具体涉及一种定位内存非法改写的方法、系统及存储介质。



背景技术:

在嵌入式系统中,程序通常由各种段(sector)组成,在编译的时候就已经将这些段分别分配了地址,而且每个段都是连续分布的。CPU从代码段中取指令并执行,如果代码段被改写了,会造成流程错误,甚至是系统死机的现象出现。

通常,为了对代码段进行保护,代码段是不会修改的,是禁止改写代码段的内存空间的。只有在debug(调试)版本在线调试或者打补丁时,才可能修改代码段指令。

目前,代码段写保护是通过设置代码段所在的内存页属性为只读来实现,每个页的大小为4KB,并且代码段必须先设置4KB对齐,在编译的时候就要设置代码段起始地址是4096的整数倍,同时结束地址所在的页也不能有其它不被写保护的段。因此,现有技术存在两个缺陷,第一是当需要修改编译脚本时,需要非常专业的工程师进行修改,不能普及;第二是造成一定内存资源的浪费,利用率不足且增加成本。

因此,现有技术还有待于改进和发展。



技术实现要素:

本发明要解决的技术问题在于,针对现有技术的上述缺陷,提供一种定位内存非法改写的方法、系统及存储介质,旨在通过自编译的函数调用栈以及中央处理器提供的debug功能自动定位内存被非法改写的所在行数据,不仅可以实现复位系统,提高安全性,还无需增加人工成本,节约资源,方便用户。

本发明解决技术问题所采用的技术方案如下:

一种定位内存非法改写的方法,所述定位内存非法改写的方法包括以下步骤:

监测内存是否被访问;

当监测到内存被访问时,触发中央处理器使能debug中断;

修改程序计数器地址,所述中央处理器自动执行debug中断程序,并通过函数调用栈定位内存被改写的位置。

所述的定位内存非法改写的方法,其中,所述监测内存是否被访问之前包括:

预先编译用于触发debug中断时被调用的函数调用栈,并存储在内存中。

所述的定位内存非法改写的方法,其中,所述监测内存是否被访问之前还包括:

预先设置在所述中央处理器中的用于监控内存的机器状态寄存器和调试控制寄存器并进行初始化,同时也初始化所述程序计数器。

所述的定位内存非法改写的方法,其中,所述监测内存是否被访问具体包括:

启动中央处理器监控功能,将当前运行程序的代码段的起始地址写入至所述机器状态寄存器,将当前运行程序的代码段的结束地址写入至所述调试控制寄存器;

所述中央处理器监测当前内存是否被写访问。

所述的定位内存非法改写的方法,其中,所述当监测到内存被访问时,触发中央处理器使能debug中断具体包括:

当所述中央处理器监测到内存被写访问时,则触发所述中央处理器产生中断信号,并向debug中断程序发送所述中断信号;

所述机器状态寄存器接收到所述中断信号后更改状态标志位,同时所述调试控制寄存器接收到所述中断信号后更改复用标志位。

所述的定位内存非法改写的方法,其中,所述修改程序计数器地址,所述中央处理器自动执行debug中断程序,并通过函数调用栈定位内存被改写的位置具体包括:

所述中央处理器修改所述程序计算器地址为debug中断程序地址;

所述debug中断程序响应所述中断信号,调用预设的函数调用栈定位内存被改写的位置,并输出所述内存被改写的位置。

所述的定位内存非法改写的方法,其中,所述修改程序计数器地址,所述中央处理器自动执行debug中断程序,并通过函数调用栈定位内存被改写的位置之后还包括:

通过反汇编系统当前运行的程序,利用所述函数调用栈搜索所述内存被改写的位置对应的函数,实现复位系统。

所述的定位内存非法改写的方法,其中,所述定位内存非法改写的方法应用于VxWorks操作系统或Linux操作系统。

本发明还提供一种定位内存非法改写的系统,所述系统包括中央处理器以及与所述中央处理器连接的存储器,所述中央处理器包括机器状态寄存器以及调试控制寄存器,所述系统执行时用于实现上述所述定位内存非法改写的方法。

本发明还提供一种存储介质,所述存储介质存储有定位内存非法改写程序,所述定位内存非法改写程序被中央处理器执行时用于上述所述定位内存非法改写的方法。

本发明公开了一种定位内存非法改写的方法、系统及存储介质,所述方法包括:监测内存是否被访问;当监测到内存被访问时,触发中央处理器使能debug中断;修改程序计数器地址,所述中央处理器自动执行debug中断程序,并通过函数调用栈定位内存被改写的位置。本发明通过自编译的函数调用栈以及中央处理器提供的debug功能自动定位内存被非法改写的所在行数据,不仅可以实现复位系统,提高安全性,还无需增加人工成本,节约资源,方便用户。

附图说明

图1是当前运行程序所组成的各个段地址的分布图。

图2是本发明定位内存非法改写的方法的第一较佳实施例的流程图。

图3是本发明定位内存非法改写的方法的具体实施例的流程图。

图4是本发明定位内存非法改写系统的结构框图。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

请参阅图1,图1是当前运行程序(即进程)所组成的各个段地址分布图,如图1所示,进程由各种段组成,包括堆栈段、BSS段、数据段以及文本段,进程的地址在内存末端对应的是未映射区域,其中,所述数据段存放有初始值的全局变量,即经过初始化的数据,所述BSS段用于标志起始、存放未初始化的全局变量,所述文本段用于存放中央处理器(CPU)要运行的指令。通常内存受写保护,因此,只要被监控的内存进行写指令访问操作时,则破坏了内存代码段的写保护,基于此原理,本发明通过监测到内存被执行写操作时,触发debug功能,使得当前访问的指令被中断,并且自动精准定位被改写的位置,进行快速复位,以提高安全。

为了更好理解本发明,下面采用一具体实施例加以说明,如实施一所述。

实施例一

请参阅图2,图2是本发明定位内存非法改写的方法的第一较佳实施例的流程图。如图2所示,所述定位内存非法改写的方法包括以下步骤:

步骤S100,监测内存是否被访问。

本发明实施例中,在步骤S100之前,在系统数据库中预先编译用于触发debug中断时被调用的函数调用栈,并进行存储在内存中。同时,在中央处理器中设置用于监控内存的机器状态寄存器(Model Specific Register,用MSR表示)以及调试控制寄存器(Debug Control Register ,用DBCR表示),并进行初始化。此时,初始化后的机器状态寄存器的DE标志位的值为0,调试控制寄存器的IDM标志位的值为0。其中,MSR 是用于设置CPU 的工作环境和标示CPU 的工作状态,DE标志位的值为0,表示CPU未开启监控功能,DE标志位的值为1,表示CPU开启了监控功能; DBCR用于根据不同的控制信号控制嵌入式系统实现不同功能的调试,IDM标志位的值为1时表示暂停当前的指令进入调试状态,IDM标志位的值为0时表示继续当前指令,不进入调试状态。

本实施例中,上述函数调用栈的程序代码是需要预先编译形成汇编语言,具体如下所示:

/*设置内存地址监控功能*/

void sysSetDebugEnable(int enable, UINT32 addr)

{

int msr;

int dbcr0;

msr = sysGetMSR();

dbcr0 = sysGetDBCR0();

if (enable)

{

msr |= 0x00000200; /*bit 54 DEBUG ENABLE*/

dbcr0 |= 0x40040000;

sysSetMSR(msr);

sysSetDBCR0(dbcr0);

sysSetDAC1(addr);

}

else

{

msr &= ~0x00000200; /*bit 54 DEBUG ENABLE*/

dbcr0 &= ~0x40040000;

sysSetMSR(msr);

sysSetDBCR0(dbcr0);

}

return;

}

*-----------------------------------------------------------------------------

函数名称 : sysSetMSR();

功能 : 设置机器状态寄存器的值

输入参数 : 无.

输出参数 : 无.

返回值 : 无

函数调用说明: _U32 sysSetMSR( void );

MSR (Machine Status Register)

典型使用示例:

-----------------------------------------------------------------------------*/

.align 2

.globl sysSetMSR

sysSetMSR:

mtmsr r3

isync

blr

/*-----------------------------------------------------------------------------

函数名称 : sysSetDBCR0();

功能 : 设置Debug Control Register 0 的值

输入参数 : 无.

输出参数 : 无.

返回值 : 无

函数调用说明: _U32 sysSetDBCR0( void );

DBCR (Debug Control Register)

典型使用示例:

-----------------------------------------------------------------------------*/

.align 2

.globl sysSetDBCR0

sysSetDBCR0:

mtspr DBCR0, r3 /* 308 Debug control register 0 */

blr

.align 2

.globl sysSetDAC1

sysSetDAC1:

mtspr DAC1, r3/* 316 Data Address Compare Register 1*/

blr

.align 2

.globl sysSetDAC2

sysSetDAC2:

mtspr DAC2, r3 /* Data Address Compare Register 2*/

blr

在步骤S100具体实施时,当前程序运行时,内存为当前运行的程序分配地址空间,创建堆栈区等,所述当前运行的程序中的文本段即代码段,存储有访问内存的指令操作,可以是写指令操作,读指令操作,或读写指令操作。此时,启动中央处理器监控功能,修改机器状态寄存器的DE的值为1,并将当前运行程序的代码段的起始地址写入至所述机器状态寄存器,将当前运行程序的代码段的结束地址写入至所述调试控制寄存器

所述中央处理器监测内存是否被写访问,即是否执行写指令操作。

步骤S200,当监测到内存被访问时,触发中央处理器使能debug中断。

在本发明实施例中,当所述中央处理器监测到内存被执行写访问时,则触发所述中央处理器产生中断信号,同时挂载所述debug中断程序。

此时,所述中央处理器中的所述调试控制寄存器接收到所述中断信号后更改复用标志位IMR的值为1。所述中央处理器向debug中断程序发送所述中断信号以执行debug中断功能。

步骤S300,修改程序计数器地址,所述中央处理器自动执行debug中断程序,并通过函数调用栈定位内存被改写的位置。

即步骤S300具体包括:

步骤S301,所述中央处理器修改所述程序计算器地址为debug中断程序地址;

步骤S302,所述debug中断程序响应所述中断信号,调用预设的函数调用栈定位内存被改写的位置,并输出所述内存被改写的位置。

具体地,当访问内存的指令包含有写指令操作(写指令或读写指令),也就是,将要执行改写代码段的操作时,根据中央处理器的监控功能,会立即触发中央处理器产生中断信号,使能debug功能,将程序计数器(Programme Counter, PC)地址修改为debug中断程序地址,与此同时,触发启动debug中断程序(即中断向量,用0x1000表示)响应所述中断信号。

因此,一旦触发debug中断,则调用预设的函数调用栈定位内存被改写的位置,即确定内存哪一行执行了非法的写操作,作为后续修复的参考依据。

在步骤S300之后,软件开发人员还可以通过反汇编系统当前运行的程序,利用所述函数调用栈搜索所述内存被改写的位置对应的函数,来实现复位系统

当然,若访问指令仅仅只是读取指令或其他非写指令,则不产生debug中断,也不会被中央处理器监控功能监测到,可继续执行当前访问指令。

需要说明的是,本发明应用于VxWorks操作系统或Linux操作系统。

为了更进一步理解本发明的上述步骤S100-S300,用一具体实施例加以说明,如下图3所示。图3是本发明定位内存非法改写的方法的具体实施例的流程图。

步骤S101,设置中央处理器的监控功能,即启动代码段写保护,然后执行步骤S102;

步骤S102,监测内存是否被写访问,若是,执行步骤S103,若否,执行步骤S106;

步骤S103,中央处理器触发debug中断,修改PC地址为debug中断程序地址,此时,所述中央处理器自动执行debug中断程序,然后执行步骤S104;

步骤S104,调用预设的函数调用栈定位内存被改写的位置,然后执行步骤S105。

步骤S105,输出内存被改写的位置,并根据所述内存被改写的位置,复位系统。

步骤S106,继续执行当前访问指令。

当然,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过定位内存非法改写程序来指令相关硬件(如中央处理器,控制器等)来完成,所述的程序可存储于一计算机可读取的存储介质中,该程序在执行时可包括如定位内存非法改写的方法实施例的流程。其中所述的存储介质可为存储器、磁碟、光盘等。

实施例二

本发明实施例还提供了一种定位内存非法改写的系统,图4 示例了所述定位内存非法改写的系统的结构框图,如图4所示,所述系统包括中央处理器100以及与所述中央处理器100连接的存储器200,其中,所述中央处理器100包括机器状态寄存器10以及调试控制寄存器20, 所述存储器200存储有定位内存非法改写程序。

所述中央处理器100(Central Processing Unit, CPU),在一些实施例中,还可以是,微处理器或其他数据处理芯片,用于运行所述存储器200中存储的程序代码或处理数据,例如执行定位内存非法改写程序等

更进一步地,所述定位内存非法改写系统执行时用于实现上述所述定位内存非法改写的方法步骤,具体如实施例一所述。

实施例三

一种存储介质,所述存储介质存储有定位内存非法改写程序,所述定位内存非法改写程序被中央处理器100执行上述定位内存非法改写的方法;具体如上所述。

综上所述,本发明公开了一种定位内存非法改写的方法、系统及存储介质,所述方法包括:监测内存是否被访问;当监测到内存被访问时,触发中央处理器使能debug中断;修改程序计数器地址,所述中央处理器自动执行debug中断程序,并通过函数调用栈定位内存被改写的位置。本发明通过自编译的函数调用栈以及中央处理器提供的debug功能自动定位内存被非法改写的所在行数据,不仅可以实现复位系统,提高安全性,还无需增加人工成本,节约资源,方便用户。

应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1