CN109189671A - 逐层夹逼式变量定位方法、系统及终端设备 - Google Patents
逐层夹逼式变量定位方法、系统及终端设备 Download PDFInfo
- Publication number
- CN109189671A CN109189671A CN201810911787.5A CN201810911787A CN109189671A CN 109189671 A CN109189671 A CN 109189671A CN 201810911787 A CN201810911787 A CN 201810911787A CN 109189671 A CN109189671 A CN 109189671A
- Authority
- CN
- China
- Prior art keywords
- variable
- target variable
- tampered
- function
- global
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
Abstract
本发明适用于软件安全技术领域,提供一种逐层夹逼式变量定位方法、系统及终端设备。本发明实施例通过利用指针变量的穿透式访问特性、构建用于定位程序中被篡改的目标变量的监控调试函数,针对目标变量所在的多层代码路径逐层深入地调用监控调试函数,并在实施逐次修订后重新运行程序,重现所述程序的目标变量被篡改的过程,输出调试位置信息来定位目标变量被篡改的位置,最终可准确定位变量被篡改的具体位置,并且监控调试函数的实现和调用过程简单,易于实现。
Description
技术领域
本发明属于软件安全技术领域,尤其涉及一种逐层夹逼式变量定位方法、系统及终端设备。
背景技术
在操作系统的底层软件和应用软件的开发调试或运行过程中,容易出现由于内存溢出而引起变量被篡改,而导致发生软件异常或死机的情况,只有准确地定位出变量被篡改的确切位置,才能彻底解决该问题。
然而,篡改之后的变量对应的指令被执行后,只有在后续访问到该变量时软件才会表现出异常,而此时往往又已运行非常多的指令。也就是说,从变量被篡改到软件表现出异常现象,可能已运行相当长的一段指令路径且该路径中可能存在复杂的多层次过程调用,并且过程调用中的代码可能较繁杂。仅通过单纯的人工检查手段来检查变量被篡改的代码位置较为困难,难以准确定位变量被篡改的位置。
发明内容
有鉴于此,本发明实施例提供了一种逐层夹逼式变量定位方法、系统及终端设备,以解决现有技术中仅通过单纯的人工检查手段来检查变量被篡改的代码位置较为困难、难以准确定位变量被篡改位置的问题。
本发明实施例的第一方面提供了一种逐层夹逼式变量定位方法,其特征在于,包括:
针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改;
重新运行所述程序,以重现所述程序的目标变量被篡改的过程;
运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息;其中,所述全局指针用于指向所述目标变量,所述全局变量用于备份保存所述目标变量的原始值;
根据所述至少一个调试位置信息,定位所述目标变量被篡改的位置;
若所述目标变量被篡改的位置位于自定义函数且包括子函数,则针对所述目标变量的下一层代码路径多次调用监控调试函数,如此循环往复,直到所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数时为止。
本发明实施例的第二方面提供了一种逐层夹逼式变量定位系统,其包括:
监控调试函数调用模块,用于针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改;
程序运行模块,用于重新运行所述程序,以重现所述程序的目标变量被篡改的过程;
调试位置信息输出模块,用于运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息;其中,所述全局指针用于指向所述目标变量,所述全局变量用于备份保存所述目标变量的原始值;
定位模块,用于根据所述至少一个调试位置信息,定位所述目标变量被篡改的位置;
所述监控调试函数调用模块,还用于若所述目标变量被篡改的位置位于自定义函数且包括子函数,则针对所述目标变量的下一层代码路径多次调用监控调试函数,如此循环往复,直到所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数时为止。
本发明实施例的第三方面提供了一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。
本发明实施例的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。
本发明实施例通过利用指针变量的穿透式访问特性、构建用于定位程序中被篡改的目标变量的监控调试函数,针对目标变量所在的多层代码路径逐层深入的地调用监控调试函数,并在实施逐次修订后重新运行程序,重现所述程序的目标变量被篡改的过程,输出调试位置信息来定位目标变量被篡改的位置,最终可准确定位变量被篡改的具体位置,并且监控调试函数的实现和调用过程简单,易于实现。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一提供的逐层夹逼式变量定位方法的流程示意图;
图2和图3是本发明实施例二提供的逐层夹逼式变量定位方法的流程示意图;
图4是本发明实施例三提供的逐层夹逼式变量定位方法的流程示意图;
图5是本发明实施例四提供的逐层夹逼式变量定位系统的结构示意图;
图6是本发明实施例五提供的终端设备的结构示意图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本发明实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。
为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。
实施例一
本实施例提供一种逐层夹逼式变量定位方法,应用于任意的可运行操作系统和软件程序的终端设备(例如,手机、平板电脑、个人数字助理、笔记本电脑、智能手环等移动终端,PC(Personal Computer)客户端,测试设备,智能家居设备等),主要用于准确地定位软件程序中被篡改的变量的具体位置。
在具体应用中,变量被篡改的问题通常由内存溢出引起。
在一个实施例中,终端设备可运行的操作系统包括嵌入式系统(Embeddedsystem)。
如图1所示,本实施例提供的逐层夹逼式变量定位方法,包括:
步骤S100,定义指向目标变量的全局指针和用于备份保存所述目标变量的原始值的全局变量,在所述目标变量被赋予原始值的代码处,将所述全局指针指向所述目标变量,并将所述目标变量的原始值复制到所述备份变量中。
步骤S101,针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改。
在本实施例中,目标变量是指程序中被篡改的变量,本实施例中将该被篡改的变量定义为目标变量以利于区分。监控调试函数为自定义函数,用于插入目标变量所在的代码中,以定位目标变量的位置。
步骤S102,重新运行所述程序,以重现所述程序的目标变量被篡改的过程。
在具体应用中,调用监控调试函数之后即重新运行目标函数所在的程序,重现目标变量被篡改的过程,以通过监控调试函数找出目标变量被篡改的位置。
步骤S103,运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息。
在具体应用中,重新运行程序的过程中,也会运行监控调试函数,监控调试函数检测到目标变量被篡改时,即输出包含目标变量被篡改的位置的至少一个调试位置信息。
步骤S104,根据所述至少一个调试位置信息,定位所述目标变量被篡改的位置。
在具体应用中,可通过人工检查监控调试函数运行之后输出的调试位置信息,查找出目标变量被篡改的具体代码位置,实现对目标变量被篡改的位置的定位,也可以通过自定义的位置定位程序自动查找出目标变量被篡改的具体代码位置,实现对目标变量被篡改的位置的定位。本实施例中即采用自定义的位置定位程序自动查找出目标变量被篡改的具体代码位置。
在具体应用中,所述调试位置信息至少包括但不限于调试代码所在的子函数的名称、代码行号、唯一位置标识字符串、所述目标变量的原始值和所述目标变量被篡改之后的值。
步骤S105,若所述目标变量被篡改的位置位于自定义函数且包括子函数,则针对所述目标变量的下一层代码路径多次调用监控调试函数,如此循环往复,直到所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数时为止。
在具体应用中,当首次针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,并进行相关定位操作之后定位出目标变量所在位置之后,若目标变量被篡改的位置位于自定义函数且包括自定义的子函数,则需要针对程序中目标变量所在的第二层代码路径多次调用监控调试函数,并进行相关定位操作,如此逐层递进的针对更深层次的代码路径调用监控函数,逐步对目标变量被篡改的位置进行逐层夹逼定位,从而可以精确地定位到目标变量被篡改的最底层函数位置。
在一个实施例中,步骤S104之后还包括:
若所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数,则根据所述目标变量所在的自定义函数或库函数所提供的功能分析和判断所述目标变量被篡改的原因。
在具体应用中,由于库函数一般不提供源码,故无法继续跟踪到库函数里面和在里面插入调试代码,这样,结合库函数提供的功能来分析对它的调用代码,可以判断出目标变量被篡改的最终原因并结束定位。对应的,自定义函数不包括子函数时,无需进入更深层次的函数里插入调试代码,这样,结合自定义函数提供的功能来分析对它的调用代码,可以判断出目标变量被篡改的最终原因并结束定位。
本实施例通过利用指针变量的穿透式访问特性、构建用于定位程序中被篡改的目标变量的监控调试函数,针对目标变量所在的多层代码路径逐层深入地调用监控调试函数,并在逐次修订后均重新运行程序,重现所述程序的目标变量被篡改的过程,输出调试位置信息来定位目标变量被篡改的位置,最终可准确定位变量被篡改的具体位置,并且监控调试函数的实现和调用过程简单,易于实现。
实施例二
如图2所示,在本实施例中,实施例一中的步骤S100包括:
步骤S201,定义全局指针;其中,所述全局指针与所述目标变量类型相同。
在具体应用中,通过定义一个全局的用于指向目标变量的指针,可以实现对目标变量的跟踪。
步骤S202,定义全局变量;其中,所述全局变量与所述目标变量类型相同。
在具体应用中,通过定义一个用于备份目标变量的原始值的全局变量,可以实现对目标变量的当前值的跟踪监控,以通过全局变量判断目标变量的当前值是否发生改变,当目标变量的当前值不等于其原始值时,即判定目标变量被篡改。
在具体应用中,目标变量的类型可以是目标变量所属的程序所采用的编写语言中的任意类型,程序的编写语言可以为C语言、汇编语言等,相应的,目标变量的类型可以是C语言中的整型、字符型、数组、结构等类型。目标变量的作用域可以是全局的,也可以是静态或局部的。
在一个实施例中,当程序采用C语言编写、目标变量的类型为整型数时,全局指针和全局变量采用C语言定义如下:
int*pDestination;//指向目标变量起始地址的指针
int DestinationOrigin;//用于保存目标变量原始值的变量
步骤S203,在所述目标变量的原始赋值代码之后,插入针对所述全局指针的初始化语句,以使所述全局指针指向所述目标变量;
步骤S204,在针对所述全局指针的初始化语句之后,插入所述全局变量的赋值语句,以使所述全局变量的值等于所述目标变量的原始值。
在一个实施例中,当程序采用C语言编写、目标变量的类型为整型数时,步骤S201-S204对应的C语言代码如下:
int*pDestination;//指向目标变量起始地址的指针
int DestinationOrigin;//用于保存目标变量原始值的变量
void demo_func(void)
{
char mem_buf[10];
int count;//目标变量
…
count=100;//目标变量的原始赋值处
pDestination=&count;//初始化指针,使之指向目标变量
DestinationOrigin=count;//保存目标变量原始值到备份变量中
…
}
如图3所示,在本实施例中,基于图2所示的方法步骤,实施例一中的步骤S103包括:
步骤S301,启动并运行所述监控调试函数;
步骤S302,读取所述全局指针所指示的所述目标变量的当前值;
步骤S303,读取所述全局变量所述备份保存的所述目标变量的原始值;
步骤S304,比较所述目标变量的当前值与所述目标变量的原始值是否相等;
步骤S305,若所述目标变量的当前值与所述目标变量的原始值不相等,则输出至少一个调试位置信息;
步骤S306,若所述目标变量的当前值与所述目标变量的原始值相等,则结束所述监控调试函数。
在具体应用中,在监控调试函数被调用的过程中,会将目标变量的当前值与全局变量所备份的原始值进行比较,一旦发现二者不一致,就输出调试位置信息。
在具体应用中,当目标变量的当前值与目标变量的原始值相等,则说明目标变量没有被篡改,可以直接结束调用过程。
本实施例通过定义一个全局指针和一个全局变量,可以实现对目标变量及其当前值的跟踪监控,以利用判断目标变量是否被篡改。
实施例三
如图4所示,在本实施例中,基于实施例一或二中的方法步骤,步骤S101包括:
步骤S1011,在所述目标变量的第一层代码路径中的至少一处位置插入调试代码,如此对所述第一层代码路径进行修订,并重新编译所述调试代码后运行;
其中,所述至少一处位置包括子函数调用位置之前或之后、可疑代码行之前或之后,所述监控调试函数带有入口参数,所述入口参数至少包括唯一位置标识字符串,所述唯一位置标识字符串用于标识插入所述调试代码的位置。
在具体应用中,从目标变量的原始赋值到发现目标变量被篡改的第一层代码路径中的至少一处,以夹逼的方式插入调试代码,即:对该目标变量进行监控的过程调用。对于任意层的代码路径,插入调试代码的至少一处位置包括与目标变量相关的子函数调用位置之前或之后、可疑代码行之前或之后。
在具体应用中,被调用的过程是一个带有入口参数的监控调试函数,入口参数至少包括:唯一位置标识字符串。唯一位置标识字符串用于唯一的标识出插入调试代码的位置,以便于后续对目标函数被篡改位置的准确定位。
在一个实施例中,在第一层代码路径中插入过程调用的程序代码示例如下:
volatile int*pDestination;//指向目标变量起始地址的指针
int DestinationOrigin;//用于保存目标变量原始值的变量
void demo_func(void)
{
char mem_buf[10];
int count;//目标变量
…
count=100;
pDestination=&count;//初始化指针,使之指向目标变量
DestinationOrigin=count;//保存目标变量原始值到备份变量中
…
check_destination_value(”L1”);//子函数前插入对目标变量进行监控的过程调用
sub_func1(mem_buf);
check_destination_value(”L2”);//子函数后插入对目标变量进行监控的过程调用
…
check_destination_value(”L3”);//子函数前插入对目标变量进行监控的过程调用
sub_func2();
check_destination_value(”L4”);//子函数后插入对目标变量进行监控的过程调用
…
check_destination_value(”L5”);//子函数前插入对目标变量进行监控的过程调用
sub_func3(mem_buf);
check_destination_value(”L6”);//子函数后插入对目标变量进行监控的过程调用
printf(“Current count:%d”,count);//此处发现目标变量被篡改
…
}
在一个实施例中,实现监控调试函数的程序代码示例如下:
void check_destination_value(const char*prompt_str)
//--prompt_str,用于传入唯一位置标识字符串,便于定位出问题代码
{
//--将目标变量的当前值与原始值进行比较,若不一致则输出调试位置信息
if(*pDestination!=DestinationOrigin)
{
printf(“Location ID:%s.\n”,prompt_str);
printf(“Mismatched,origin:%d,current:%d.\n”,
DestinationOrigin,*pDestination);
}
}
在一个实施例中,若上述在第一层代码路径中插入过程调用的程序代码和监控调试函数的程序代码运行后,输出的第一调试位置信息如下:
Location ID:L6.
Mismatched,origin:100,current:0.
则可以根据上述第一调试位置信息,确定第一条调试位置信息是下述的最后一行所输出:
check_destination_value(”L5”);//子函数前插入对目标变量进行监控的过程调用
sub_func3(mem_buf);
check_destination_value(”L6”);//子函数后插入对目标变量进行监控的过程调用
由此可以初步定位出目标变量被篡改的位置位于sub_func3所在的一行。
如图4所示,基于实施例一或二,在本实施例中,步骤S104之后包括:
步骤S106,若所述子函数为库函数,则根据所述子函数所提供的功能分析和判断所述目标变量被篡改的原因。
在具体应用中,如果定位出的目标变量被篡改的子函数是系统提供的库函数(通常库函数本身无缺陷),由于库函数一般不提供源码,故无法继续跟踪到库函数里面和在里面插入调试代码,这样,结合该子函数提供的功能来分析对它的调用代码,可以判断出目标变量被篡改的最终原因并结束定位。
在一个实施例中,目标变量被篡改的子函数是系统提供的库函数时,调用库函数出错的程序代码示例如下:
char mem_buf[10];
int count;//目标变量
…
check_destination_value(”L5”);//子函数前插入对目标变量进行监控的过程调用
strcpy(mem_buf,”1234567890”);//调用库函数strcpy(),串结尾符0溢出,覆盖变量count
check_destination_value(”L6”);//子函数后插入对目标变量进行监控的过程调用
在一个实施例中,基于实施例一或二,步骤S105包括:
步骤S1051,若所述目标变量被篡改的位置位于自定义函数且包括自定义的子函数,则在所述目标变量的下一层代码路径中的至少一处位置插入调试代码。
在具体应用中,在目标变量被篡改的子函数中插入调试代码的插入原则与在第一层代码路径中插入调试代码的原理相同,同理,在任意代码路径中插入调试代码的原理均与上述原理相同。
在一个实施例中,当定位到目标变量被篡改的位置位于sub_func3()函数)时,在第二层代码路径中插入过程调用的程序代码示例如下:
void sub_func3(char*buf)
{
…
check_destination_value(”L11”);//子函数前插入对目标变量进行监控的过程调用
sub_func11(buf);
check_destination_value(”L12”);//子函数后插入对目标变量进行监控的过程调用
…
check_destination_value(”L13”);//子函数前插入对目标变量进行监控的过程调用
strcpy(buf,”1234567890”);
check_destination_value(”L14”);//子函数后插入对目标变量进行监控的过程调用
…
check_destination_value(”L15”);//子函数前插入对目标变量进行监控的过程调用
sub_func13(buf);
check_destination_value(”L16”);//子函数后插入对目标变量进行监控的过程调用
…
}
在具体应用中,在sub_func3()函数中,定位到strcpy()一行是目标变量被篡改的位置,此处发生的内存溢出(串结尾符0溢出)就是问题的源头。即下述程序代码中的strcpy(buf,”1234567890”)所在位置:
void sub_func3(char*buf)
{
…
check_destination_value(”L13”);//子函数前插入对目标变量进行监控的过程调用
strcpy(buf,”1234567890”);//串结尾符0超出了buf的实际空间
check_destination_value(”L14”);//子函数后插入对目标变量进行监控的过程调用
…
}
本实施例通过采用逐层夹逼的方式在自定义函数的子函数中逐层插入调试代码,层层深入,可实现对目标变量被篡改位置的精确定位。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
实施例四
如图5所示,本实施例提供一种逐层夹逼式变量定位系统5,用于执行上述方法实施例中的方法步骤,该系统可以是任意的可运行操作系统和软件程序的终端设备中的软件程序系统,其包括:
定义模块500,用于定义指向目标变量的全局指针和用于备份保存所述目标变量的原始值的全局变量,在所述目标变量被赋予原始值的代码处,将所述全局指针指向所述目标变量,并将所述目标变量的原始值复制到所述备份变量中;
监控调试函数调用模块501,用于针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改;
程序运行模块502,用于重新运行所述程序,以重现所述程序的目标变量被篡改的过程;
调试位置信息输出模块503,用于运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息;其中,所述全局指针用于指向所述目标变量,所述全局变量用于备份保存所述目标变量的原始值;
定位模块504,用于根据所述至少一个调试位置信息,定位所述目标变量被篡改的位置;
所述监控调试函数调用模块501,还用于若所述目标变量被篡改的位置位于自定义函数且包括子函数,则针对所述目标变量的下一层代码路径多次调用监控调试函数,如此循环往复,直到所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数时为止。
在一个实施例中,所述定义模块包括:
第一定义单元,用于定义全局指针;其中,所述全局指针与所述目标变量类型相同;
第二定义单元,用于定义全局变量;其中,所述全局变量与所述目标变量类型相同;
所述第一定义单元还用于在所述目标变量的原始赋值代码之后,插入针对所述全局指针的初始化语句,以使所述全局指针指向所述目标变量;
所述第二定义单元还用于在针对所述全局指针的初始化语句之后,插入所述全局变量的赋值语句,以使所述全局变量的值等于所述目标变量的原始值。
在一个实施例中,所述程序运行模块具体用于:
启动并运行所述监控调试函数;
读取所述全局指针所指示的所述目标变量的当前值;
读取所述全局变量所述备份保存的所述目标变量的原始值;
比较所述目标变量的当前值与所述目标变量的原始值是否相等;
若所述目标变量的当前值与所述目标变量的原始值不相等,则输出至少一个调试位置信息;
输出至少一个调试位置信息之后或所述目标变量的当前值与所述目标变量的原始值相等,则结束所述监控调试函数。
在一个实施例中,所述监控调试函数调用模块具体用于:
在所述目标变量的第一层代码路径中的至少一处位置插入调试代码,如此对所述第一层代码路径进行修订,并重新编译所述调试代码后运行;
其中,所述至少一处位置包括子函数调用位置之前或之后、可疑代码行之前或之后,所述监控调试函数带有入口参数,所述入口参数至少包括唯一位置标识字符串,所述唯一位置标识字符串用于标识插入所述调试代码的位置。
在一个实施例中,所述系统还包括:
分析判断模块,用于若所述子函数为库函数,则根据所述子函数所提供的功能分析和判断所述目标变量被篡改的原因。
本实施例通过利用指针变量的穿透式访问特性、构建用于定位程序中被篡改的目标变量的监控调试函数,针对目标变量所在的多层代码路径逐层深入的地调用监控调试函数,并在逐次修订后重新运行程序,重现所述程序的目标变量被篡改的过程,输出调试位置信息来定位目标变量被篡改的位置,最终可准确定位变量被篡改的具体位置,并且监控调试函数的实现和调用过程简单,易于实现。
实施例五
如图6所示,本实施例提供一种终端设备6,其包括:处理器60、存储器61以及存储在所述存储器61中并可在所述处理器60上运行的计算机程序62,例如逐层夹逼式变量定位程序。所述处理器60执行所述计算机程序62时实现上述各个逐层夹逼式变量定位方法实施例中的步骤,例如图1所示的步骤S100至S105。或者,所述处理器60执行所述计算机程序62时实现上述各装置实施例中各模块的功能,例如图5所示模块500至504的功能。
示例性的,所述计算机程序62可以被分割成一个或多个模块,所述一个或者多个模块被存储在所述存储器61中,并由所述处理器60执行,以完成本发明。所述一个或多个模块可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序62在所述终端设备6中的执行过程。例如,所述计算机程序62可以被分割成监控调试函数调用模块,定义模块,程序运行模块,调试位置信息输出模块,定位模块,各模块具体功能如下:
定义模块,用于定义指向目标变量的全局指针和用于备份保存所述目标变量的原始值的全局变量,在所述目标变量被赋予原始值的代码处,将所述全局指针指向所述目标变量,并将所述目标变量的原始值复制到所述备份变量中;
监控调试函数调用模块,用于针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改;
程序运行模块,用于重新运行所述程序,以重现所述程序的目标变量被篡改的过程;
调试位置信息输出模块,用于运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息;其中,所述全局指针用于指向所述目标变量,所述全局变量用于备份保存所述目标变量的原始值;
定位模块,用于根据所述至少一个调试位置信息,定位所述目标变量被篡改的位置;
所述监控调试函数调用模块,还用于若所述目标变量被篡改的位置位于自定义函数且包括子函数,则针对所述目标变量的下一层代码路径多次调用监控调试函数,如此循环往复,直到所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数时为止。
所述终端设备6可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述终端设备可包括,但不仅限于,处理器60、存储器61。本领域技术人员可以理解,图6仅仅是终端设备6的示例,并不构成对终端设备6的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述终端设备还可以包括输入输出设备、网络接入设备、总线等。
所称处理器60可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器61可以是所述终端设备6的内部存储单元,例如终端设备6的硬盘或内存。所述存储器61也可以是所述终端设备6的外部存储设备,例如所述终端设备6上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,所述存储器61还可以既包括所述终端设备6的内部存储单元也包括外部存储设备。所述存储器61用于存储所述计算机程序以及所述终端设备所需的其他程序和数据。所述存储器61还可以用于暂时地存储已经输出或者将要输出的数据。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
在本发明所提供的实施例中,应该理解到,所揭露的装置/终端设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/终端设备实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的模块如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括是电载波信号和电信信号。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。
Claims (10)
1.一种逐层夹逼式变量定位方法,其特征在于,包括:
针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改;
重新运行所述程序,以重现所述程序的目标变量被篡改的过程;
运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息;其中,所述全局指针用于指向所述目标变量,所述全局变量用于备份保存所述目标变量的原始值;
根据所述至少一个调试位置信息,定位所述目标变量被篡改的位置;
若所述目标变量被篡改的位置位于自定义函数且包括子函数,则针对所述目标变量的下一层代码路径多次调用监控调试函数,如此循环往复,直到所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数时为止。
2.如权利要求1所述的逐层夹逼式变量定位方法,其特征在于,针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改之前,包括:
定义全局指针;其中,所述全局指针与所述目标变量类型相同;
定义全局变量;其中,所述全局变量与所述目标变量类型相同;
在所述目标变量的原始赋值代码之后,插入针对所述全局指针的初始化语句,以使所述全局指针指向所述目标变量;
在针对所述全局指针的初始化语句之后,插入所述全局变量的赋值语句,以使所述全局变量的值等于所述目标变量的原始值。
3.如权利要求2所述的逐层夹逼式变量定位方法,其特征在于,运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息,包括:
启动并运行所述监控调试函数;
读取所述全局指针所指示的所述目标变量的当前值;
读取所述全局变量所述备份保存的所述目标变量的原始值;
比较所述目标变量的当前值与所述目标变量的原始值是否相等;
若所述目标变量的当前值与所述目标变量的原始值不相等,则输出至少一个调试位置信息;
若所述目标变量的当前值与所述目标变量的原始值相等,则结束所述监控调试函数。
4.如权利要求1至3任一项所述的逐层夹逼式变量定位方法,其特征在于,针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改,包括:
在所述目标变量的第一层代码路径中的至少一处位置插入调试代码,如此对所述第一层代码路径进行修订,并重新编译所述调试代码后运行;
其中,所述至少一处位置包括子函数调用位置之前或之后、可疑代码行之前或之后,所述监控调试函数带有入口参数,所述入口参数至少包括唯一位置标识字符串,所述唯一位置标识字符串用于标识插入所述调试代码的位置。
5.如权利要求4所述的逐层夹逼式变量定位方法,其特征在于,所述方法还包括:
若所述子函数为库函数,则根据所述子函数所提供的功能分析和判断所述目标变量被篡改的原因。
6.如权利要求4所述的逐层夹逼式变量定位方法,其特征在于,所述调试位置信息至少包括调试代码所在的子函数的名称、代码行号、唯一位置标识字符串、所述目标变量的原始值和所述目标变量被篡改之后的值。
7.一种逐层夹逼式变量定位系统,其特征在于,包括:
监控调试函数调用模块,用于针对程序中目标变量所在的第一层代码路径多次调用监控调试函数,如此修订所述第一层代码路径,以探测目标变量是否被篡改;
程序运行模块,用于重新运行所述程序,以重现所述程序的目标变量被篡改的过程;
调试位置信息输出模块,用于运行所述监控调试函数,以根据全局指针和全局变量输出至少一个调试位置信息;其中,所述全局指针用于指向所述目标变量,所述全局变量用于备份保存所述目标变量的原始值;
定位模块,用于根据所述至少一个调试位置信息,定位所述目标变量被篡改的位置;
所述监控调试函数调用模块,还用于若所述目标变量被篡改的位置位于自定义函数且包括子函数,则针对所述目标变量的下一层代码路径多次调用监控调试函数,如此循环往复,直到所述自定义函数不包括子函数或所述目标变量被篡改的位置为库函数时为止。
8.如权利要求7所述的逐层夹逼式变量定位系统,其特征在于,还包括定义模块,所述定义模块包括:
第一定义单元,用于定义全局指针;其中,所述全局指针与所述目标变量类型相同;
第二定义单元,用于定义全局变量;其中,所述全局变量与所述目标变量类型相同;
所述第一定义单元还用于在所述目标变量的原始赋值代码之后,插入针对所述全局指针的初始化语句,以使所述全局指针指向所述目标变量;
所述第二定义单元还用于在针对所述全局指针的初始化语句之后,插入所述全局变量的赋值语句,以使所述全局变量的值等于所述目标变量的原始值。
9.一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述方法的步骤。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810911787.5A CN109189671B (zh) | 2018-08-10 | 2018-08-10 | 逐层夹逼式变量定位方法、系统及终端设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810911787.5A CN109189671B (zh) | 2018-08-10 | 2018-08-10 | 逐层夹逼式变量定位方法、系统及终端设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109189671A true CN109189671A (zh) | 2019-01-11 |
CN109189671B CN109189671B (zh) | 2022-02-11 |
Family
ID=64921120
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810911787.5A Active CN109189671B (zh) | 2018-08-10 | 2018-08-10 | 逐层夹逼式变量定位方法、系统及终端设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109189671B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110751272A (zh) * | 2019-10-30 | 2020-02-04 | 珠海格力电器股份有限公司 | 卷积神经网络模型中数据定位的方法、装置及存储介质 |
CN112596877A (zh) * | 2020-12-18 | 2021-04-02 | 深圳Tcl新技术有限公司 | 全局变量的使用方法、装置、系统以及计算机可读存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1949187A (zh) * | 2006-11-17 | 2007-04-18 | 深圳市领测科技有限公司 | 一种程序调测系统及方法 |
US20080168425A1 (en) * | 2007-01-05 | 2008-07-10 | Microsoft Corporation | Software testing techniques for stack-based environments |
CN101237350A (zh) * | 2008-02-27 | 2008-08-06 | 中兴通讯股份有限公司 | 用于多任务环境单板机的全局变量异常改写定位方法 |
CN104714885A (zh) * | 2015-02-13 | 2015-06-17 | 小米科技有限责任公司 | 栈溢出位置的检测方法及装置 |
CN106598837A (zh) * | 2015-10-20 | 2017-04-26 | 北京国双科技有限公司 | 一种代码调试方法及装置 |
CN106776208A (zh) * | 2016-12-02 | 2017-05-31 | 中国航天系统科学与工程研究院 | 一种软件运行时故障定位方法 |
-
2018
- 2018-08-10 CN CN201810911787.5A patent/CN109189671B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1949187A (zh) * | 2006-11-17 | 2007-04-18 | 深圳市领测科技有限公司 | 一种程序调测系统及方法 |
US20080168425A1 (en) * | 2007-01-05 | 2008-07-10 | Microsoft Corporation | Software testing techniques for stack-based environments |
CN101237350A (zh) * | 2008-02-27 | 2008-08-06 | 中兴通讯股份有限公司 | 用于多任务环境单板机的全局变量异常改写定位方法 |
CN104714885A (zh) * | 2015-02-13 | 2015-06-17 | 小米科技有限责任公司 | 栈溢出位置的检测方法及装置 |
CN106598837A (zh) * | 2015-10-20 | 2017-04-26 | 北京国双科技有限公司 | 一种代码调试方法及装置 |
CN106776208A (zh) * | 2016-12-02 | 2017-05-31 | 中国航天系统科学与工程研究院 | 一种软件运行时故障定位方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110751272A (zh) * | 2019-10-30 | 2020-02-04 | 珠海格力电器股份有限公司 | 卷积神经网络模型中数据定位的方法、装置及存储介质 |
CN112596877A (zh) * | 2020-12-18 | 2021-04-02 | 深圳Tcl新技术有限公司 | 全局变量的使用方法、装置、系统以及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109189671B (zh) | 2022-02-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Chow | Testing software design modeled by finite-state machines | |
Raza et al. | Bauhaus–a tool suite for program analysis and reverse engineering | |
Long et al. | Tool support for testing concurrent Java components | |
EP2975527A2 (en) | A method for tracing computer software | |
Haller et al. | Mempick: High-level data structure detection in c/c++ binaries | |
CN101853200A (zh) | 一种高效动态软件漏洞挖掘方法 | |
CN104462943A (zh) | 业务系统中非侵入式性能监控装置和方法 | |
US10846206B2 (en) | Adaptive software testing | |
US20080127119A1 (en) | Method and system for dynamic debugging of software | |
CN111045927A (zh) | 性能测试评估方法、装置、计算机设备及可读存储介质 | |
CN105808438A (zh) | 一种基于函数调用路径的测试用例复用方法 | |
Arcaini et al. | Combining model-based testing and runtime monitoring for program testing in the presence of nondeterminism | |
CN109189671A (zh) | 逐层夹逼式变量定位方法、系统及终端设备 | |
CN113590454A (zh) | 测试方法、装置、计算机设备和存储介质 | |
Belli et al. | Event-oriented, model-based GUI testing and reliability assessment—approach and case study | |
CN106502695A (zh) | 一种基于嵌入式软件开发方法 | |
JP6877215B2 (ja) | コンピュータ上のシミュレーション環境において制御装置の制御プログラムをテストする方法 | |
CN113127331B (zh) | 一种基于故障注入的测试方法、装置及计算机设备 | |
Valueian et al. | Constructing automated test oracle for low observable software | |
Khoroshilov et al. | Verification of Operating System Components | |
US9632912B1 (en) | Method and system for debugging a program | |
Yamamoto et al. | Towards static recovery of micro state transitions from legacy embedded code | |
Samara | A practical approach for detecting logical error in object oriented environment | |
CN113032260A (zh) | 基于组件化分布式系统的故障注入仿真测试方法及系统 | |
Kim et al. | Unit testing of flash memory device driver through a SAT-based model checker |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |