
Weipu信息反编译中的静态库识别研究徐向阳,雷涛,朱宏(华中科技大学计算机学院与多媒体技术研究所,武汉430074)E-mail: popleitao @ sina. 摘要库功能的识别是整个反编译过程的重要组成部分. 基于可执行程序的静态库的识别过程. 本文提出了在此过程中出现的诸如中间代码生成,伪功能模块标识,库函数提取反编译.a静态库代码,库函数标识等问题,并提供了解决方案. 这些方法在识别实际静态库中非常有用. 良好的应用关键词反编译静态库库函数伪函数产品编号1002-8331(2004)09-0037-03文献标识码中文分类号TP309A反编译中静态库功能识别的研究徐向阳雷涛朱宏(计算机科学系)华中科技大学科学与技术学院,武汉430074)摘要: 识别库函数是反编译过程中的重要部分,分析了执行程序对静态库函数的识别,本文分析了在此过程中出现的一些问题并解决了这些问题的解决方案,例如中间代码,识别伪函数,提取和识别库函数. 这些方法在认识实用静态文库的过程中得到了很好的应用. . fiinPtinns. 关键字: 反编译,静态库,库函数,伪函数l简介图1中的可执行程序是需要反编译的程序,中间代码是反编译,这是翻译目标代码的高级语言形式等价的是一种由原始可执行程序的汇编代码,模块绑定代码的技术表示的代码. 它是软件逆向工程的重要组成部分. 反构成图是指识别中间代码中的每个伪功能模块之后的表达式. 静态翻译的形式分为基于可执行程序的反编译和基于虚拟机指令的反编译. 状态库集是指程序引用的所有定义的库函数的集合. 国外反编译研究已有30多年的历史. ,但是还没有成熟的实用系统来反编译可执行程序,该可执行程序可以生成2.1程序的中间代码. “
l,国内研究,该程序的中间代码是一种反汇编,是由汇编程序和可执行程序组成的,该汇编程序和可执行程序是由原诚婷等基于TC2.0生成的;这些库函数的代码是关于中间代码的生成,结合汇编语言的特性以及程序类型中的许多关键问题,例如库函数的提取等,在硬件平台的操作上都没有详细阐述,有以下两点: 库函数识别是整个反编译过程的重要部分,根据(1),每个可执行指令和汇编代码之间是双射可执行照片库函数的加载形式. 库功能分为两部分: 动态库和静态库. 指令是由0和l组成的代码. 这种映射由指令体系结构的特殊结构决定. 根据库函数的编译方法,分为系统库和编译器内置的自定义点. 在这里,我们将考虑常用的英特尔指令架构. 关于本文的第三方库,本文主要解决了编译器随附的系统静态库的标识问题. 有关此映射的详细信息,请参阅文档f5至71. 下面讨论该过程中遇到的问题和解决方案,并提出(2)可执行代码是由许多可执行指令组成的确定性信息亭,以有效地识别静态库启发式算法. 柱. 编译源程序后,此顺序将不会更改. 此确定性序列也称为可执行程序的代码部分. 这是一个确定2个可以由Cheng Ting执行的库函数的过程. 您可以参考PE(PortableExecutive)文件格式(iv).

库功能标识包括中间代码生成和伪功能模块标识. 因此,对于任何可执行程序,可以由(1)和(2)声明该程序. 引用的静态库函数集等的详细过程如图1所示. 必须有唯一的中间代码表示形式. 此转换规则是确定的. 这种转换实际上是反编译过程中的反汇编过程. 根据从可执行程序中提取的可执行代码,根据(1)对应规则. 可以实项目: 国家863高科技研究与发展计划项目: 国内安全管理系统SDM3资助;国家部委预研项目资金支持雷涛,华中科技大学计算机系. 朱虹,华中科技大学副教授. 计算机工程与应用20 Ol4.9 37显然,高级语言的功能模块最终将转换为DUMPBIN,以供编译器分析COFF文件. 该工具可以直接等同于伪功能模块. 库功能识别的前提是提取库文件中所有库功能的特征属性.
要识别的伪功能模块,从中间代码的形式来看,伪功能模块2.4程序引用的静态库功能集的起始地址全部出现在“调用地址”中,继续进行功能模块定义D3程序引用的静态库功能集(PRFL): 指伪功能模块,其标识通过提取CAll和“地址”来反转. 为了收集与已编译程序相对应的高级语言中引用的静态库函数,以及TC2.0生成的执行程序的伪函数模块,仅需基于库函数进行标识即可: 相应的源代码可显式调用编译器为其他编译器(例如C ++ Builder,Visual collection)提供的静态库函数入口地址的标识. C ++等生成的可执行程序并不都满足此功能,因此无法识别. 仅通过确定PRFL,才可能知道要匹配和准确识别的功能集. 为此,需要使用不同的算法进行识别. 算法;但是,无论是可执行程序本身还是反汇编的中间代,如果中间代码中有指令“ CALL address A”,则编译后的代码将不包含有关这些静态库函数的任何信息. 因此,不妨考虑一下原理f. 然后是: 一个问题的增强的命题: 确定程序可能引用的静态库函数集(1)必须具有以地址A为起始地址的伪函数模块B.

