可执行程序的反编译

可执行程序的反编译

吴伟峰[1]2012年在《静态二进制翻译完备性及代码分析研究》文中提出二进制翻译技术是解决代码移植问题的重要手段。静态二进制翻译在翻译生成程序运行效率方面具有绝对优势,在生成代码重用性和膨胀率两方面也占有优势,但动态和动静相结合的翻译模式却是现今大家关注和研究的焦点,主要原因是静态二进制翻译在翻译完备性上有欠缺,它不能很好的处理间接跳转、间接调用和自修改代码等。静态二进制翻译面临的完备性问题是一个难点问题,近半个世纪来众多研究人员为解决此问题一直做着不懈的努力。本文所做工作致力于解决阻碍静态二进制翻译发展的翻译完备性问题:解决间接转跳转和间接调用指令的目标地址确定问题;解决对自修改代码的处理问题。另外,在代码分析方面解决数据类型恢复问题和用户函数与库函数同名的区分问题。本文的主要贡献如下:1、提出了一种解决静态二进制翻译完备性问题的亚纯静态二进制翻译框架。此翻译框架将二进制翻译器的输入由原来的一维变成了二维输入<待翻译二进制程序,制导文件>,翻译时根据制导文件提供的信息有效解决间接跳转、间接调用和自修改代码等制约静态二进制翻译发展的问题。2、提出了一种新的功能块概念。功能块是基于描述代码功能而提出的程序划分概念,以更有利于对代码的分析。由于基于基本块的程序分析方法不能很好地解决间接转移指令目标地址的确定问题,本文给出了一种基于功能块的程序分析方法,为解决间接转移指令目标地址确定问题奠定了基础。3、提出了一种程序执行路径逆向构造技术。使用本文提出的执行路径逆向构造技术,可以构造一条从程序入口点到某个间接转移指令的执行路径,从而有效降低获取间接转移指令目标地址的时空消耗和复杂度。4、提出了一种基于内存操作码和调试信息的数据类型恢复技术。本文以针对内存空间的存取操作为突破点,结合对栈空间和数据段的模拟分析给出数据类型恢复算法。它对C语言使用的基本数据类型都能成功恢复,另外将构造数据类型恢复成等价的多个基本数据类型,同时解决了关于字符串和指针的数据类型恢复问题。5、提出了一种用户函数与库函数同名的区分技术。由于ITS翻译系统使用的库函数快速识别技术在区分库函数和与库函数同名的用户函数方面存在缺陷,本文提出了一种新的判定用户函数和库函数同名的区分算法。6、给出了一种对自修改代码的处理算法。综合使用快照和内存一致性更新技术,基于对程序所有代码的遍历执行,给出对自修改代码的识别与提取算法。经SPEC2006、IEEE浮点测试软件和Fortran78Test Suite等测试集1800个测试用例(约50多万行源代码,上百万条IA-64指令)的测试,本文提出的各项技术的正确性和有效性得到了充分的验证,为解决静态二进制翻译面临的翻译完备性问题和代码分析问题提供了坚实的基础。

杨克峤[2]2007年在《反编译中处理分支指令的关键技术研究与实现》文中提出指令解码模块是反编译系统的前端部件,主要任务是把可执行二进制代码解码为源机器的汇编表示,并构建出过程内控制流图和过程间调用图。本论文基于IA-64至Alpha的静态二进制翻译课题的需要,在对源机器为64位机的反编译技术的研究基础之上,研究了在指令解码模块中对分支指令解码采用的关键处理技术。本文以我们设计实现的静态二进制翻译系统ITA为试验平台,从阐述指令解码器的解码算法出发,结合IA-64的指令特点,指出了分支指令对基于程序静态控制流程递归解码的影响;在深入分析间接跳转产生机制的基础上,提出了不依赖编译器类别和编译器版本的n-条件分支的跳转表恢复方法,并对非n-条件分支的间接跳转指令进行了处理;参考采用解释器处理间接过程调用的设计思想,结合IA-64和Alpha体系结构的各自特点,提出了在解码中建立一对一的源过程地址到目标过程地址的二维映射表的方法,静态解决了对间接调用的过程恢复问题;详细分析了尾调用的编译优化策略,依靠尾调用前后的二进制代码特点,提出了叁种模式用于对strip后的二进制代码中过程间跳转指令的类型判定。文章最后给出了对以上技术的实验和测试分析结果。测试结果表明,本文所提出的对分支指令的关键处理技术是正确和有效的。

周瑞平, 雷涛, 朱虹[3]2004年在《反编译中的库函数识别的实现研究》文中研究说明库函数的识别是整个反编译过程的一个重要组成部分。结合反编译的整个过程特点,全面地分析了对可执行程序的静态库和动态库识别的实现技术问题,并给出了相应可行的实现方案。在实际中得到了很好的应用。

