一种热点模块指令跟踪的方法及系统的制作方法

文档序号:9929466阅读:768来源:国知局
一种热点模块指令跟踪的方法及系统的制作方法
【技术领域】
[0001] 本发明涉及一种热点模块指令跟踪的方法及系统,属于软件分析技术领域。
【背景技术】
[0002] 调试器是自从计算机诞生时就存在的,期初的调试器都是基于硬件直接实现的, 调试器的工作原理是基于中央处理器的异常机制,并由操作系统的异常分发\事件分发的 子系统(或模块)负责将其封装处理后,以比较友好的方式与调试器进行实时交互,调试是 软件维护与错误修正的一个最重要、最直接,也是必不可少的一种机制。
[0003] 调试器最基本的功能包括控制软件运行,查看软件运行中信息,修改软件执行流 程。控制软件运行就是指,将一个飞速运行的程序中断下来,并且使其按照用户的意愿执 行,调试器是靠迫使目标程序触发一个精心构造的异常来完成这些工作的;查看软件运行 中信息,这些信息包含但不限于当前线程的寄存器信息,堆栈信息,内存信息,当前EIP(EIP 寄存器,用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次 CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加。)附近的反汇编信息等;修改软 件执行流程包括修改内存信息、反汇编信息、堆栈信息、寄存器信息等。
[0004] 普通的调试器无法对指定的内存页进行全指令追踪,单步跟踪可以较好的跟踪线 程指令,但仍然无法处理系统回调触发的指令执行,单步跟踪的性能开销同时也是非常大; 断点跟踪可以较好的解决性能开销,但是断点的设置开销非常大,并且同样无法处理系统 回调触发的指令执行,因此断点跟踪往往只用有限数量指令的跟踪。

【发明内容】

