CN106547572A - 一种程序文件对比方法及装置 - Google Patents
一种程序文件对比方法及装置 Download PDFInfo
- Publication number
- CN106547572A CN106547572A CN201611111262.0A CN201611111262A CN106547572A CN 106547572 A CN106547572 A CN 106547572A CN 201611111262 A CN201611111262 A CN 201611111262A CN 106547572 A CN106547572 A CN 106547572A
- Authority
- CN
- China
- Prior art keywords
- file
- program file
- program
- content
- code
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/658—Incremental updates; Differential updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Library & Information Science (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供的程序文件对比方法,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的非代码变量节点,并将两个程序文件中的非代码变量节点都替换为预设字符,即经过替换后,两个程序文件的非代码变量完全相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该方法能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
Description
技术领域
本发明属于领域计算机技术领域,尤其涉及一种程序文件对比方法及装置。
背景技术
在一个程序发布后,如果对已发布的程序进行更新,通常采用增量发布方式。所谓增量发布方式是指只发布代码部分有修改的程序文件,没有修改的程序文件不再和有修改的程序文件一起发布。客户端也只需要下载增量发布的程序包即可对程序进行更新,所需的下载量大大减小,而且加快了更新速度。
增量包发布时,通常需要配置管理员手工从程序集中逐个挑选出有修改的程序文件,构成增量包然后发布。对于大项目可能包含成千上百个文件,手工挑选代码修改的文件非常耗时而且容易出错。
发明内容
有鉴于此,本发明的目的在于提供一种程序文件对比方法及装置,以解决现有的采用手工挑选代码修改文件耗时、准确率低的问题。
第一方面,本申请提供一种程序文件对比方法,应用于基于可移植的执行体PE文件的程序集中,该方法包括:
分别从编译后的上次版本和当前版本对应的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为预设字符,得到第一待对比程序文件;以及,
获取所述第二程序文件中的第二非代码变量节点,并将所述第二非代码变量节点的节点内容替换为所述预设字符,得到第二待对比程序文件;
比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同;
其中,所述第一、第二非代码变量节点均包括程序文件的时间戳、程序数据库PDB文件的身份识别ID号和程序集模块身份识别号MVID中的至少一项。
可选地,若所述第一非代码变量节点包括所述程序文件的时间戳,则所述获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为所述预设字符,包括:
确定所述第一程序文件的PE文件头的地址;
根据所述PE文件头的地址,读取PE文件头部结构体内的时间戳;
将所述时间戳的内容修改为所述预设字符。
可选地,若所述第一非代码变量节点包括所述PID,则所述获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为所述预设字符,包括:
读取所述第一程序文件的PE文件头中的可选头部结构体;
读取所述可选头部结构体中的数据目录结构体;
从所述数据目录结构体中读取调试目录信息的地址和长度;
根据所述调试目录信息的地址和长度将所述调试目录信息的内容替换为所述预设字符。
可选地,若所述非代码变量节点包括所述MVID,则所述获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为所述预设字符,包括:
从所述第一程序文件的PE文件头中读取可选头部结构体,并从所述可选头部结构体中读取数据目录结构体;
从所述数据目录结构体中读取元数据目录的起始位置和长度;
根据所述元数据目录的起始位置和长度,从元数据目录结构体中获得.NET目录的起始位置和长度;
根据所述.NET目录的起始位置和长度,从所述.NET目录结构体中获取元数据流的起始位置;
根据所述元数据流的起始位置,从元数据流中读取#GUID的起始位置和长度;
根据#GUID的起始位置和长度,从#GUID结构体中获得所述MVID。
可选地,所述比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,包括:
获取所述第一待对比程序文件的第一第5版消息-摘要算法MD5校验码;
获取所述第二待对比程序文件的第二MD5校验码;
比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
可选地,所述方法还包括:
记录比较得到的文件内容不相同的文件名称;
从当前版本的程序集中获取所述文件名称对应的程序文件;
将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
第二方面,本申请提供一种程序文件对比装置,其特征在于,应用于基于可移植的执行体PE文件的程序集中,该装置包括:
第一获取模块,用于分别从编译后的上次版本和当前版本对应的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
第二获取模块,用于获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为预设字符,得到第一待对比程序文件;
第三获取模块,用于获取所述第二程序文件中的第二非代码变量节点,并将所述第二非代码变量节点的节点内容替换为所述预设字符,得到第二待对比程序文件;
比较模块,用于比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同;
其中,所述第一、第二非代码变量节点均包括程序文件的时间戳、程序数据库PDB文件的身份识别ID号和程序集模块身份识别号MVID中的至少一项。
可选地,若所述第一非代码变量节点包括所述程序文件的时间戳,则所述第二获取模块,包括:
确定子模块,用于确定所述第一程序文件的PE文件头的地址;
第一读取子模块,用于根据所述PE文件头的地址,读取PE文件头部结构体内的时间戳;
修改子模块,用于将所述时间戳的内容修改为所述预设字符。
可选地,若所述第一非代码变量节点包括所述PID,则所述第二获取模块,包括:
第二读取子模块,用于读取所述第一程序文件的PE文件头中的可选头部结构体;
第三读取子模块,用于读取所述可选头部结构体中的数据目录结构体;
第四读取子模块,用于从所述数据目录结构体中读取调试目录信息的地址和长度;
替换子模块,用于根据所述调试目录信息的地址和长度将所述调试目录信息的内容替换为所述预设字符。
可选地,若所述第一非代码变量节点包括所述MVID,则所述第二获取模块包括:
第五读取子模块,用于从所述第一程序文件的PE文件头中读取可选头部结构体,并从所述可选头部结构体中读取数据目录结构体;
第六读取子模块,用于从所述数据目录结构体中读取元数据目录的起始位置和长度;
第七读取子模块,用于根据所述元数据目录的起始位置和长度,从元数据目录结构体中获得.NET目录的起始位置和长度;
第八读取子模块,用于根据所述.NET目录的起始位置和长度,从所述.NET目录结构体中获取元数据流的起始位置;
第九读取子模块,用于根据所述元数据流的起始位置,从元数据流中读取#GUID的起始位置和长度;
第十读取子模块,用于根据#GUID的起始位置和长度,从#GUID结构体中获得所述MVID。
可选地,所述比较模块包括:
第一获取子模块,用于获取所述第一待对比程序文件的第一第5版消息-摘要算法MD5校验码;
第二获取子模块,用于获取所述第二待对比程序文件的第二MD5校验码;
比较子模块,用于比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
可选地,所述装置还包括:
记录模块,用于记录比较得到的文件内容不相同的文件名称;
第四获取模块,用于从当前版本的程序集中获取所述文件名称对应的程序文件;
第五获取模块,用于将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
本发明以上实施例提供的程序文件对比方法,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的非代码变量节点,并将两个程序文件中的非代码变量节点都替换为预设字符,即经过替换后,两个程序文件的非代码变量完全相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该方法能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是PE文件的文件格式示意图;
图2是本发明实施例一种程序文件对比方法的流程示意图;
图3是本发明实施例一种非代码变量在PE文件中的分布示意图;
图4是本发明实施例另一种程序文件对比方法的流程示意图;
图5是本发明实施例一种程序文件对比装置的框图;
图6是本发明实施例一种第二获取模块的框图;
图7是本发明实施例另一种第二获取模块的框图;
图8是本发明实施例又一种第二获取模块的框图;
图9是本发明实施例一种比较模块的框图;
图10是本发明实施例另一种程序文件对比装置的框图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参见图1,示出了PE(Portable Executable,可移植的执行文件)文件的文件格式。
PE文件是Windows下可执行文件的总称,常见的有DLL、EXE、OCX、SYS、COM等。
如图1所示,PE文件的结构从起始位置开始依次是DOS部分,PE文件头部分、节表和节。
DOS部分,即DOS头,作用是兼容MS-DOS操作系统中的可执行文件;还有一个作用是指明PE文件头在PE文件中的位置。
PE文件头部分,包括一个“PE”字样的签名,PE文件头(IMAGE_FILE_HEADER)和PE可选头(IMAGE_OPTIONAL_HEADER32);
①PE文件头,定义了PE文件的一些基本信息和属性,这些属性会在PE加载器加载时用到,如果加载器发现PE文件头中定义的一些属性不满足当前的运行环境,将会终止加载该PE文件。
②PE可选头,包含了很多关于可执行映像的重要信息,例如,初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。
节表,是PE文件后续节的描述,windows根据节表的描述加载每个节。节表部分包括段头部、导入目录、资源目录、重新定位目录、调试目录、NET目录等。
节,每个节实际上是一个容器,每个节是一块拥有共同属性的数据,例如,代码/数据、读/写等。如果PE文件中的数据和代码拥有相同属性,它们就能被划分到同一节中。节的名字和数量可以自己定义,节名称仅仅是区别不同节的符号而已,惟有节的属性设置决定了节的特性和功能。例如,某块数据想赋予“只读”属性,就可以将该块数据放入置为“只读”的节中,当PE装载器映射节内容时,它会检查相关节属性并置对应内存块为指定属性。
发明人在实现本发明的过程中,通过对PE文件格式分析后,发现同一份代码在不同时间编译后得到的两个PE文件中有一些非代码变量的内容不一致,本发明就是分别将两个文件名称相同的PE文件的非代码变量的内容替换为相同的内容,使得两个文件名称相同的PE文件的非代码变量部分分别相同,从而排除非代码变量对比较PE文件的干扰,找到代码部分不同的PE文件。
请参见图2,示出了本发明实施例一种程序文件对比方法的流程示意图,该方法应用于终端设备(例如,PC机)中,用于自动识别出两个版本的基于PE文件的程序集中代码有差异的程序文件。
如图2所示,该方法包括:
S110,分别从编译后的上次版本和当前版本对应的程序集中,获取文件名称相同的第一程序文件和第二程序文件。
根据上次版本代码编译后的程序集的路径,读取上次版本对应程序集中的程序文件;以及,根据当前版本代码编译后的程序集的路径,读取当前版本对应程序集中的程序文件。
然后,从上次版本对应程序集和当前版本对应程序集中读取文件名称相同的两个程序文件;把从上次版本对应程序集中读取的程序文件记为第一程序文件;把从当前版本对应程序集中读取的程序文件记为第二程序文件。
S120,获取第一程序文件中的第一非代码变量节点,并将第一非代码变量节点的节点内容替换为预设字符,得到第一待对比程序文件。
例如,PE文件中的非代码变量包括程序文件的时间戳、MVID(程序集模块的ID)和PDB(Program Database,程序数据库)文件的ID中的至少一项。
其中,PDB文件用于保存调试和项目状态信息,MVID是PE文件的唯一标识
对于第一程序文件,读取PE文件头结构体中的Time Data Stamp结构体,该结构体即整个程序文件的时间戳,并将该结构体内的内容全部替换为预设字符。
其中,预设字符可以是系统默认字符(例如,二进制数“0”),或者,用户指定的任意字符。
接着,读取PE文件头中的PE可选头中的数据目录(IMAGE_DATA_DIRECTORY)结构体,从该数据目录结构体中得到调试目录(DEBUG_DIR)结构体的起始位置和长度;然后,根据调试目录结构体的起始位置和长度读取到调试目录结构体中的内容,并将调试目录的内容全部替换为预设字符;其中,调试目录是程序集文件的调试目录信息,包括PDB文件的ID和PDB文件的时间戳。
最后,从元数据流中获得MVID,并将MVID的内容替换为预设字符。
S130,获取第二程序文件中的第二非代码变量节点,并将第二非代码变量节点的节点内容替换为所述预设字符,得到第二待对比程序文件。
与步骤S120相同,获取第二程序文件中程序文件的时间戳、调试目录信息和MVID,此处不在赘述。
S120和S130主要是将两个版本对应的名称相同的程序文件中非代码变量节点的节点内容替换为相同字符,然后,再比较整个程序的文件内容,相当于排除了两个程序文件中非代码变量对比较结果的影响。
S140,比较第一待对比程序文件和第二待对比程序文件的文件内容是否相同,如果不相同,则执行S150;如果相同,则结束当前流程。
比较处理后的两个程序文件的文件内容是否完全相同,可以采用MD5校验方式;将处理后的第一程序文件(即,第一待对比程序文件)的文件内容生成第一MD5码,以及,将处理后的第二程序文件(即,第二待对比程序文件)的文件内容生成第二MD5码,然后,比较第一MD5码和第二MD5码,如果两个MD5码相同,则两个程序文件的文件内容相同;如果两个MD5码不相同,则两个程序文件的文件内容不完全相同。
如果比较得到两个文件的文件内容相同,则确定两个文件的代码部分内容相同,则继续判断程序集中的下一个程序文件。
S150,确定第一程序文件和第二程序文件的代码部分不相同。
之前的S102和S103步骤已经将两个程序文件的非代码变量节点的内容统一替换为相同的内容,因此,两个程序文件的文件内容不同则表明两个程序文件的代码部分不同,至此实现自动找出两个版本中代码部分不同的程序文件。
可选地,可以在比较得到的文件内容不相同的程序文件
本实施例提供的程序文件对比方法,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的非代码变量节点,并将两个程序文件中的非代码变量节点都替换为预设字符,即经过替换后,两个程序文件的非代码变量分别对应相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该方法能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
请参见图3,示出了本发明实施例一种非代码变量在PE文件中的分布示意图。
当一个PE文件从硬盘中加载到内存中以后,称之为“映象”(image),一般来说,PE文件被加载到内存以后其占用的虚拟地址空间要比在硬盘上占用的空间大一些,因为PE文件的各个节在硬盘上是连续的,而在内存中是按页对齐的,所以加载到内存以后PE文件的各个节之间会出现一些“空洞”。
因为存在这种按页对齐,所以在PE文件内部,表示某个位置的地址采用两种方式,针对在硬盘上存储文件中的地址,称为原始存储地址或物理地址表示距离文件头的偏移;另外一种是针对加载到内存以后映象中的地址,称为相对虚拟地址(Relative VirtualAddress,RVA),表示相对内存映象头的偏移,相对虚拟地址=虚拟地址-基址。
然而,CPU的某些指令需要使用绝对地址,例如,全局变量的地址、传递函数的地址,编译后的汇编指令中需要用到绝对地址而不是相对内存映象头的偏移。因此,操作系统将PE文件加载到某个内存地址(即,代码基址),编译器便根据这个代码基址求出代码中一些全局变量和函数的地址,并将这些地址用到对应的指令中。
下面将以一个具体实例详细介绍对要对比的两个程序文件进行预处理的过程:
(1),读取PE文件第61-64字节内的内容,得到PE文件头的起始位置;
所述PE文件头的起始位置是指PE文件的相对位置的起始位置。
(2)读取PE文件第9-12字节中的内容,得到PE文件头结构体中的Time Data Stamp结构体(即,整个程序文件的时间戳)中的内容,并将Time Data Stamp结构体中的内容全部替换为预设字符。
该步骤是将整个程序文件的时间戳内容替换为预设字符,例如,二进制数“0”,即删掉时间戳信息。
(3)读取PE文件第21-22字节中的内容,得到PE可选头(IMAGE_OPTION_HEADER)长度;该PE可选头结构体包含数据目录(IMAGE_DATA_DIRECTORY)结构体;
(4)读取PE文件45-48字节中的内容,得到代码基址(BASE OF CODE)数值。
代码基址是当PE文件被加载进终端设备内存时代码节的开头RVA。
(5)读取PE文件85-88字节的内容,得到头大小(SIZE OF HEADERS)数值。
头大小是DOS头部分和PE文件头部分的总大小,可以以此值作为PE文件第一节的文件偏移量。换言之,代码基址和头大小之和是真正的偏移量。
(6)读取PE文件169-172字节的内容,得到调试目录(DEBUG_DIR)的地址。
其中,数据目录结构体中的49-52字节存储的是调试目录的起始位置。根据数据目录的起始位置,能够计算出数据目录结构体中49-52字节就是PE文件的169-172字节。
根据上述(4)和(5)得到的代码基址和头大小可以计算出PE文件169-172字节对应的RVA,并读取该RVA对应存储空间内的内容,得到调试目录的地址。
调试目录包含程序集文件的调试信息,例如,调试文件路径、PDB文件的ID序号和PDB文件的时间戳。PDB文件用于保存调试和项目状态信息。
(7)读取PE文件173-176字节的内容,得到调试目录的长度。
数据目录结构体中的53-56字节(即,整个PE文件的173-176字节)存储的是调试目录的长度。与读取调试目录地址的过程相同,根据代码基址和头大小计算出PE文件的173-176字节对应的RVA,并读取该RVA对应存储空间内的内容,得到调试目录的长度。
(8)根据调试目录的地址和长度,将调试目录中的内容全部替换为预设字符。
该步骤是将PDB文件的ID和时间戳替换为预设字符,例如,二进制数“0”,当然也可以是其它字符本申请对此并不限定。
以下步骤是读取MVID的过程:
(9)数据目录(IMAGE_DATA_DIRECTORY)结构体的第15个成员(即,PE文件233-236字节中的内容)是元数据目录(.net metadatadirectory)的起始位置;PE文件第237-240字节中的内容是元数据目录的长度。
元数据目录结构体中包含元数据(metadata)的起始位置和长度信息。
元数据目录中的第四个成员是元数据的起始位置,由于元数据目录中前三个成员的总长度是8,因此,“元数据目录的起始位置+8”就是元数据的起始位置。元数据的起始位置即元数据标头的位置。
(10)读取元数据目录的后8个字节的内容,得到.NET目录的起始位置(即,.netindex)和长度。
(11)从.NET目录结构体中确定元数据流的位置,并从元数据流中确定#GUID的起始位置和长度。
具体的,.NET目录中存储元数据标头和元数据流,元数据流中保存有#~,#string,#us,#GUID的起始位置和长度。其中,元数据流位于元数据标头之后,且元数据标头包含的成员和各个成员的长度固定不变,因此,确定出元数据标头的起始位置和总长度后,即可确定元数据流的位置。
确定元数据流的位置后,可以从元数据流中直接读取#GUID的起始位置和长度,并根据#GUID的起始位置和长度,读取#GUID结构体中的内容。其中,#GUID中存储的是MVID的起始位置和长度,其中MVID的长度是16个字节,MVID是PE文件的唯一标识,是PE文件中的非代码变量部分。
从MVID的起始位置开始的16个字节中的内容替换为预设字符(例如,二进制数“0”),当然也可以是其它的字符,本申请对此并不限定。
经过上述处理后并分别保存文件数据,本次版本对应处理后的程序文件即上述实施例中的第二待对比程序文件,上一次版本对应处理后的程序文件即上述实施例中的第一待对比程序文件。
请参见图4,为本发明实施例另一种程序文件对比方法的流程示意图,在图2所示实施例的基础上还包括以下步骤:
S210,记录比较得到的文件内容不相同的文件名称。
存储步骤S140中比较得到文件内容不相同的程序文件对应的文件名称。
S220,从当前版本的程序集中获取所述文件名称对应的程序文件。
依据该文件名称对应的文件路径复制该文件名称对应的程序文件到输出目录,该输出目录中的程序文件用于得到程序增量包。
S230,将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
比较完程序集中的所有程序文件后,输出目录中包含两个版本的程序集中文件内容不相同的全部程序文件,即从当前版本的程序集中挑选出与上次版本不相同的程序文件,即得到程序增量包。
本实施例提供的程序文件对比方法能够自动识别出两个版本的程序文件中文件内容有差异的程序文件,自动输出有差异的程序文件集合(即,程序增量包),不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
相应于上述的程序文件对比方法实施例,本发明还提供了程序文件对比装置实施例。
请参见图5,示出了本发明实施例一种程序文件对比装置的框图,该装置应用于基于可移植的执行体PE文件的程序集中。如图5所示,该装置包括:第一获取模块110、第二获取模块120、第三获取模块130和比较模块140;
第一获取模块110,用于分别从编译后的上次版本和当前版本对应的程序集中,获取文件名称相同的第一程序文件和第二程序文件。
第二获取模块120,用于获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为预设字符,得到第一待对比程序文件。
其中,第一非代码变量节点和第二非代码变量节点包括程序文件的时间戳、PDB文件的ID号和MVID中的至少一项。
下面以第二获取模块为例说明时间戳、PDB文件的ID号和MVID获取过程:
当第一非代码变量节点包括所述程序文件的时间戳,则如图6所示,所述第二获取模块120包括:
确定子模块1211,用于确定所述第一程序文件的PE文件头的地址。
第一读取子模块1212,用于根据所述PE文件头的地址,读取PE文件头部结构体内的时间戳。
修改子模块1213,用于将所述时间戳的内容修改为所述预设字符。
若所述非代码变量节点包括PID,则如图7所示,第二获取模块120包括:
第二读取子模块1221,用于读取第一程序文件的PE文件头中的可选头部结构体。
第三读取子模块1222,用于读取可选头部结构体中的数据目录结构体。
第四读取子模块1223,用于从数据目录结构体中读取调试目录信息的地址和长度。
替换子模块1224,用于根据调试目录信息的地址和长度将所述调试目录信息的内容替换为预设字符。
若所述非代码变量节点包括MVID,则如图8所示第二获取模块120包括:
第五读取子模块1231,用于从所述第一程序文件的PE文件头中读取可选头部结构体,并从所述可选头部结构体中读取数据目录结构体;
第六读取子模块1232,用于从所述数据目录结构体中读取元数据目录的起始位置和长度;
第七读取子模块1233,用于根据所述元数据目录的起始位置和长度,从元数据目录结构体中获得.NET目录的起始位置和长度;
第八读取子模块1234,用于根据所述.NET目录的起始位置和长度,从所述.NET目录结构体中获取元数据流的起始位置;
第九读取子模块1235,用于根据所述元数据流的起始位置,从元数据流中读取#GUID的起始位置和长度;
第十读取子模块1236,用于根据#GUID的起始位置和长度,从#GUID结构体中获得所述MVID。
第三获取模块130,用于获取所述第二程序文件中的第二非代码变量节点,并将所述第二非代码变量节点的节点内容替换为所述预设字符,得到第二待对比程序文件。
比较模块140,用于比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
在本发明一种可能的实现方式中,如图9所示,比较模块140包括:
第一获取子模块141,用于获取所述第一待对比程序文件的第一第5版消息-摘要算法MD5校验码;
第二获取子模块142,用于获取所述第二待对比程序文件的第二MD5校验码;
比较子模块143,用于比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
本实施例提供的程序文件对比装置,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的非代码变量节点,并将两个程序文件中的非代码变量节点都替换为预设字符,即经过替换后,两个程序文件的非代码变量分别对应相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该装置能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
请参见图10,示出了本发明实施例另一种程序文件对比装置的框图,该装置在图5所示实施例的基础上还包括:
记录模块210,用于记录比较得到的文件内容不相同的文件名称。
第四获取模块220,用于从当前版本的程序集中获取所述文件名称对应的程序文件。
第五获取模块230,用于将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
本实施例提供的程序文件对比装置,能够自动识别出两个版本的程序文件中文件内容有差异的程序文件,自动输出有差异的程序文件集合(即,程序增量包),不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (12)
1.一种程序文件对比方法,其特征在于,应用于基于可移植的执行体PE文件的程序集中,该方法包括:
分别从编译后的上次版本和当前版本对应的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为预设字符,得到第一待对比程序文件;以及,
获取所述第二程序文件中的第二非代码变量节点,并将所述第二非代码变量节点的节点内容替换为所述预设字符,得到第二待对比程序文件;
比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同;
其中,所述第一、第二非代码变量节点均包括程序文件的时间戳、程序数据库PDB文件的身份识别ID号和程序集模块身份识别号MVID中的至少一项。
2.根据权利要求1所述的方法,其特征在于,若所述第一非代码变量节点包括所述程序文件的时间戳,则所述获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为所述预设字符,包括:
确定所述第一程序文件的PE文件头的地址;
根据所述PE文件头的地址,读取PE文件头部结构体内的时间戳;
将所述时间戳的内容修改为所述预设字符。
3.根据权利要求1所述的方法,其特征在于,若所述第一非代码变量节点包括所述PID,则所述获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为所述预设字符,包括:
读取所述第一程序文件的PE文件头中的可选头部结构体;
读取所述可选头部结构体中的数据目录结构体;
从所述数据目录结构体中读取调试目录信息的地址和长度;
根据所述调试目录信息的地址和长度将所述调试目录信息的内容替换为所述预设字符。
4.根据权利要求1所述的方法,其特征在于,若所述非代码变量节点包括所述MVID,则所述获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为所述预设字符,包括:
从所述第一程序文件的PE文件头中读取可选头部结构体,并从所述可选头部结构体中读取数据目录结构体;
从所述数据目录结构体中读取元数据目录的起始位置和长度;
根据所述元数据目录的起始位置和长度,从元数据目录结构体中获得.NET目录的起始位置和长度;
根据所述.NET目录的起始位置和长度,从所述.NET目录结构体中获取元数据流的起始位置;
根据所述元数据流的起始位置,从元数据流中读取#GUID的起始位置和长度;
根据所述#GUID的起始位置和长度,从所述#GUID结构体中获得所述MVID。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,包括:
获取所述第一待对比程序文件的第一第5版消息-摘要算法MD5校验码;
获取所述第二待对比程序文件的第二MD5校验码;
比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
记录比较得到的文件内容不相同的文件名称;
从当前版本的程序集中获取所述文件名称对应的程序文件;
将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
7.一种程序文件对比装置,其特征在于,应用于基于可移植的执行体PE文件的程序集中,该装置包括:
第一获取模块,用于分别从编译后的上次版本和当前版本对应的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
第二获取模块,用于获取所述第一程序文件中的第一非代码变量节点,并将所述第一非代码变量节点的节点内容替换为预设字符,得到第一待对比程序文件;
第三获取模块,用于获取所述第二程序文件中的第二非代码变量节点,并将所述第二非代码变量节点的节点内容替换为所述预设字符,得到第二待对比程序文件;
比较模块,用于比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同;
其中,所述第一、第二非代码变量节点均包括程序文件的时间戳、程序数据库PDB文件的身份识别ID号和程序集模块身份识别号MVID中的至少一项。
8.根据权利要求7所述的装置,其特征在于,若所述第一非代码变量节点包括所述程序文件的时间戳,则所述第二获取模块,包括:
确定子模块,用于确定所述第一程序文件的PE文件头的地址;
第一读取子模块,用于根据所述PE文件头的地址,读取PE文件头部结构体内的时间戳;
修改子模块,用于将所述时间戳的内容修改为所述预设字符。
9.根据权利要求7所述的装置,其特征在于,若所述第一非代码变量节点包括所述PID,则所述第二获取模块,包括:
第二读取子模块,用于读取所述第一程序文件的PE文件头中的可选头部结构体;
第三读取子模块,用于读取所述可选头部结构体中的数据目录结构体;
第四读取子模块,用于从所述数据目录结构体中读取调试目录信息的地址和长度;
替换子模块,用于根据所述调试目录信息的地址和长度将所述调试目录信息的内容替换为所述预设字符。
10.根据权利要求7所述的装置,其特征在于,若所述第一非代码变量节点包括所述MVID,则所述第二获取模块包括:
第五读取子模块,用于从所述第一程序文件的PE文件头中读取可选头部结构体,并从所述可选头部结构体中读取数据目录结构体;
第六读取子模块,用于从所述数据目录结构体中读取元数据目录的起始位置和长度;
第七读取子模块,用于根据所述元数据目录的起始位置和长度,从元数据目录结构体中获得.NET目录的起始位置和长度;
第八读取子模块,用于根据所述.NET目录的起始位置和长度,从所述.NET目录结构体中获取元数据流的起始位置;
第九读取子模块,用于根据所述元数据流的起始位置,从元数据流中读取#GUID的起始位置和长度;
第十读取子模块,用于根据所述#GUID的起始位置和长度,从所述#GUID结构体中获得所述MVID。
11.根据权利要求7-10任一项所述的装置,其特征在于,所述比较模块包括:
第一获取子模块,用于获取所述第一待对比程序文件的第一第5版消息-摘要算法MD5校验码;
第二获取子模块,用于获取所述第二待对比程序文件的第二MD5校验码;
比较子模块,用于比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
12.根据权利要求7所述的装置,其特征在于,所述装置还包括:
记录模块,用于记录比较得到的文件内容不相同的文件名称;
第四获取模块,用于从当前版本的程序集中获取所述文件名称对应的程序文件;
第五获取模块,用于将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611111262.0A CN106547572B (zh) | 2016-12-06 | 2016-12-06 | 一种程序文件对比方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611111262.0A CN106547572B (zh) | 2016-12-06 | 2016-12-06 | 一种程序文件对比方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106547572A true CN106547572A (zh) | 2017-03-29 |
CN106547572B CN106547572B (zh) | 2020-01-31 |
Family
ID=58397013
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611111262.0A Active CN106547572B (zh) | 2016-12-06 | 2016-12-06 | 一种程序文件对比方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106547572B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107479881A (zh) * | 2017-07-31 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 差异代码的同步方法、存储介质、电子设备及系统 |
CN108052344A (zh) * | 2017-12-11 | 2018-05-18 | 北京奇虎科技有限公司 | 一种内核差异检测方法及装置 |
CN108984182A (zh) * | 2018-08-21 | 2018-12-11 | 苏州蜗牛数字科技股份有限公司 | 一种程序编译控制方法 |
CN109542496A (zh) * | 2018-11-26 | 2019-03-29 | 中国银行股份有限公司 | 增量代码确定方法、装置及系统 |
CN110187897A (zh) * | 2019-05-28 | 2019-08-30 | 新华三技术有限公司 | 一种固件升级方法及装置 |
CN110765493A (zh) * | 2018-12-28 | 2020-02-07 | 北京安天网络安全技术有限公司 | 一种基于Linux预链接的文件基线防御方法、装置及存储设备 |
CN111176222A (zh) * | 2019-10-12 | 2020-05-19 | 浙江中控技术股份有限公司 | 一种基于组态差异识别的dcs控制器组态更新系统及方法 |
CN111858359A (zh) * | 2020-07-23 | 2020-10-30 | 珠海豹趣科技有限公司 | 可执行文件的工程代码位置获取方法和装置 |
CN112379910A (zh) * | 2020-12-28 | 2021-02-19 | 全时云商务服务股份有限公司 | 一种软件升级方法和装置 |
CN112486555A (zh) * | 2020-12-07 | 2021-03-12 | 浙江诺诺网络科技有限公司 | 软件增量升级方法、装置、设备及计算机可读存储介质 |
CN113741411A (zh) * | 2021-11-08 | 2021-12-03 | 西安热工研究院有限公司 | 一种分散控制系统全局变量点产物文件生成方法和系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080086517A1 (en) * | 2006-10-06 | 2008-04-10 | Stephane Rodgers | Method And System For Version Control In A Reprogrammable Security System |
US20110197175A1 (en) * | 2010-02-05 | 2011-08-11 | International Business Machines Corporation | Automated application generation method and system |
CN103713928A (zh) * | 2013-12-31 | 2014-04-09 | 优视科技有限公司 | 增量文件生成方法、应用程序安装文件更新方法及装置 |
CN103973475A (zh) * | 2013-02-05 | 2014-08-06 | 腾讯科技(深圳)有限公司 | 差异补丁包生成方法及下载方法、服务器、客户端 |
-
2016
- 2016-12-06 CN CN201611111262.0A patent/CN106547572B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080086517A1 (en) * | 2006-10-06 | 2008-04-10 | Stephane Rodgers | Method And System For Version Control In A Reprogrammable Security System |
US20110197175A1 (en) * | 2010-02-05 | 2011-08-11 | International Business Machines Corporation | Automated application generation method and system |
CN103973475A (zh) * | 2013-02-05 | 2014-08-06 | 腾讯科技(深圳)有限公司 | 差异补丁包生成方法及下载方法、服务器、客户端 |
CN103713928A (zh) * | 2013-12-31 | 2014-04-09 | 优视科技有限公司 | 增量文件生成方法、应用程序安装文件更新方法及装置 |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107479881A (zh) * | 2017-07-31 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 差异代码的同步方法、存储介质、电子设备及系统 |
CN107479881B (zh) * | 2017-07-31 | 2020-07-31 | 武汉斗鱼网络科技有限公司 | 差异代码的同步方法、存储介质、电子设备及系统 |
CN108052344A (zh) * | 2017-12-11 | 2018-05-18 | 北京奇虎科技有限公司 | 一种内核差异检测方法及装置 |
CN108984182A (zh) * | 2018-08-21 | 2018-12-11 | 苏州蜗牛数字科技股份有限公司 | 一种程序编译控制方法 |
CN109542496A (zh) * | 2018-11-26 | 2019-03-29 | 中国银行股份有限公司 | 增量代码确定方法、装置及系统 |
CN109542496B (zh) * | 2018-11-26 | 2021-07-02 | 中国银行股份有限公司 | 增量代码确定方法、装置及系统 |
CN110765493B (zh) * | 2018-12-28 | 2021-05-25 | 北京安天网络安全技术有限公司 | 一种基于Linux预链接的文件基线防御方法、装置及存储设备 |
CN110765493A (zh) * | 2018-12-28 | 2020-02-07 | 北京安天网络安全技术有限公司 | 一种基于Linux预链接的文件基线防御方法、装置及存储设备 |
CN110187897A (zh) * | 2019-05-28 | 2019-08-30 | 新华三技术有限公司 | 一种固件升级方法及装置 |
CN110187897B (zh) * | 2019-05-28 | 2022-05-31 | 新华三技术有限公司 | 一种固件升级方法及装置 |
CN111176222A (zh) * | 2019-10-12 | 2020-05-19 | 浙江中控技术股份有限公司 | 一种基于组态差异识别的dcs控制器组态更新系统及方法 |
CN111858359A (zh) * | 2020-07-23 | 2020-10-30 | 珠海豹趣科技有限公司 | 可执行文件的工程代码位置获取方法和装置 |
CN111858359B (zh) * | 2020-07-23 | 2024-01-30 | 珠海豹趣科技有限公司 | 可执行文件的工程代码位置获取方法和装置 |
CN112486555A (zh) * | 2020-12-07 | 2021-03-12 | 浙江诺诺网络科技有限公司 | 软件增量升级方法、装置、设备及计算机可读存储介质 |
CN112379910A (zh) * | 2020-12-28 | 2021-02-19 | 全时云商务服务股份有限公司 | 一种软件升级方法和装置 |
CN113741411A (zh) * | 2021-11-08 | 2021-12-03 | 西安热工研究院有限公司 | 一种分散控制系统全局变量点产物文件生成方法和系统 |
CN113741411B (zh) * | 2021-11-08 | 2022-02-01 | 西安热工研究院有限公司 | 一种分散控制系统全局变量点产物文件生成方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN106547572B (zh) | 2020-01-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106547572A (zh) | 一种程序文件对比方法及装置 | |
CN103984582B (zh) | 一种热更新方法和装置 | |
US8261241B2 (en) | Converting format strings to regular expressions | |
CN106843842B (zh) | 一种应用程序配置文件的更新方法及装置 | |
JP2007094449A5 (zh) | ||
EP1587006A2 (en) | Method and system for renaming consecutive keys in a B-tree | |
CN110162525A (zh) | 基于b+树的读写冲突解决方法、装置及存储介质 | |
CN106951451A (zh) | 一种网页内容提取方法、装置及计算设备 | |
CN110457628A (zh) | 网页版本校验方法、装置、设备及存储介质 | |
US7814328B1 (en) | Digital signatures for embedded code | |
CN109491962B (zh) | 一种文件目录树管理方法及相关装置 | |
CN113704706A (zh) | 代码加固方法、装置 | |
CN113177168A (zh) | 一种基于Web元素属性特征的定位方法 | |
US6542884B1 (en) | Methods and systems for updating an inheritance tree with minimal increase in memory usage | |
CN108694049B (zh) | 一种更新软件的方法和设备 | |
CN106547573A (zh) | 一种程序文件对比方法及装置 | |
Fu et al. | Digital forensics of Microsoft Office 2007–2013 documents to prevent covert communication | |
US10262026B2 (en) | Relational file database and graphic interface for managing such a database | |
KR101624387B1 (ko) | 소프트웨어 버스마크에 기반한 소프트웨어 자산 관리 방법 및 그 장치 | |
US20120109911A1 (en) | Compression Of XML Data | |
Dangar | Learning laravel 4 application development | |
US20070150853A1 (en) | Method for processing assembly of data blocks using associated control application | |
CN113434748A (zh) | 基于模板标注的分布式爬虫方法、装置、计算机装置及计算机可读存储介质 | |
CN114610305A (zh) | 隐形网页资源的开发方法、装置、电子设备及介质 | |
Limare | Reproducible research, software quality, online interfaces and publishing for image processing |
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 |