(PPRFL). 通过分析库函数的编译过程,我们可以发现: (2)B是中间代码集中的连续序列子集. (1)程序引用的库函数必须是编译器提供的库函数. (3)B最终以“ retn”(n是一个正整数)指令的形式返回. 珍子换句话说,实际运行的程序不可能使用编译器提供的伪功能模块的所有中间代码. (4)所有库功能必须位于起始地址,而模块必须位于起始地址. 在后面的ret指令之间. (2)不同的编译器提供不同的启动运行时库. 此处的启动操作显然是一个非常特殊的伪功能模块. 根据以上三点,可执行库是指初始化正在运行的程序的动态库. 这些动态库都包含一种算法,该算法设计了可识别中间代码的伪功能模块: 它包含在文件本身的某些数据结构中,例如VC. 编译器编译功能: 标识中间代码的伪功能模块的终止地址的程序通常包含msvcrt. dll,mf2. d11中的一个或多个; VB输入: 伪功能模块的起始地址. 由Lstart编译器编译的程序必须包含msvbvm60. dll或msvbvmS0. dll. 输出: 伪函数模块Lend的结束地址根据(1)(2),您可以确定与反编译器: 编译器相对应的源程序使用的算法,从而可以实际确定PPRFL以及所采用的PPRFL这是L = L;是对应于某个编译器的所有系统静态库函数的集合.
开始: 虽然是PRFLcPPRFL,但是库函数识别的结果Il不能确定来自L coffee的第一条ret指令的地址I;这样做的效果是,它只会增加识别过程的复杂性. 实际上,如果您让(如果I之间没有跳转指令)PPRFL为所有编译器提供库函数集,则retLLrn I也是可行的库函数识别;但是它的复杂性太大; PPRFJ也被设计为“最初的意图是: 取I和IL之间所有跳转地址的最大值: 查找包含PRFL的最小子集,降低后续匹配的复杂度: 如果(L≤L)2.5静态提取库函数集返回I;实际上,库函数是伪函数模块;建立库函数集LI. 提取每个伪函数模块的特征属性的过程;由于gotoBegin;在编译过程中发生重定位,因此它的特征属性不能直接提取,但是对于单个库函数的提取属性,这些特性需要重新处理以找到不变量定义D2对于任何编译系统随附的库函数,请在指向静态函数的编译链接中定义其函数D4. 其中,地址多个名称的属性和相应的中间代码序列称为特征库属性. 功能. 定位指令,这些指令称为有效操作指令.