雷涛[4]2004年在《可执行程序的反编译》文中提出随着计算机软件的广泛应用,可执行程序的反编译已成为软件逆向工程的重要研究领域,在可执行程序的移植、商业软件的安全性分析、软件的加解密分析、软件复用等方面充分显示其应用价值。针对主流反编译软件没有解决好的文件格式识别、代码和数据分离、签名识别等问题,课题进行了重点研究。我们分析了反编译的几种主要模式,选择了一种适合于可执行程序反编译的结构化反编译模式,该模式主要由文件格式识别、代码和数据分离、签名识别这叁个阶段组成。在文件格式识别阶段采用Autocoder方法解析文件的代码段、数据段、输入段等特殊字段。在代码和数据分离阶段,分析了传统的直接对代码段实行静态分离易产生伪代码的缺点,设计了一种利用程序入口地址和函数调用地址等特点来进行启发式的静态分离算法,并将该分离算法和动态分离有效的结合起来应用于可执行程序的反编译。在签名识别阶段,利用动态库函数的引用特点,实现了一种重定位模式比较的签名方法,解决了编译器签名和静态库签名的识别率低、速度慢的缺点;基于可执行程序动态库的输入表不变特点,实现了一种依据输入表进行识别的动态库签名方法。采用VC++语言和一些SDK工具实现了两个实用反编译工具:静态反编译系统unASM、动态调试器cuteDBG。最后以软件破解、加密分析、程序结构分析等几个实例显示了该工具的应用价值。按照这些技术设计的反编译系统可以识别Windows和Linux平台下的所有可执行程序,有效的分离这些可执行程序中的代码和数据,最后产生一种较为易懂的伪汇编代码。

张一弛[5]2012年在《程序恶意行为识别及其恶意性判定研究》文中研究表明确保信息系统的安全已经被提升到国家战略高度,而恶意代码是当前信息系统安全的主要威胁之一。一方面由于经济利益驱使,恶意代码的数量以惊人的速度增长,使得安全人员疲于应付;另一方面恶意代码编写者不断提出新的策略来对抗传统的软件分析方法,混淆、变形等程序变换技术广泛应用于恶意代码编写过程中,这也使得对恶意代码进行分析与判定更加困难。因此,对恶意代码及其变体进行有效的分析与检测,将有助于提高信息系统的安全性,减少由恶意代码带来的损失。对二进制文件进行反编译,从而提取程序中具有的特征与行为,是一种检测恶意代码、分析程序恶意性的有效方法。本文从模型建立、程序逆向分析以及判定算法设计等方面,对程序恶意行为识别及其恶意性判定进行了研究。论文的主要工作及创新点包括:1、建立了一种基于证据推理的程序恶意性判定模型。现有的程序恶意性判定模型通常是将识别的行为与定义的恶意模板进行单一比较,因此容易导致误报情况的出现。针对该问题,本文将证据理论引入程序恶意性判定问题中,建立了一种基于证据推理的程序恶意性判定模型,并将程序恶意性判定问题抽象为对多个证据的合成问题。该模型以程序具有的多种特征行为的识别程度作为输入,从一定程度上解决了单一行为特征作为判定标准的问题,并且提高了程序恶意性判定的正确率,也增加了程序恶意性判定问题实现的灵活性。2、提出并实现了一种通过神经网络获得概率分配函数的方法。在应用证据理论时,将训练集中程序的行为特征转换为可以进行推理的概率分配函数,是应用证据理论进行程序恶意性判定的前提条件。目前确定概率分配函数方法大都是人工设定,该方法存在计算复杂、自适应差、主观性强等缺点。针对该问题,结合神经网络具有较强的泛化能力,在知识学习中具有归纳全部数据的自学习能力的特点,本文提出了使用神经网络进行训练得到程序行为概率分配函数的方法,利用神经网络对大量样本进行学习,能起到领域专家的作用,解决了概率分配函数赋值难以获取的问题。3、提出并实现了一种基于“支持度”的证据合成算法。在利用证据理论的合成规则进行证据推理时,由于证据理论本身的局限性,会出现合成规则不能使用或者得出的结论与人类推理习惯相悖的问题。在程序恶意性判定的推理算法的研究过程中,发现悖论问题直接影响到证据推理结果的正确性与可靠性。针对该问题,本文提出了“支持度”的概念,通过计算证据间的距离来确定证据之间的冲突,进一步确定每一个证据得到其它证据的支持程度,并将该支持度作为合成时的可信程度,从而提高了程序恶意性判定结果的准确性。4、提出并实现了一种针对恶意代码的反汇编策略及相关算法。恶意代码编写者经常使用一些代码混淆技术来干扰反汇编器获得正确的指令,从而逃避检测。在归纳了常用的叁类抗分析混淆手段的基础上,提出了一种数据流与控制流协同的反汇编策略。该方法能够对抗垃圾数据插入、子程序异常返回和直接跳转间接化等常用的混淆方法。实验结果证明,采用该方法能够提取二进制程序中有效指令,显着提高反汇编的正确率,为程序恶意性判定提供保证。5、提出并实现了一种基于模型检测的程序行为识别方法。程序的行为是一组相互协作的、能够观察的作用在计算系统上的操作。在对二进制程序的安全性进行判定时,程序行为是最为有力的依据,能够从根本上反映程序的性质。但程序中的行为并不是独立的,而是可以组合进而形成新的行为。但这种相关性非常复杂,很难用具体的数学模型来描述。针对该问题,本文分析了恶意代码在指令序列、函数调用图以及函数参数上的表现,提出了基于模型检测的程序行为识别方法。该方法利用模型检测器识别程序中具有定义的恶意行为,并在程序的控制流图上对检测到的恶意行为进行标注。本文提出的模型及其相关算法已在课题组研制的Nombril系统中得到了实现和应用,实验数据验证了模型和算法的合理性、正确性和有效性。

