专利名称::文件至宿主文件中的捆绑方法和装置的制作方法
技术领域:
:本发明涉及通信领域,具体涉及一种文件至宿主文件中的捆绑方法和装置。
背景技术:
:文件捆绑又可以称为文件隐藏,具体做法是在一个文件中捆绑其他的文件,以达到减少文件个数或隐藏部分文件的效果。其中,捆绑其他文件的文件称为宿主文件,被捆绑到宿主文件中的文件称为捆绑文件。由于PE文件结构本身存在着很多冗余空间,因此,PE文件经常作为宿主文件,在其中捆绑其他文件。PE文件存在的通常比较大的空闲空间为(I)相邻节表之间由于数据对齐所产生的冗余空间;(2)PE文件的最末的节表之后由于数据对齐产生的冗余空间。(3)PE结构中的DOSStub是为DOS程序预留的,其只有当该文件在在DOS下执行时,才会发挥真正的作用。因此,在Windows平台下,DOSStub完全没有作用,可以利用这部分的内容用来隐藏文件内容。(4)PE文件结构中的很多字段作为保留存在或者对可执行程序的执行没有影响,这部分的空间也可以用来隐藏文件内容,例如PE文件中的以下结构MajorLinkerVersion、MinorLinkerVersion>ajorOperatingSystemVersion、MinorOperatingSystemVersion>Checksum、SizeOfCode>SizeOfInitializedData以及SizeOfUninitializedData等。目前,在PE文件中捆绑其他文件时,首先需要寻找PE文件中的冗余空间,并计算出每个冗余空间的位置和大小,图I示出了对PE文件的冗余空间进行计算后得到的结果。从图I中可以看到,寻找到的PE文件中的冗余空间共有8处,其中,DOSStub部分的空闲空间为264B,节表和节之间的空闲空间为3280B,最后一个节后面的空闲空间为3328B,另外,reloc(重定位表信息)节、rsrc(资源)节、idata(导入文件名表)节、rdata(只读的初始化数据)节以及text(.exe或.dll文件的可执行代码)节中也都存在着冗余空间,全部冗余空间的大小总共为17488B。然后,根据冗余空间的总数量以及每个冗余空间的大小,将捆绑文件分割成若干个指定大小的子文件,其中,子文件的个数可以小于或等于冗余空间的总数量,子文件的大小与冗余空间的大小基本一致。最后,将分割后的各个子文件按一定的算法分配到PE文件的冗余空间中。但是,采用上述方式时,由于PE文件结构中的冗余空间容量较小且不连续,因此,比较适合对零散的小文件进行捆绑,通常无法对体积较大的文件进行捆绑。而且,由于PE文件结构中的冗余空间基本上都集中在PE文件的头部,因此,导致捆绑文件全部集中在PE文件的头部,信息量过于集中,因此,很容易被格式检查工具检测为异常进而报错,从而出现误报的情况。
发明内容鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的文件至宿主文件中的捆绑方法和相应的文件至宿主文件中的捆绑装置。依据本发明的一个方面,提供了一种文件至宿主文件中的捆绑方法,宿主文件包括多个以一定顺序排列的用于存储数据的节,该方法包括将待捆绑的文件转换为与宿主文件的格式相对应的捆绑文件,并生成捆绑文件的配置信息,所述配置信息包括用于指示捆绑文件是否可执行的参数信息、用于在所述宿主文件中定位所述捆绑文件的位置信息,以及用于指示捆绑文件执行时的跳转地址的跳转指令;将捆绑文件以及配置信息存储在宿主文件的最后一个节中;根据捆绑文件以及配置信息,修改宿主文件的最后一个节的结构信息以及宿主文件的结构信息。可选地,将待捆绑的文件转换为与宿主文件的格式相对应的捆绑文件的步骤之前进一步包括对待捆绑的文件内容进行压缩和/或加密处理。可选地,宿主文件还包括多个以一定顺序排列的用于存储节的结构信息的节表,则修改宿主文件的最后一个节的结构信息具体包括修改宿主文件的最后一个节表中的信息,最后一个节表用于存储最后一个节的结构信息,其中,最后一个节表中的信息包括节数据的大小,以及节数据的属性。可选地,宿主文件的结构信息包括宿主文件的文件大小以及宿主文件的入口函数。可选地,将捆绑文件以及配置信息存储在宿主文件的最后一个节中;根据捆绑文件以及配置信息的大小,修改宿主文件的最后一个节的结构信息以及宿主文件的结构信息的步骤具体包括申请一块内存空间,将宿主文件复制到内存空间,在复制的宿主文件的最后一个节中存储捆绑文件以及配置信息;根据捆绑文件以及配置信息的大小,修改复制的宿主文件的最后一个节的结构信息以及复制的宿主文件的结构信息;将修改后的宿主文件复制回磁盘空间。可选地,宿主文件为PE文件。根据本发明的另一方面,提供了一种文件至宿主文件中的捆绑装置,宿主文件包括多个以一定顺序排列的用于存储数据的节,该装置包括转换单元,其将待捆绑的文件转换为与宿主文件的格式相对应的捆绑文件,并生成捆绑文件的配置信息,所述配置信息包括用于指示捆绑文件是否可执行的参数信息、用于在所述宿主文件中定位所述捆绑文件的位置信息,以及用于指示捆绑文件执行时的跳转地址的跳转指令;捆绑单元,其将捆绑文件以及配置信息存储在宿主文件的最后一个节中;修改单元,其根据捆绑文件以及配置信息,修改宿主文件的最后一个节的结构信息以及宿主文件的结构信息。可选地,宿主文件还包括多个以一定顺序排列的用于存储节的结构信息的节表,则修改单元具体用于修改宿主文件的最后一个节表中的信息,最后一个节表用于存储最后一个节的结构信息,其中,最后一个节表中的信息包括节数据的大小,以及节数据的属性。可选地,宿主文件的结构信息包括宿主文件的文件大小以及宿主文件的入口函数。根据本发明的文件至宿主文件中的捆绑方法和相应的装置,可以在宿主文件的最后一个节中捆绑任意长度的文件,由此解决了现有技术中只能捆绑零散的小文件,且由于宿主文件头部的信息量过于集中而可能导致报错的问题,取得了能够捆绑任意长度的大文件,且不易被报错的有益效果。上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的附图标记表示相同的部件。在附图中图I示出了现有技术中对PE文件的冗余空间进行计算后得到的结果示意图2示出了根据本发明一个实施例的文件至宿主文件中的捆绑方法的流程图3示出了本发明一个实施例的原始的宿主文件以及捆绑了三个捆绑文件之后的宿主文件的结构示意图;以及图4示出了根据本发明一个实施例的文件至宿主文件中的捆绑装置的结构图。具体实施方式下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。图2示出了本发明实施例提供的一种文件至宿主文件中的捆绑方法。具体地,宿主文件可以是PE文件,或其他与PE文件具有类似结构的文件。在下面的描述中,以宿主文件是PE文件为例进行描述。为了便于理解,先简单介绍一下PE文件的结构。PE文件主要包括若干个以一定顺序排列的用于存储数据的节(section)。其中,每一个节所占用的存储空间相同,但是,每个节中存储的实际数据长度可能不同,因此,每个节中可能都具有用于存储数据的有效空间以及剩余的空闲空间。为了了解每个节中存储数据的情况,需要定义节的结构信息。节的结构信息具体包括一个节中存储的实际数据长度、节的起始地址等。因此,为了对每一个节的结构信息进行存储,PE文件中还包括若干个以一定顺序排列的用于存储节的上述结构信息的节表(sectiontable)。一般情况下,节表的数量与节的数量一致,每一个节表用于存储对应节的结构信息,例如,第一个节表用于存储第一个节的结构信息,第二个节表用于存储第二个节的结构信息,依此类推。如图2所示,该方法始于步骤S210,在步骤S210中,将待捆绑的文件转换为与宿主文件的格式相对应的捆绑文件,并生成捆绑文件的配置信息。其中,宿主文件(即PE文件)的格式为汇编语言数据结构定义的格式,因此,在本步骤中,首先需要将待捆绑的文件转换为汇编语言数据结构定义格式的文件作为捆绑文件,从而与宿主文件的格式相对应。另外,还需要生成该捆绑文件的配置信息。其中,配置信息可以包括用于指示捆绑文件是否可执行的参数信息、用于在宿主文件中定位捆绑文件的位置信息,以及用于指示捆绑文件执行时的跳转地址的跳转指令。可选地,在执行步骤S210之前,还可以进一步对待捆绑的文件内容进行压缩和/或加密处理,以减少待捆绑的文件的体积,或者使待捆绑的文件无法被未授权者读取,以提高安全性。在执行完步骤S210,得到捆绑文件和配置信息之后,执行步骤S220。在步骤S220中,将步骤S210中生成的捆绑文件以及配置信息存储在宿主文件的最后一个节中。执行完步骤S220后,继续执行步骤S230。在步骤S230中,根据上述捆绑文件以及配置信息的大小,修改宿主文件的最后一个节的结构信息以及宿主文件的结构信息。其中,在原始的宿主文件,即PE文件中,每个节所占用的存储空间都是相同的,且每个节对应的节表中存储了该节的结构信息,如该节存储的实际数据长度等。但是,在执行完步骤S220之后,由于在原始的宿主文件的最后一个节中进一步存储了上述的捆绑文件及配置信息,导致最后一个节的实际数据长度增加了,因此,最后一个节的结构信息也随之发生了改变,进而导致整个宿主文件的结构信息也发生了改变。所以,在步骤S230中需要根据上述的捆绑文件及配置信息的大小,修改宿主文件的最后一个节的结构信息以及宿主文件的结构信息,以便与加入捆绑文件后的情况相符。其中,根据上面的描述可知,宿主文件中还包括多个以一定顺序排列的用于存储节的结构信息的节表,因此,在步骤S230中修改宿主文件的最后一个节的结构信息时,只需修改宿主文件的最后一个节表中的信息即可。另外,宿主文件的结构信息主要包括宿主文件的文件大小以及宿主文件的入口函数,因此,在步骤S230中还需要相应地修改上述信肩、O具体地,在执行上述步骤S220和步骤S230时,可通过如下方式实现首先,申请一块内存空间,将宿主文件复制到该内存空间中,在复制的宿主文件的最后一个节中存储捆绑文件以及配置信息;然后,根据捆绑文件以及配置信息,修改复制的宿主文件的最后一个节的结构信息以及复制的宿主文件的结构信息;最后,将修改后的宿主文件复制回磁盘空间即可。采用上述方式可以实现对一个或多个文件的捆绑,而且,当捆绑文件的长度较长时,宿主文件最后一个节的长度可以扩展,因此,可以实现对大文件的捆绑。下面以一个优选实施例详细描述一下本发明提供的在宿主文件中捆绑文件的方法,在该方法中,宿主文件为PE文件。该方法包括以下步骤步骤一对待捆绑的文件进行压缩和/或加密处理。在本步骤中,可以对待捆绑的文件的文件内容进行压缩和/或加密两种处理方式。通过压缩可以缩小待捆绑文件的体积,从而更方便地捆绑到宿主文件中。在压缩时,可以采用多种算法,如aplib算法。通过加密可以使待捆绑的文件无法被未授权者读取,从而提高了文件的安全性。步骤二将压缩和/或加密处理后的待捆绑文件转换为与宿主文件格式一致(即汇编语言数据结构定义的格式)的文件作为捆绑文件,在下文中,捆绑文件中的内容也称为字节码。可选地,也可以不执行步骤一,直接执行步骤二,尤其是在待捆绑的文件也为PE文件的时候。步骤三生成捆绑文件的配置信息。捆绑文件被捆绑到宿主文件中之后,当读取到捆绑在宿主文件中的捆绑文件时,会将捆绑文件释放出来。为了确定释放出来的捆绑文件是否可执行,以及何时执行,就需要用到本步骤中生成的配置信息。具体的,配置信息通常包括以下内容用于指示捆绑文件是否可执行的参数信息、用于在宿主文件中定位捆绑文件的位置信息,以及用于指示捆绑文件执行时的跳转地址的跳转指令等。其中,用于指示捆绑文件是否可执行的参数例如可以通过一个标志变量isInExeSequence实现,如果isInExeSequence=0表示不对释放出来的捆绑文件执行运行操作,即捆绑文件不可执行,如果isInExeSequence=l表示要对释放出来的捆绑文件执行运行操作,即捆绑文件可执行。另外,还可以额外设置一个参数,用来规定释放出来的捆绑文件何时执行,例如立即执行,或3分钟后执行等。用于在宿主文件中定位捆绑文件的位置信息例如可以通过一个表示捆绑文件在宿主文件中的位置偏移的dwFileOffset参数来实现。另外,还可以设置一个dwFileSize参数来表示捆绑文件在宿主文件中所占的大小,同时还可以定义一个name参数来表示捆绑文件的名称。上述的参数可以通过如下的结构体进行定义Typedefstruct{Stringname;BOOLisInExeSequence;DWORDdwFiIeOffset;DWORDdwFileSize;}FILE_BINDED_STRUCT;上述的结构体可以存储在捆绑文件中的内容(即字节码)的前面或后面,也可以插入字节码的中间。另外,用于指示捆绑文件执行时的跳转地址的跳转指令可以通过E9指令来实现。具体地,可以先将一个操作数为空的E9指令附加到字节码的最后,然后,在后续的步骤中根据实际情况修改E9指令的操作数,从而定义捆绑文件执行时的跳转地址。该跳转地址一般指向与字节码相对应的代码,该代码也存储在宿主文件中,用于具体执行字节码中的数据内容。步骤四将宿主文件复制到内存中,并将步骤二和步骤三中生成的捆绑文件和配置信息存储到宿主文件的最后一个节中。可选地,为了在本步骤中更准确地对宿主文件进行定位,先要获得原始的宿主文件的大小,然后,计算宿主文件最后一个节表在文件中的偏移,以便读取最后一个节表中的数据。其中,计算最后一个节表在文件中的偏移时,可以采用如下代码实现PSectionHeader=(PIMAGE_SECTI0N_HEADER)((BYTE*)pOptionalHeader+sizeof(IMAGE_0PTI0NAL_HEADER));nSectionNum=pFileHeader->NumberOfSections;for(inti=0;i〈nSectionNum_l;i++){pSectionHeader++;}其中,pSectionHeader表示最后一个节表在文件中的偏移量,通过上面的方式,即可确定出最后一个节表的位置,并读取其中的数据。具体地,节表中包含的数据包括表示对应的节中存储的实际数据长度的SizeOfRawData参数,指示节的起始地址的PointerToRawData参数以及表示节的属性值的Characteristics参数。在本步骤中,主要是读取SizeOfRawData参数以及PointerToRawData参数的值,通过PointerToRawData参数可以确定最后一个节的起始地址,结合SizeOfRawData参数即可确定最后一个节中实际存储的数据的结束地址。通过上面的方式,确定出宿主文件的上述相关信息后,就可以根据宿主文件的最后一个节的起始地址和结束地址等信息,在最后一个节中存储捆绑文件和配置信息了。由于原始的宿主文件是存储在磁盘上的,如果直接在磁盘空间对原始的宿主文件进行修改,由于文件中存储的程序内部包含指针,且由于指针的使用容易产生错误,因此,在本实施例中,先将宿主文件复制到内存中,在内存中完成对宿主文件的修改之后再复制回磁盘,由此避免因指针问题而导致的错误。为此,需要先计算原始的宿主文件大小与捆绑文件和配置信息的大小之和,得出捆绑后的宿主文件大小。然后,根据计算出的捆绑后的宿主文件大小申请一块内存空间,将原始的宿主文件复制到该内存空间中,然后将捆绑文件和配置信息存储到复制后的宿主文件的最后一个节中。另外,由于宿主文件在磁盘空间中的对齐粒度和内存空间中的对齐粒度有可能不同,因此,当宿主文件在磁盘空间中的对齐粒度和内存空间中的对齐粒度不同时,为了将宿主文件复制到内存空间,还需要进一步计算宿主文件在内存空间中的对齐粒度,为此,可以按照内存空间中的对齐粒度将宿主文件的最后一个节进行对齐,以确定内存中宿主文件的最后一个节的数据长度。具体对齐时,可采用如下代码实现intAlign(intsize,int权利要求1.一种文件至宿主文件中的捆绑方法,所述宿主文件包括多个以一定顺序排列的用于存储数据的节,该方法包括将待捆绑的文件转换为与所述宿主文件的格式相对应的捆绑文件,并生成所述捆绑文件的配置信息,所述配置信息包括用于指示捆绑文件是否可执行的參数信息、用于在所述宿主文件中定位所述捆绑文件的位置信息,以及用于指示捆绑文件执行时的跳转地址的跳转指令;将所述捆绑文件以及所述配置信息存储在所述宿主文件的最后ー个节中;根据所述捆绑文件以及所述配置信息,修改所述宿主文件的最后ー个节的结构信息以及所述宿主文件的结构信息。2.如权利要求I所述的方法,所述将待捆绑的文件转换为与所述宿主文件的格式相对应的捆绑文件的步骤之前进ー步包括对所述待捆绑的文件内容进行压缩和/或加密处理。3.如权利要求I或2所述的方法,所述宿主文件还包括多个以一定顺序排列的用于存储节的结构信息的节表,则所述修改所述宿主文件的最后ー个节的结构信息具体包括修改所述宿主文件的最后ー个节表中的信息,所述最后一个节表用于存储最后ー个节的结构信息,其中,所述最后一个节表中的信息包括节数据的大小,以及节数据的属性。4.如权利要求1-3中任一个所述的方法,所述宿主文件的结构信息包括宿主文件的文件大小以及宿主文件的入ロ函数。5.如权利要求1-4中任一个所述的方法,所述将所述捆绑文件以及所述配置信息存储在所述宿主文件的最后ー个节中;根据所述捆绑文件以及所述配置信息的大小,修改所述宿主文件的最后ー个节的结构信息以及所述宿主文件的结构信息的步骤具体包括申请ー块内存空间,将所述宿主文件复制到所述内存空间,在复制的宿主文件的最后一个节中存储所述捆绑文件以及所述配置信息;根据所述捆绑文件以及所述配置信息的大小,修改所述复制的宿主文件的最后ー个节的结构信息以及所述复制的宿主文件的结构信息;将修改后的宿主文件复制回磁盘空间。6.如权利要求1-5中任一个所述的方法,所述宿主文件为PE文件。7.一种文件至宿主文件中的捆绑装置,所述宿主文件包括多个以一定顺序排列的用于存储数据的节,该装置包括转换单元,其将待捆绑的文件转换为与所述宿主文件的格式相对应的捆绑文件,井生成所述捆绑文件的配置信息,所述配置信息包括用于指示捆绑文件是否可执行的參数信息、用于在所述宿主文件中定位所述捆绑文件的位置信息,以及用于指示捆绑文件执行时的跳转地址的跳转指令;捆绑单元,其将所述捆绑文件以及所述配置信息存储在所述宿主文件的最后ー个节中;修改単元,其根据所述捆绑文件以及所述配置信息,修改所述宿主文件的最后ー个节的结构信息以及所述宿主文件的结构信息。8.如权利要求7所述的装置,所述宿主文件还包括多个以一定顺序排列的用于存储节的结构信息的节表,则所述修改単元具体用于修改所述宿主文件的最后ー个节表中的信息,所述最后一个节表用于存储最后ー个节的结构信息,其中,所述最后一个节表中的信息包括节数据的大小,以及节数据的属性。9.如权利要求7或8所述的装置,所述宿主文件的结构信息包括宿主文件的文件大小以及宿主文件的入ロ函数。全文摘要本发明公开了一种文件至宿主文件中的捆绑方法和装置,所述宿主文件包括多个以一定顺序排列的用于存储数据的节,该装置包括转换单元;捆绑单元;修改单元。根据本发明的文件至宿主文件中的捆绑方法和相应的装置,可以在宿主文件的最后一个节中捆绑任意长度的文件,由此解决了现有技术中只能捆绑零散的小文件,且由于宿主文件头部的信息量过于集中而可能导致报错的问题,取得了能够捆绑任意长度的大文件,且不易被报错的有益效果。文档编号G06F17/30GK102982073SQ20121042123公开日2013年3月20日申请日期2012年10月29日优先权日2012年10月29日发明者马茂刚申请人:北京奇虎科技有限公司,奇智软件(北京)有限公司