[0005] 针对上述现有技术问题,本发明的目的在于提供一种针对热点模块进行指令追踪 的方法,该方法能够动态的分析进程所访问的内存页,对被调试进程进行有效追踪查看,并 有效检测恶意代码对内存页的访问,同时在指令跟踪的完备性和性能开销上都有良好的表 现,被指定的热点模块可以是用户自己指定的文件所在的内存页。
[0006] 为了达到上述目的,本发明采用如下技术方案:
[0007] -种热点模块指令跟踪的方法,首先标志热点模块,即用户感兴趣的页;当线程访 问到用户感兴趣的页,那么将触发PAGE_GUARD (PAGE_GUARD标志指定了一个防护页(guar d page),即当一个页被提交时会因第一次被访问而产生一个one-shot异常,接着取得指定的 访问权限。)异常,从而触发调试器进行处理;然后通过调试器设置所有线程为单步调试,并 把该页的页号加入恢复链表,因为已经触发PAGE_GUARD异常的页会自动丢失PAGE_GUARD属 性,从而确保多线程环境和内核回调环境下指令跟踪的完备性;最后在当前执行线程中分 析执行指令的所在地址是否位于感兴趣的页,如果是,则继续单步调试,否则,那么就对该 线程不进行操作,并根据之前使用的链表重新设置感兴趣的页面的PAGE_GUARD属性。
[0008] -种热点模块指令跟踪的系统,包括以下模块:
[0009]调试循环模块:一个进程成为被调试进程之后,在完成了某些操作或者发生异常 时,它会发送通知给调试器,然后将自身挂起,直到调试器命令它继续执行;
[0010] 异常处理模块:通过异常的分发,对不同的异常事件进行处理,异常处理分离了接 收和处理错误代码,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中 出现的异常状况(即超出程序正常执行流程的某些特殊条件);
[0011] 读取寄存器和内存模块:线程都有一个上下文环境,它包含了有关线程的大部分 信息,例如线程栈的地址,线程当前正在执行的指令地址等。上下文环境保存在寄存器中, 系统进行线程调度的时候会发生上下文切换,实际上就是将一个线程的上下文环境保存到 内存中,然后将另一个线程的上下文环境装入寄存器;
[0012] 断点功能模块:在进行调试的时候,只有被调试进程暂停执行时调试器才可以对 它执行操作,例如观察内存内容等。如果被调试进程不停下来的话,调试器是什么也做不了 的。要使被调试进程停下来,除了几个在特定时刻才发生的调试事件外,唯一的途径就是引 发异常,断点就是达到以上目的的异常;
[0013] 单步执行模块:单步执行是最常见的调试手段之一,即每次执行一行代码,它也包 括逐语句、逐过程、跳出三种命令;
[0014] 通过使用CreateProcess(WIN32API函数CreateProcess用来创建一个新的进程和 它的主线程,这个新进程运行指定的可执行文件。)这个Windows API函数来启动被调试程 序,通过调试循环模块,调试程序循环等待被调试程序触发异常事件;所述异常处理模块对 异常事件进行分发处理;通过读取寄存器和内存这一模块,得到被调试进程访问页的位置 信息,判断是否访问到感兴趣的内存页,如果访问的是热点模块,则触发PAGE_GUARD异常; 通过异常处理模块处理PAGE_GUARD异常,被调试进程的所有线程被设置为单步调试,一条 一条的执行指令;而断点功能模块可以在主程序进行调试时更灵活的操作。
[0015]本发明在于使用了 PAGE_GUARD属性来标识热点模块和有限单步调试来跟踪模块 指令执行,从而实现了热点模块指令跟踪的完备性,避免了单纯断点跟踪的非完备性问题 和复杂性问题,也避免了单纯指令跟踪的效率低下问题。
[0016]本发明同现有技术相比,其有益效果表现在:
[0017] -、使用PAGE_GUARD属性实时监控内存页,针对性强,确保了 了每条进入感兴趣页 面的线程指令都能被探测到;
[0018] 二、当触发PAGE_GUARD异常以后将对被调试进程的线程进行单步调试,所有线程 将进行临时的单步运行,确保了多线程环境下指令跟踪的完备性;
[0019] 三、对热点模块百分之百跟踪,对非热点模块几乎不跟踪,性能开销低,可用于大 型程序的分析。
【附图说明】
[0020] 当结合附图考虑时,通过参照下面的详细描述,能够更完整更好地理解本发明以 及容易得知其中许多伴随的优点,但此处所说明的附图用来提供对本发明的进一步理解, 构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发 明的不当限定,如图其中:
[0021 ]图1是本发明的总体架构图;
[0022]图2为本发明实施单步调试的用例图;
[0023]图3是本发明的程序流程图;
[0024]图4为本发明模块连接框图。
【具体实施方式】
[0025]下面将结合附图及【具体实施方式】对本发明作进一步的描述。
[0026] 实施例1:
[0027] -种热点模块指令跟踪的方法,包括以下步骤:
[0028] 调试循环步骤:一个进程成为被调试进程之后,在完成了某些操作或者发生异常 时,它会发送通知给调试器,然后将自身挂起,直到调试器命令它继续执行;
[0029]异常处理步骤:通过异常的分发,对不同的异常事件进行处理,异常处理分离了接 收和处理错误代码,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中 出现的异常状况(即超出程序正常执行流程的某些特殊条件);
[0030] 读取寄存器和内存步骤:线程都有一个上下文环境,它包含了有关线程的大部分 信息,例如线程栈的地址,线程当前正在执行的指令地址等。上下文环境保存在寄存器中, 系统进行线程调度的时候会发生上下文切换,实际上就是将一个线程的上下文环境保存到 内存中,然后将另一个线程的上下文环境装入寄存器;
[0031] 断点功能步骤:在进行调试的时候,只有被调试进程暂停执行时调试器才可以对 它执行操作,例如观察内存内容等。如果被调试进程不停下来的话,调试器是什么也做不了 的。要使被调试进程停下来,除了几个在特定时刻才发生的调试事件外,唯一的途径就是引 发异常,断点就是达到以上目的的异常;
[0032] 单步执行步骤:单步执行是最常见的调试手段之一,即每次执行一行代码,它也包 括逐语句、逐过程、跳出三种命令;
[0033] 通过使用CreateProcess这个Windows API函数来启动被调试程序,通过调试循环 模块,调试程序循环等待被调试程序触发异常事件;所述异常处理模块对异常事件进行分 发处理;通过读取寄存器和内存这一模块,得到被调试进程访问页的位置信息,判断是否访 问到感兴趣的内存页,如果访问的是热点模块,则触发PAGE_GUARD异常;通过异常处理模块 处理PAGE_GUARD异常,被调试进程的所有线程被设置为单步调试,一条一条的执行指令;而 断点功能模块可以在主程序进行调试时更灵活的操作。
[0034] 实施例2:
[0035] 一种针对热点模块进行指令追踪方法,在进行单步调试后热点模块的PAGE_GUARD 属性将丢失,并将丢失PAGE_GUARD属性的页号加到一个链表中,当单步调试的线程被判定 未访问热点模块,将根据该链表重新把热点模块的PAGE_GUARD属性加上,并以非单步方式 直接执行这个线程;该方法主要包括以下步骤:
[0036] S1:标识感兴趣的页:针对热点模块所在代码页设置为PAGE_GUARD属性,标识这些 页的PAGE_GUARD属性;
[0037] S2:进程访问内存页:被调试进程在运行时访问内存页,因为感兴趣的页已经被设 置PAGE_GUARD属性,一旦线程访问到标识为感兴趣的内存页,异常就会被触发,主程序就将 对被调试进程进行挂起处理,如果访问的页不在热点模块所在代码页内,那么将不对线程 进行操作;
[0038] S3:处理PAGE_GUARD异常:当触发PAGE_GUARD异常之后,被调试进程被挂起,等待 调试进程进行处理后将其唤起,调试进程设置被调试进程的所有线程为单步调试,并把该 页写入一个链表中,该页的PAGE_GUARD属性丢失;
[0039] S4:线程单步调试:一步一步跟踪程序执行的流程,再次判断线程是否访问热点模 块所在代码页,如果不访问感兴趣的页,则不对该线程进行操作,此时根据S3中创建的链表 重设页的PAGE_GUARD属性;如果访问感兴趣的页,则设置所有线程单步调试;
[0040] S5:重设PAGE_GUARD属性:由于PAGE_GUARD属性在进行单步调试的时候就将丢失, 为了保证感兴趣的页面被实时监测,如果单步调试的线程未访问感兴趣的页,就根据S2设 置的链表重新设置页的PAGE_GUARD属性,当然如果访问的是感兴趣的页,就继续线程单步 调试。
[0041 ] 实施例3:
[0042] 针对微软公司的Windows7系统
[0043] 将开发的基于热点模块追踪的调试器在Wind〇ws7系统下进行调试。使用visual stdio2013对项目进行
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1