刘宗田[6]1997年在《C语言反编译系统DECLER》文中认为本文对C语言反编译系统DECLER1.1性能、结构及实现技术给出介绍,并对反编译研究中存在的问题进行了讨论和分析。

孙维新[7]2007年在《静态二进制翻译中基本数据类型分析的研究与实现》文中提出随着体系结构的更新换代,在老体系结构上开发的优秀软件面临着被淘汰的境地。同时为了在短时间内推广新体系结构的应用和促进它的发展,需要把老体系结构上的软件快速移植到新体系结构上,这样二进制翻译和反编译技术应运而生。同时反编译技术还在软件维护、软件开发和调试、病毒发现和漏洞扫描等领域有着重要的作用。数据类型分析是二进制翻译和反编译中的难点,本文首先介绍了静态二进制翻译器ITA系统,然后基于该平台给出了在二进制翻译中分析数据基本类型的技术方案。把传统编译优化技术中的数据流分析技术和类型推导理论应用到二进制翻译中,通过对指令语义和过程HRTL表示的分析获得数据的基本类型信息。本文的主要内容及创新点有:过程变量的重命名。当把指令的语义提升到HRTL语句表示时,指令中的寄存器操作数转换为HRTL表示中的变量。由于寄存器数量的限制和编译器对寄存器的分配优化策略,一个寄存器一般用来存放多个数据片,这样一个寄存器变量可能表示类型不同而且没有任何关系的多个数据片,所以有必要对寄存器变量重命名。应用数据流分析技术和集合划分理论完成变量重命名。对重命名后的变量利用类型推导规则推导它在过程中所有定义和引用处的类型,结果是一个类型的集合。类型推导规则的提取是问题的关键,推导规则越完善我们获得数据的类型越准确。利用格理论确定变量的最终类型。我们把二进制翻译中数据的基本类型按照它们之间的关系组织在一个格中,对推导出的变量类型集合中的元素与该格进行比较,获得变量最终的一个类型,该类型将在翻译生成的C代码中作为变量的声明类型。本文提出的数据类型分析技术应用在我们开发的静态二进制翻译器ITA系统中,通过测试表明该技术方案是可行的、有效的和正确的。

许向阳, 雷涛, 朱虹[8]2004年在《反编译中的静态库识别研究》文中研究指明库函数的识别是整个反编译过程的一个重要组成部分。根据可执行程序的静态库的识别过程,该文提出了在这个过程出现的中间代码生成、伪函数模块识别、库函数提取、库函数识别等问题,并给出了对这些问题的解决方法。这些方法在实际的静态库的识别中得到很好的应用。