这些指令在某些库文件中编译了编译器随附的所有库函数. 这些链接直接从库文件写入目标文件. 库文件是标准的,没有任何操作数. COFF文件结构表21;因此请提取库函数的实际修改(地址重定位). 相应地,有效操作数的概念是指以下事实: 库是在链接函数之前和之后从库文件中提取所有库特征特征的功能,并且操作指令的相应操作数不变. 其中有一些相应的数据结构]. 具有有效操作数的指令是有效的操作指令. 相反反编译.a静态库代码,实际上,对于任何给定的有效操作而言,它都是COFF结构,因此可以提取出指令必须具有有效的操作数. 它包含一个指向第一个库函数的指针ptr. ptr指针的实际内容更进一步. 中间代码的指令分为有效操作指令和无效操作. 它是一个结构指针,其中包含实际库函数的中间代码(如图2所示,所执行的指令;对于实际的链接库函数,将显示其无效操作指令集). 通过重复读取每个ptr指针的内容,可以获得的库文件的潜力很小,通常为l〜5,此集合基于目标代码生成过程中所包含的所有库函数的特征属性. 可以得到该过程[1ol. 对于任何中间代码指令P,请将其操作码设置为OP(P). 其操作数集为ON(P),此指令的长度为OL(P).
对于任何伪功能模块F,您可能希望将其指令的总长度设置为FLEN(F.). 其指令序列的编号为SE(F),因此其所有指令序列均为(F,l2 ... F ...)(其中n = SE(F.)). 所有指令的操作码序列为OP(F.)=(OP(F). OP(F__2)... OP(F ..))(其中n = SE(F.)),操作数序列为ON [F. ): (ON(FII1),ON(F..2)... ON(F ..))(n = SE(F.)),然后是F. k: Se(F,1OP(FIk)+ ON(Fi.k)(1≤k≤Se(Fi)),并满足以下公式: FLEN(F.)=实际上,Microsoft就是这样在开发辅助工具中,38 2OO4.9计算机工程和应用信息OL(Fi,k). 有效操作数序列为OEN(F,),然后ON(F.)= OEN以FLK记录FLL;如果( FLL为空)(F.)UOEN(Fi). 中断;如果考虑静态库的链接过程,则会发现以下规则: if(OLM(FLL.FC)&OPM(FLL.FC)&ONM (FLL.FC(1)给定现有库函数的名称,库文件中有一个对应的函数,实际上FLL已添加到RL;指定了伪函数特征属性.

也就是说,它的操作代码,操作gotobegin;可以确定数量和其他特征信息. if(IIRLII> 1)(2)对于链接到该程序的任何库函数,其不变的特征信息为ERROR;该信息是库函数,操作码序列和有效操作数序列的总指令长度. 否则(3)编译优化不会影响静态库函数. return RL: 因此,在提取库函数的特征信息时,需要提取库函数名称FNAME,库函数FLEN的总指令长度以及操作码序列FOP. 有效操作数序列FOEN有3个测试结果. 这样,总特征信息就是L所采用的库函数匹配算法. 实际上,可以识别出由成宁(FANME,FLEN,FOP,FOEN)的组合组成的库函数特征信息代码. 所有引用的静态库;在实际测试中,以SQL2K和Snort为例. 静态库集的建立过程是从库文件中提取每个库函数. 结果是特征信息代码FLL,以及将这些FLL一起组织的过程. 通过以上讨论,讨论了识别级别为“总引用静态测试程序”的0LM OPM 0NM状态库函数的总数,此过程可解决. --- 2. 6库函数识别算法Snort 90%7%通过以上讨论,3%100%272. 可以发现,库函数的识别过程被赋予了S0L2K 92%4%4%1o0%673伪函数模块FC,在静态功能库FLK(FIJFN,FOP,FOEN)中找到一个具有其特征信息代码的库功能相同的FLL过程. 这个过程称为所有库函数的比例.
可以看出,由于实际成宁的特性,该算法已经可以满足实际库函数匹配的要求. 在实际的匹配过程中. 库函数的匹配过程. 由于实际库功能的巨大性以及成宁的复杂性日益增加,实际上有可能识别多个FLL. 而是,形状充分利用了从静态函数库集中提取的信息,并设计了一个识别集FLLS. 有效的启发式匹配算法,实际结果表明,该算法在整个静态库的识别过程中效果很好,充分考虑了各种情况,实际上是获得了一些常用的编译器(VC ++,BC ++,等所有良好的库函数标识目的,为整个程序的反编译奠定了良好的基础静态库,以进行数据分析,并发现以下属性: basic(接收日期: 8月2o03)属性R1对应于任何编译器静态函数库集FLK,没有两个库函数的特征信息代码(FIEN. FOP. FOEN)相同. 对于与任何编译器相对应的静态库集,引用的性质为R2. CCifuentes. 反向编译技术[D]. 博论文. 在School FLK中,80%到90%的库函数具有不同的总指令长度,而约95%的计算科学库. 昆士兰科技大学,1994-072. E JChikofsky. JH Cross. 逆向工程和设计恢复): 一个函数具有不同的操作代码,库函数的有效操作数的95%是不同的分类法[J],IEEE Soflware. 1990年; 7: 13〜17根据R1,伪函数之间的特征信息代码的识别和比较为3. 陈福娜反编译技术研究[J]. Jof是可行的,并且识别集的顺序不得大于1.
自ComputSci&Techno 1.1994开始;在图9(4)中,对于伪函数,总指令长度,操作码和有效操作数的计算强度从小到大排列. 赵磊,王开柱C反编译库函数识别算法的研究与实现[J.计算机研究的顺序是P(总指令长度)
)= OEN(F)(1≤k≤SE(F)),即两个伪功能模块的指令序列的有效操作数分别是ExecutableFileFormat [J]. Microsoft系统杂志19949. 克里斯蒂娜·奇夫恩特斯(Cristina Cifuentes). 一个对应关系的逆向工程环境是相同的. 可执行程序[J]. IEEE. 1995(3)指令长度级别匹配OLM(F,F)10. AhoA. 乌尔曼·J. 编译原理描述[M] Addison-g“ esley. 满足: FLEN(F,)= FLEN(F)1986,即两个伪函数模块的总指令长度相同. 11. H SwartZ. ThecaseforreverseengineeringJ [ ]. 商用计算机描述: 标识对应于伪功能模块的库函数Journal,1984; 3(12)输入: 伪功能模块FC,静态库集FLKl2. RL为空; 13Gintraas R Gireys. 理解并使用COFF [M] .0Reilly&begin: Associates,1988年,计算机工程与应用2004年. 9 39 39
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-166991-1.html
是狗天性多自负
作为一名中国人必须有打仗的觉悟
够了解还那么多无知的喷子