反编译过程中的堆栈跟踪方法、装置及反编译器制造方法及图纸

技术编号:5265872 阅读:461 留言:0更新日期:2012-04-11 18:40
一种反编译过程中的堆栈跟踪方法、装置及反编译器,该方法包括步骤:顺序执行指令,根据每条指令对堆栈指针寄存器ESP的值的影响,对预设整型变量进行相应的加减操作,所述预设整型变量用以表示系统当前ESP寄存器的值与函数入口处系统ESP寄存器的值之间的偏移量。本发明专利技术方案通过预设整型变量来模拟堆栈寄存器ESP的行为,根据在执行指令时各指令对堆栈指针寄存器ESP的值的影响,来对该预设整型变量执行相应的加减操作,据此模拟CPU的压栈入栈等堆栈操作行为,从而可以根据该预设整型变量来准确地识别函数执行过程中的参数、局部变量,可以给反编译过程提供更多准确的信息,进而提高了最终反编译结果的正确性和可读性。

【技术实现步骤摘要】

本专利技术涉及反编译
,特别涉及一种反编译过程中的堆栈跟踪方法、一种 反编译过程中的堆栈跟踪装置以及一种反编译器。
技术介绍
反编译过程是软件逆向工程中的一个重要组成部分,对于软件的分析、理解有着 重要的作用,其读入机器码,产生与最初源代码相似的高级语言代码,该高级语言代码在功 能上与最初的源代码一致。执行反编译过程的反编译器的典型架构分为前端、中端和后端, 其中,前端是个依赖于机器的模块,其读取机器代码,进行句法分析和语义分析,生成中间 代码;中端读取中间代码,生成控制流程图,进行数据流分析和控制流分析;后端生成高级 代码。在上述反编译过程的各步骤中,除了数据流分析之外,其余的各部分在理论和技 术上均已成熟,数据流分析过程是至今都尚未很好解决的难点,其进行的工作主要包括有 死寄存器和条件码的清除、条件码和寄存器的拷贝传播、数据类型的识别和传播、寄存器变 量的识别和清除。其中,寄存器变量可以分为全局变量、局部变量和参数,其中局部变量、参 数与堆栈有着密切的联系,因此,堆栈跟踪成为进行数据流分析的必要条件。图1是80*86系列的堆栈示意图,如图1所示,在80*86系列中,堆栈是一段RAM 区域,其中,栈底是地址较大的一端,栈顶是地址较小的一端,堆栈指针寄存器ESP始终指 向栈顶,在每个反编译程序的运行期间,都与一个堆栈相关联着,堆栈是参数、局部变量和 返回地址的集合。在程序运行期间,堆栈指针寄存器ESP随时在发生变化,如何准确地识别 参数和局部变量成为了一个难题,从而制约了数据流分析阶段的发展。
技术实现思路
针对上述现有技术中存在的问题,本专利技术的目的在于提供一种反编译过程中的堆 栈跟踪方法、一种反编译过程中的堆栈跟踪装置以及一种反编译器,其可以准确地识别出 参数、局部变量,可以提供更多准确的信息给反编译过程,进而提高最终反编译结果的正确 性和可读性。为达到上述目的,本专利技术采用以下技术方案一种反编译过程中的堆栈跟踪方法,包括步骤顺序执行指令,根据每条指令对堆栈指针寄存器ESP的值的影响,对预设整型变 量进行相应的加减操作,所述预设整型变量用以表示系统当前ESP寄存器的值与函数入口 处系统ESP寄存器的值之间的偏移量。一种反编译过程中的堆栈跟踪装置,包括指令执行单元,用于顺序执行指令;堆栈跟踪单元,用于根据每条指令对堆栈指针寄存器ESP的值的影响,对预设整 型变量进行相应的加减操作,所述预设整型变量用以表示系统当前ESP寄存器的值与函数入口处系统ESP寄存器的值之间的偏移量。 一种反编译器,包括如上所述的反编译过程中的堆栈跟踪装置。根据本专利技术方案,其是通过预设整型变量来模拟堆栈寄存器ESP的行为,根据在 执行指令时各指令对堆栈指针寄存器ESP的值的影响,来对该预设整型变量执行相应的加 减操作,据此模拟CPU的压栈入栈等堆栈操作行为,跟踪所有与堆栈寄存器ESP相关的操 作,由于预设整型变量是用于表示系统当前ESP寄存器的值与函数入口处系统ESP寄存器 的值之间的偏移量,从而可以根据该预设整型变量来准确地识别函数执行过程中的参数、 局部变量,可以给反编译过程提供更多准确的信息,进而提高了最终反编译结果的正确性 和可读性。附图说明图1是80*86系列的堆栈示意图;图2是本专利技术的反编译过程中的堆栈跟踪方法实施例的流程示意图;图3是依据本专利技术方法的数组元素结构示意图;图4是依据本专利技术方法的堆栈跟踪示例的示意图;图5是本专利技术的反编译过程中的堆栈跟踪装置实施例的结构示意图。具体实施例方式本专利技术方案可以应用于各种语言类型的反编译过程,在下述各具体实施例的说明 中,以应用于C反编译器中的C反编译过程进行说明。参见图2所示,是本专利技术的反编译过程中的堆栈跟踪方法实施例的流程示意图, 如图所示,本专利技术方法包括步骤步骤SlOl 顺序执行指令,进入步骤S102 ;步骤S102 根据每条指令对堆栈指针寄存器ESP的值的影响,对预设整型变量进 行相应的加减操作,其中,这里的预设整型变量用以表示系统当前ESP寄存器的值与函数 入口处系统ESP寄存器的值之间的偏移量。根据本专利技术方案,其是通过预设整型变量来模拟堆栈寄存器ESP的行为,根据在 执行指令时各指令对堆栈指针寄存器ESP的值的影响,来对该预设整型变量执行相应的加 减操作,据此模拟CPU的压栈入栈等堆栈操作行为,跟踪所有与堆栈寄存器ESP相关的操 作,由于预设整型变量是用于表示系统当前ESP寄存器的值与函数入口处系统ESP寄存器 的值之间的偏移量,从而可以根据该预设整型变量来准确地识别函数执行过程中的参数、 局部变量,可以给反编译过程提供更多准确的信息,进而提高了最终反编译结果的正确性 和可读性。依据本专利技术方案,其主要包括有两部分其一、采用预设整型变量来模拟堆栈寄 存器ESP的行为,预设整型变量的值为系统当前ESP寄存器与在函数入口处系统ESP寄存 器的值之间的偏移量,在具体应用时,可将该预设整型变量设定为int VirtualESP ;其二、 使用自定义数组结构来保存入栈的数据、入栈时VirtualESP的值和其他辅助信息,并使用 VirtualESP的值作为索引,即自定义数组中的每个元素包含的信息包括有数据入栈时的 VirtualESP值、入栈的数据、以及其他辅助信息,依据本专利技术方案的数组元素结构体的示意图如图3所示。根据上述预设整型变量VirtualESP,可以用来模拟堆栈变化,其可以模拟的堆栈变化的操作可包括有入栈操作、出栈操作、立即数赋值操作、以及备份恢复操作。其中,这里的立即数赋值操作,所能够模拟的实际堆栈的影响和变化包括有用立 即数对ESP进行赋值操作,使用指令对ESP进行间接操作。而这里的备份恢复操作,具体可以包括有在遇到跳转指令时备份当前的 VirtualESP值,在最后一条指令地址小于跳转地址的返回指令处,恢复VirtualESP值。通过上述自定义数组结构,可以据此实现的作用可以包括有保存每次被压入 堆栈的数据到数组内对应的某一元素结构体中,并保存当时VirtualESP的值到该结构 体中,以该VirtualESP的值作为索引数据;在每次出栈操作时,以数组元素结构体内的 VirtualESP的值作为索引,在自定义数组中找到对应的某一数组元素结构体,读取该结构 体内存储的入栈数据的内容,将该内容赋值给pop指令的操作数。根据上述本专利技术的方法,以下就其中的一个具体实施例中的具体操作过程进行详 细阐述。在初始状态下,输入的示例函数代码可如图4所示。从图4中可以发现,该函数中 含有多条ret返回指令和函数调用语句(call语句),这使得对于如何正确跟踪堆栈状态造 成了困难。在函数运行阶段,堆栈指针寄存器ESP随时在发生变化,这使得如何准确地识别 参数和局部变量成为了一个难题,因此,本专利技术方案应当能够处理这个难题。如图4所示,整型变量int VirtualESP被用来模拟堆栈寄存器ESP的行为, VirtualESP的值为系统当前ESP寄存器的值与在函数入口处系统ESP寄存器的值(esp_ func)之间的偏移量,在进入函数前,VirtualESP的值初始化为0x00。随后可进入详细的堆栈跟踪过程,堆栈跟踪过程具体为顺序执行各指令,根据每 条指令是否会影响堆栈指本文档来自技高网...

【技术保护点】

【技术特征摘要】

【专利技术属性】
技术研发人员:陈耿标林毓双
申请(专利权)人:广州迪庆电子科技有限公司
类型:发明
国别省市:81

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1