张一弛[9]2009年在《基于反编译的恶意代码检测关键技术研究与实现》文中提出恶意代码是当前计算机系统安全的主要威胁之一,安全厂商和相关研究机构都很重视研究新的检测方法和技术,以便削弱恶意代码的威胁。由于当前的恶意代码普遍采用混淆技术,使得常规检测方法无法有效地检测恶意代码。反编译逆向分析技术是一种用于理解和分析二进制代码的技术,它通过静态方法理解二进制代码将要执行的动作,对发现可执行程序中的潜在威胁具有较大优势。因此,研究基于反编译的恶意代码检测具有重要意义。本文基于对恶意代码混淆技术的分析与理解,深入研究了反编译技术在恶意代码检测中的应用手段和方法。首先,将恶意代码使用的混淆技术按照反编译的过程分为两类,重点研究了干扰反汇编的垃圾代码插入和子程序异常返回等情况。采用虚拟堆栈、二次解码和控制流间隙扫描等方法,设计并实现了相应的恶意代码反汇编框架及算法。之后,针对恶意程序中使用动态搜索、加载调用库函数等情况,提出了根据汇编指令序列特征和库函数名称存放特点识别库函数调用行为的方法及算法。最后,在恶意行为检测方法上,提出了一种基于子图匹配的恶意代码检测方法,通过将程序的控制流图与恶意行为库中定义的恶意行为进行比较,识别可执行程序中含有的可疑行为,从而判断出程序的恶意程度。本文提出的上述方法、算法和技术已经应用于国家863项目所研发的恶意代码分析与检测原型系统RADUX (Reverse Analysis for Detecting Unsafe eXecutables)的开发过程中。该原型系统已经通过了两家测试机构的测试,并已经投入使用,测试中该系统与多个常用的逆向分析工具、知名的杀毒软件进行了比较,测试和使用结果表明,本文所提出的恶意程序反汇编算法、库函数调用识别方法以及基于控制流图的检测方法,在可行性、有效性和正确性上都得到了良好的验证。第V页

张柏年[10]2008年在《基于动态二进制翻译技术的反编译研究》文中指出反编译是将使用低级语言表示的程序代码变换成与其功能等价的高级语言程序代码的过程,是编译的逆过程。它对于软件的移植、理解喝维护都起着重要作用。反编译的结果可以用于寻找程序中包含的恶意代码、bug和脆弱点,揭示程序的内部互操作机制。现有的基于静态分析技术的二进制代码反编译器具有很多理论上的局限性,包括不能有效的处理间接跳转和间接过程调用,不能进行精确的指针别名分析,需要对目标程序的代码结构做一定的假设等等。本文描述的反编译基础系统采用基于二进制翻译技术的动态分析方法,通过准确地记录程序实际的执行路径和变量关系,能较好地解决控制流混淆和二进制代码的动态指针别名分析问题。静态反编译由于无法获得程序实际执行时的输入,因此需要假设任何可能的输入和执行路径都是有效的。实际上程序中可能存在不可达路径,反编译器通常只会做保守地选择。保守的分析会使得反编译器产生执行效率较低或者可读性较差的代码,甚至导致分析失败。与静态反编译不同,本文描述的动态反编译方法可以准确获知程序执行时的输入和执行路径,因此可以针对当前的输入(实际上是与当前输入等价的一类输入)做最优的选择。使用这一方法得到的反编译结果更接近程序实际执行时的逻辑,但可能无法处理未测试的输入。本研究的主要贡献在于:1.基于Linux下的动态二进制翻译平台valgrind,实现了反编译器基础平台Dynamic Analyzer,论证了动态反编译器实现的可行性。2.使用动态控制流图构造方法,与静态构造方法相比能有效地解决目标地址获取和控制流混淆问题。3.提出了面向二进制代码的动态指针别名分析算法,有效地提高了反编译结果的准确性。4.改进了影子堆栈技术,能够更精确地识别虚假的子过程调用。

参考文献:

[1]. 静态二进制翻译完备性及代码分析研究[D]. 吴伟峰. 解放军信息工程大学. 2012

[2]. 反编译中处理分支指令的关键技术研究与实现[D]. 杨克峤. 解放军信息工程大学. 2007

[3]. 反编译中的库函数识别的实现研究[J]. 周瑞平, 雷涛, 朱虹. 计算机应用研究. 2004

[4]. 可执行程序的反编译[D]. 雷涛. 华中科技大学. 2004

[5]. 程序恶意行为识别及其恶意性判定研究[D]. 张一弛. 解放军信息工程大学. 2012

[6]. C语言反编译系统DECLER[J]. 刘宗田. 微电子学与计算机. 1997

[7]. 静态二进制翻译中基本数据类型分析的研究与实现[D]. 孙维新. 解放军信息工程大学. 2007

[8]. 反编译中的静态库识别研究[J]. 许向阳, 雷涛, 朱虹. 计算机工程与应用. 2004

[9]. 基于反编译的恶意代码检测关键技术研究与实现[D]. 张一弛. 解放军信息工程大学. 2009

[10]. 基于动态二进制翻译技术的反编译研究[D]. 张柏年. 上海交通大学. 2008

标签:;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  ;  

可执行程序的反编译
下载Doc文档

猜你喜欢