一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

加固ELF文件的加载方法、设备、存储介质及装置与流程

2022-02-25 18:52:06 来源:中国专利 TAG:

加固elf文件的加载方法、设备、存储介质及装置
技术领域
1.本发明涉及加固elf文件的加载
技术领域
,尤其涉及加固elf文件的加载方法、设备、存储介质及装置。
背景技术
:2.现有的so加固技术为android定制的so加固,so内容作为数据放入壳代码中,壳单独编译成so文件,并释放so的数据到内存。因androidso的加载机制,如通过java层调用so,则必定会调用jni_onload函数,且该函数只做一次调用,所以解密和还原so的逻辑可放在jni_onload中实现。3.android定制的so加固安全性较高,但适用性和兼容性较低,jni_onload中做解密处理限制了so必须在java层调用,不支持c的接口,同时因隐藏so所有内容,导出函数在加载完成前没有被还原,加固的so不能作为其他so的依赖去使用。技术实现要素:4.本发明的主要目的在于提供加固elf文件的加载方法、设备、存储介质及装置,旨在解决如何提高加固的elf进行加载时的兼容性。5.为实现上述目的,本发明提供一种加固elf文件的加载方法,所述加固elf文件的加载方法包括以下步骤:6.在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数;7.根据所述预设初始化函数得到解密函数以及重定位信息;8.根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件;9.根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载。10.可选的,所述在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数,包括:11.在获取到加固elf文件的加载请求时,判断所述加固elf文件的文件类型;12.在所述加固elf文件的文件类型为可执行文件时,将start函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用start函数;13.在所述加固elf文件的文件类型为动态链接库文件时,将init函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用init函数。14.可选的,根据所述预设初始化函数得到解密函数之前,所述方法还包括:15.获取所述预设初始化函数的函数地址;16.将所述函数地址调整为解密函数的跳转地址;17.所述根据所述预设初始化函数得到解密函数,包括:18.根据所述预设初始化函数的跳转地址得到解密函数。19.可选的,所述加固elf文件包括执行代码函数;20.所述根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数之前,所述方法还包括:21.将所述加固elf文件的动态链接库接口信息指向执行代码函数,将所述执行代码函数指向填充函数;22.将所述填充函数指向预设初始化函数。23.可选的,所述加固elf文件包括导出符号信息;24.根据所述预设初始化函数得到重定位信息之前,所述方法还包括:25.将所述加固elf文件的导出符号信息指向预设初始化函数;26.所述预设初始化函数得到重定位信息,包括:27.根据所述预设初始化函数得到所述加固elf文件的导出符号信息;28.对所述导出符号信息进行解析,得到重定位信息。29.可选的,所述在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数之前,所述方法还包括:30.获取待加固elf文件;31.确定所述待加固elf文件中的预设预留数据以及对应的预留区域信息;32.将所述预设预留数据以及对应的预留区域信息写入壳代码中,生成壳文件;33.获取所述待加固elf文件中的解密函数和重定位信息,将所述解密函数和重定位信息指向预设初始化函数,根据所述预设初始化函数得到动态链接库接口信息;34.根据解密函数对所述待加固elf文件的数据部分和代码部分进行加密,得到加密数据;35.根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件。36.可选的,所述根据解密函数对所述待加固elf文件的数据部分和代码部分进行加密,得到加密数据之前,所述方法还包括:37.根据所述动态链接库接口信息对所述待加固elf文件中的原始数据进行分析,以判断所述待加固elf文件中的原始数据是否含有与所述动态链接库接口信息关联的数据;38.在所述待加固elf文件中的原始数据未含有与所述动态链接库接口信息关联的数据时,将未含有与所述动态链接库接口信息关联的数据作为数据部分。39.此外,为实现上述目的,本发明还提出一种加固elf文件的加载装置,所述加固elf文件的加载装置包括:40.调用模块,用于在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数;41.确定模块,用于根据所述预设初始化函数得到解密函数以及重定位信息;42.解密模块,用于根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件;43.重定位模块,用于根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载。44.此外,为实现上述目的,本发明还提出一种加固elf文件的加载设备,所述加固elf文件的加载设备包括:存储器、处理器及存储在所述存储器上并在所述处理器上运行加固elf文件的加载程序,所述加固elf文件的加载程序被所述处理器执行时实现如上文所述的加固elf文件的加载方法的步骤。45.此外,为实现上述目的,本发明还提出一种存储介质,所述存储介质上存储有加固elf文件的加载程序,所述加固elf文件的加载程序被处理器执行时实现如上文所述的加固elf文件的加载方法的步骤。46.本发明提供的技术方案,通过在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数;根据所述预设初始化函数得到解密函数以及重定位信息;根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件;根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载,从而可通过在加固elf文件上设有动态链接库接口信息,通过动态链接库接口信息调用预设初始化函数,从而得到解密函数以及重定位信息,实现加固elf文件的加载,避免了调用android平台上的jni_onload函数,可实现所有平台的加固elf文件的加载,达到提高加固的elf进行加载时的兼容性的目的。附图说明47.图1是本发明实施例方案涉及的硬件运行环境的加固elf文件的加载设备结构示意图;48.图2为本发明加固elf文件的加载方法第一实施例的流程示意图;49.图3为本发明加固elf文件的加载方法一实施例的elf文件格式;50.图4为本发明加固elf文件的加载方法一实施例的elf文件加载流程示意图;51.图5为本发明加固elf文件的加载方法第二实施例的流程示意图;52.图6为本发明加固elf文件的加载方法一实施例的执行还原流程示意图;53.图7为本发明加固elf文件的加载方法第三实施例的流程示意图;54.图8为本发明加固elf文件的加载方法一实施例的加固处理流程示意图;55.图9为本发明加固elf文件的加载装置第一实施例的结构框图。56.本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。具体实施方式57.应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。58.本技术实施例涉及的主要技术术语包括:59.shellcode,shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。可在暂存器溢出后,塞入一段可让cpu执行的shellcode机器码,让电脑可以执行攻击者的任意指令。60.elf,一种文件格式,由4部分组成,分别是elf头(elfheader)、程序头表(programheadertable)、节(section)和节头表(sectionheadertable)。实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有elf头的位置是固定的,其余各部分的位置、大小等信息由elf头中的各项值来决定。61.so文件格式,即可执行与可链接格式(executableandlinkableformat,elf)文件格式,它是linux下可执行文件,共享库文件和目标文件的统一格式。62.linker,动态链接库加载和可执行文件加载到内存。63.so加固,是指对so文件中指定的段进行加密来实现对so加固,从而保证so文件的安全性。64.重定向,是指将程序的逻辑地址空间变换为内存中的实际物理地址空间的过程。65.参照图1,图1为本发明实施例方案涉及的硬件运行环境的加固elf文件的加载设备结构示意图。66.如图1所示,该加固elf文件的加载设备可以包括:处理器1001,例如中央处理器(centralprocessingunit,cpu),通信总线1002、用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(display),可选用户接口1003还可以包括标准的有线接口以及无线接口,而用户接口1003的有线接口在本发明中可为通用串行总线(universalserialbus,usb)接口。网络接口1004可选的可以包括标准的有线接口以及无线接口(如wi-fi接口)。存储器1005可以是高速随机存取存储器(randomaccessmemory,ram);也可以是稳定的存储器,比如,非易失存储器(non-volatilememory),具体可为,磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。67.本领域技术人员可以理解,图1中示出的结构并不构成对加固elf文件的加载设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。68.如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及加固elf文件的加载程序。69.在图1所示的加固elf文件的加载设备中,网络接口1004主要用于连接后台服务器,与所述后台服务器进行数据通信;用户接口1003主要用于连接外设;所述加固elf文件的加载设备通过处理器1001调用存储器1005中存储的加固elf文件的加载程序,并执行本发明实施例提供的加固elf文件的加载方法。70.基于上述硬件结构,提出本发明加固elf文件的加载方法的实施例。71.参照图2,图2为本发明加固elf文件的加载方法第一实施例的流程示意图。72.在第一实施例中,所述加固elf文件的加载方法包括以下步骤:73.步骤s10:在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数。74.需要说明的是,本实施例的执行主体为加固elf文件的加载设备,还可为其他可实现相同或相似功能的设备,本实施例对此不作限制,在本实施例中,以加固elf文件的加载设备为例进行说明。75.在本实施例中,主要应用于加固elf文件的加载,加固elf文件为在elf文件进行加密,从而得到安全性较高的加固elf文件,如图3所示的elf文件格式,包括链接视图和执行视图,elfheader包含section和programheader,两者都记录了文件内各个字段的类型和信息。链接视图是从section的角度观察elf结构,执行过程中并不依赖section的数据结构,但默认编译出的elf文件section划分较细,linux下可通过readelf-sfilename查看各个section的信息,下表列举了关键的一些section信息,如下表1所示的elf文件链接视图的结构说明表,例如记录了text表示执行代码,dynamic表示动态表,执行时用于查找linker需要用到的字段,got以及got.plt表示重定位地址,由.rel.dyn和.rel.plt中标记具体地址以及重定位方法等,执行视图是运行过程需要用到的结构,是从加载段的角度分析elf结构,如下表2所示的所示的elf文件执行视图的结构说明表,例如记录了pt_load表示加载到内存的地址映射关系以及权限等。[0076][0077]表1[0078][0079][0080]表2[0081]可以理解的是,本实施例中的elf文件可包括so文件以及可执行文件,还可为其他格式的文件,本实施例对此不作限制,在本实施例中,以so文件以及可执行文件为例进行说明,so和可执行文件加载流程几乎一样,下面以so的加载流程为例介绍elf是如何加载到内存的,如图4所示的elf文件加载流程示意图以及如下表3所示的调用函数说明框图,其中,调用do_dlopen表示加载动态链接库,调用find_library表示内存中查找是否已加载动态链接库,如果未加载执行后续函数,调用load_library表示加载动态链接库,调用loadsegment表示将pt_load指定的文件区域加载到内存,调用prelink表示读取动态节点,调用linkimage表示重定位,调用callconstructors表示开始调用so中init函数,表3为:[0082][0083]具体的加载过程为:加载过程中,重定位是为了保证所有函数调用以及变量获取能正常执行。由于编译器编译出的so和可执行文件,代码和数据的相对位置是关联的,所以so加固后还原的原则是不能修改代码和数据的相对偏移,加上不同系统下内存的对齐方式不同,一般还原到内存的位置和正常加载的位置是相同的,所以最安全的做法是不修改每个pt_load的起始位置和长度,在有需要的情况下,唯一可以修改的是最后一个pt_load的长度。[0084]因此,在加固过程中,还可获取待加固elf文件中的预设字段信息,其中,所述预设字段信息为pt_load,根据所述预设字段信息中的起始位置和长度进行加固,得到加固的elf文件,从而保证对pt_load中的数据信息不进行修改,保证在加载时与内存中的位置和加载的位置对齐,从而实现加载的准确性。[0085]系统linker在加载时会从dynamic字段中读取并保存一些字段内容到内存,为兼容这些数据,dynamic必须保留部分数据,且dynamic位置不可修改,否则如果还原时因数据覆盖到dynamic区域,可能造成不可预期的错误。[0086]在本实施例中,在加固过程中,还可获取动态表中的字段信息,将所述动态表中的字段信息进行加固,并将保留动态表中的字段信息部分数据,从而保证加固elf文件在加载时与还原的elf文件保持一致。[0087]可以理解的是,加固elf文件的加载请求可为用户在进行elf文件操作时生成的加固elf文件的加载请求,还可为通过其他形式生成加固elf文件的加载请求,本实施例对此不作限制。其中,动态链接库接口信息可为动态链接库libdepend.so,还可为其他形式,本实施例对此不作限制,加固elf文件为可执行文件时,预设初始化函数为start函数,加固elf文件为动态链接库文件时,预设初始化函数为init函数。[0088]步骤s20:根据所述预设初始化函数得到解密函数以及重定位信息。[0089]需要说明的是,所述预设初始化函数设有与解密函数以及重定位信息的调用逻辑,其中,解密函数为实现加固elf文件还原的函数,重定位信息为实现加固elf文件还原后的elf文件的逻辑地址空间变换成内存中的实际物理地址的映射关系。[0090]由于解密函数包含重定位的逻辑,如果以shellcode的形式写入文件,难度比较大,如果shellcode太长可能会影响ptload的大小,导致部分平台的兼容性问题,可以考虑将逻辑单独编译成动态链接库libdepend.so,调用libdepend.so中的解密函数来还原so。[0091]在本实施例中,建立shellcode与start函数或init函数的调用逻辑,通过start函数或init函数从而得到解密函数以及重定位信息。[0092]步骤s30:根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件。[0093]在具体实现中,由于加固elf文件为经过加密后的elf文件,在进行加固elf文件加载时,需要通过解密函数对加固elf文件进行解密,得到解密后的elf文件,即实现加固elf文件的还原,从而保证加固elf文件能进行正常的加载。[0094]步骤s40:根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载。[0095]可以理解的是,如果so直接被加载,重定位信息都是从其他so中查找,那么原so所有内容都可被加密,只需要在init中实现重定位并覆盖so的内存即可。[0096]如果so作为依赖,被其他so加载,那加载过程在重定位时并不会执行解密,所以加固的so需要保留导出符号的所有相关信息。至于导入符号,可以自己实现重定位方法来做重定位并做还原。[0097]本实施例通过上述方案,通过在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数;根据所述预设初始化函数得到解密函数以及重定位信息;根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件;根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载,从而可通过在加固elf文件上设有动态链接库接口信息,通过动态链接库接口信息调用预设初始化函数,从而得到解密函数以及重定位信息,实现加固elf文件的加载,避免了调用android平台上的jni_onload函数,可实现所有平台的加固elf文件的加载,达到提高加固的elf进行加载时的兼容性的目的。[0098]参照图5,图5为本发明加固elf文件的加载方法第二实施例的流程示意图,基于上述图2所示的第一实施例,提出本发明加固elf文件的加载方法的第二实施例。[0099]第二实施例中,所述步骤s10,包括:[0100]步骤s101,在获取到加固elf文件的加载请求时,判断所述加固elf文件的文件类型。[0101]在本实施例中,为了提高加固elf文件的兼容性,可实现对各种加固elf文件的的加载处理,因此,针对不同的加固elf文件,采用不同的预设初始化函数进行加载处理。[0102]在具体实现中,通过判断所述加固elf文件的文件类型,其中,文件类型可为可执行文件还可为动态链接库文件,以及其他形式的加固elf文件,本实施例对此不作限制,在本实施例中,以可执行文件或动态链接库文件为例进行说明。[0103]步骤s102,在所述加固elf文件的文件类型为可执行文件时,将start函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用start函数。[0104]在本实施例中,start函数为可执行文件的执行函数,即表示为预设初始化函数,由于可执行文件在进行记载时需要调用start函数开始执行,从而通过动态链接库接口信息实现对start函数的调用。[0105]步骤s103,在所述加固elf文件的文件类型为动态链接库文件时,将init函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用init函数。[0106]在本实施例中,init函数为动态链接库文件的执行函数,即表示为预设初始化函数,由于动态链接库文件在进行记载时需要调用init函数开始执行,从而通过动态链接库接口信息实现对init函数的调用。[0107]在一实施例中,所述步骤s20之前,所述方法还包括:[0108]获取所述预设初始化函数的函数地址;将所述函数地址调整为解密函数的跳转地址;所述根据所述预设初始化函数得到解密函数,包括:根据所述预设初始化函数的跳转地址得到解密函数。[0109]在本实施例中,执行文件和动态链接库在加载时,有固定的执行流程。可执行文件默认从start开始执行,而动态链接库默认会执行init函数,由于加固时,指定了这两个函数地址为解密函数的跳转地址,所以elf加载后必定会执行解密,从而实现解密函数的获取。[0110]在一实施例中,所述加固elf文件包括执行代码函数;所述步骤s10之前,所述方法还包括:[0111]将所述加固elf文件的动态链接库接口信息指向执行代码函数,将所述执行代码函数指向填充函数;将所述填充函数指向预设初始化函数。[0112]需要说明的是,所述执行代码函数可为got函数,由于加固elf文件中含有got函数,通过将got函数指向填充函数,将所述填充函数指向预设初始化函数,从而通过填充函数得到预设初始化函数,其中,填充函数可为shellcode函数,还可为其他形式的填充函数,本实施例对此不作限制,在本实施例中,以shellcode函数为例进行说明。[0113]在具体实现中,通过将执行代码函数指向填充函数,通过填充函数实现执行代码函数与预设初始化函数之间的桥梁,从而通过动态链接库接口信息得到预设初始化函数,实现获取解密函数和重定位的逻辑,避免在加固elf文件还原时直接得到解密函数和重定位信息,从而不利于数据的安全性。[0114]在一实施例中,所述加固elf文件包括导出符号信息;[0115]所述步骤s10之前,所述方法还包括:[0116]将所述加固elf文件的导出符号信息指向预设初始化函数。[0117]在本实施例中,导出符号信息为根据符号表、字符串表、重定位表信息以及动态节点信息生成导出符号信息,还可为根据其他参数生成的导出符号信息,本实施例对此不作限制,在本实施例中,以符号表、字符串表、重定位表信息以及动态节点信息为例进行说明。[0118]所述预设初始化函数得到重定位信息,包括:根据所述预设初始化函数得到所述加固elf文件的导出符号信息;对所述导出符号信息进行解析,得到重定位信息。[0119]在具体实现中,根据所述导出符号信息可得到重定向的逻辑,具体为根据导出符号信息在预设逻辑映射表中查找对应的重定向逻辑,即实现对所述导出符号信息进行解析,得到重定位信息,例如解密函数的逻辑为:so或可执行文件加载正常并执行shellcode,shellcode跳转至解密函数start_xx,获取解密参数,合并加密数据,并进行解密,根据还原信息,将原so中的数据进行还原,并对还原的数据进行重定位,如果是so文件,直接返回结束,如果是可执行文件,跳转至start所指示的地址,正常执行start,如图6所示的执行还原流程示意图。[0120]本实施例通过上述方案,通过考虑加固更多的elf文件信息时,必须要实现linker过程,将原elf文件中重定位的信息通过动态链接库接口信息隐藏,并在加载后通过init调用的过程进行自定义的重定位,通过收集elf中的符号表,字符串表,重定位表信息和动态节点重新组织成识别的结构,在内存中解析,将重定位的结果还原到内存,但不还原符号表,字符串表,重定位表信息和动态节点信息,这样即使加载到内存,分析者也无法直接知道这些重定位的函数和变量名称,加大了分析难度。[0121]参照图7,图7为本发明加固elf文件的加载方法第三实施例的流程示意图,基于第一实施例或第二实施例提出本发明加固elf文件的加载方法的第三实施例,在本实施例中,基于第一实施例进行说明。[0122]第三实施例中,所述步骤s10之前,所述方法还包括:[0123]步骤s104,获取待加固elf文件。[0124]需要说明的是,待加固elf文件为elf文件,即需要进行加固的elf文件,如图8所示的加固处理流程示意图。[0125]步骤s105,确定所述待加固elf文件中的预设预留数据以及对应的预留区域信息。[0126]在本实施例中,所述预设预留数据包括elf头、phdr、symtab、strtab、hash表以及dynamic字段数据,还可包括其他数据,本实施例对此不作限制,具体为,将必要的数据作为预设预留数据,将其他数据进行加密,从而保证尽量多的数据部分被加密,提高数据加固的安全性。[0127]步骤s106,将所述预设预留数据以及对应的预留区域信息写入壳代码中,生成壳文件。[0128]需要说明的是,so内容作为数据放入壳代码中,壳单独编译成so文件,并释放so的数据到内存,从而实现so文件的加载。[0129]在具体实现中,加固遵循以下三个基本原则:加固前后能正常加载到内存,兼容系统linker,这需要保留导出符号。解密和重定位函数位于一个依赖的so(libdepend.so),不直接在壳上做解密和重定位。壳上最终只能看到导出符号和跳转至解密代码的逻辑,其他数据不可见,从而保证加固elf文件在加载过程中的安全性。[0130]步骤s107,获取所述待加固elf文件中的解密函数和重定位信息,将所述解密函数和重定位信息指向预设初始化函数,根据所述预设初始化函数得到动态链接库接口信息。[0131]具体加固流程如下:读取elf文件,获取预留数据以及预留数据所在区域,写入壳中,根据elf格式,在dynamic字段中添加对libdepend.so的依赖,符号表,字符串表和got表添加解密函数(假设函数名为start_xx)信息,根据elf的平台类型写入对应的shellcode,如果是so文件,在dynamic中添加init指向shellcode地址,如果是可执行文件将shellcode地址写入elf头部的entry字段。[0132]步骤s108,根据解密函数对所述待加固elf文件的数据部分和代码部分进行加密,得到加密数据。[0133]将加密数据合并并进行加密,根据预留区域,计算可填充区域并将加密数据填充到可填充的文件区域,尽可能减少文件体积,添加必须要的section信息后即完成加固。[0134]步骤s109,根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件。[0135]在本实施例中,加固后的文件能很好地隐藏导入函数,即使dump出内存,也无法直接知道函数是调用了哪些其他so中的函数或者变量。最后libdpend.so的实现也能快捷地实现一些其他附加的功能,从而提高加固的灵活性。[0136]在一实施例中,所述根据解密函数对所述待加固elf文件的数据部分和代码部分进行加密,得到加密数据之前,所述方法还包括:根据所述动态链接库接口信息对所述待加固elf文件中的原始数据进行分析,以判断所述待加固elf文件中的原始数据是否含有与所述动态链接库接口信息关联的数据;在所述待加固elf文件中的原始数据未含有与所述动态链接库接口信息关联的数据时,将未含有与动态链接库接口信息关联的数据作为数据部分。[0137]在本实施例中,为了保证在加密过程中将尽量多的数据进行加密的前提下保证加载过程的顺利进行,因此,需要将与所述动态链接库接口信息关联的数据不进行加密,从而保证不依赖的数据都进行加密,实现在满足兼容性要求的前提下,尽可能多地隐藏elf文件中的数据,运行时尽可能防止备份出原来的elf文件。[0138]在一实施例中,所述根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件之前,所述方法还包括:根据所述预留区域信息得到可填充区域;将所述加密数据填入所述可填充区域,得到填充数据;所述根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件,包括:根据所述壳文件、动态链接库接口信息以及填充数据生成加固elf文件。[0139]需要说明的是,在elf文件进行加固时,为了存放加密后的数据,需要将设定预留区域信息,通过预留区域信息可得到填充区域,从而将所述加密数据填入所述可填充区域,得到填充数据,从而保证填充区域可填充加密数据,避免填充区域由于不够填充加密数据从而导致数据外溢,达到提高elf文件加固准确性的目的。[0140]在一实施例中,所述重定位信息包括加载模式信息,所述步骤s40,包括:[0141]根据所述加载模式信息确定目标加载模式;根据所述目标加载模式得到重定位时机或者重定位符号的查找范围;根据所述重定位时机或者重定位符号的查找范围对所述解密后的elf文件进行重定位。[0142]需要说明的是,所述目标加载模式包括rtld_now模式、rtld_lazy模式、rtld_local模式以及rtld_global模式,还可包括其他形式的加载模式,本实施例对此不作限制,其中,rtld_now模式表示影响重定位时机,dlopen后必须全部重定位,rtld_lazy模式表示影响重定位时机,dlopen后对plt_got表中的数据不做重定位,执行时做重定位,rtld_local模式表示影响重定位符号的查找范围,只在当前so和依赖的so中做查找,rtld_global模式表示影响重定位符号的查找范围,当前so,依赖的so以及rtld_global加载的so中查找,如表4所示的加载模式说明表。[0143][0144][0145]表4[0146]可以理解的是,动态链接库的文件类型为dyn,elf的可执行文件存在两个格式,默认直接编译得到的类型为exec类型,如果编译时添加参数-pie–fpie,会生成类型为dyn的可执行文件,exec类型的文件加载到内存中的位置是固定的,由于地址固定,部分指令的寻址的地址是固定的,该类指令我们称之为位置相关代码,加载过程中除了一些引用的函数变量,几乎不需要重定位,而dyn会加载到随机内存,指令中地址都是相对地址或间接寻址,如有需要可能存在一些地址的重定位,这类代码称之为位置无关代码。[0147]对于可执行文件,无论哪种格式的文件,只需要按照重定位的规则对内存中的数据做重定位就能试程序正常运行,但对于动态链接库,需要区分一些加载规则,动态链接库共有四种加载模式,两个影响重定位时机,两个影响符号查找范围,因此,可通过对加载模式的识别从而实现不同模式的重定向方式。[0148]在本实施例中,经过改良的elf文件加固方案,可以很好地兼容加固so和可执行文件的场景。可执行文件可以正常加固exec和dyn两种类型文件。so可正常加载以及作为dt_needed被加载,同时改良后,能支持rtld_lazy以及rtld_global模式等。[0149]在一实施例中,所述根据所述加载模式信息确定目标加载模式,所述方法还包括:[0150]判断所述加载模式信息中是否存有预设字段;在所述加固elf文件中的动态表存有预设字段时,根据所述预设字段确定目标加载模式。[0151]在本实施例中,所述预设字段可为dt_pltgot字段,还可为其他字段,本实施例对此不作限制。[0152]在具体实现中,linux下so加载如果支持rtld_lazy模式,dynamic段中会存在dt_pltgot字段,该字段前三个值存储的三个地址,第二个地址是dlopen的返回值handle,第三个地址为延迟加载的函数地址,这段地址在rtld_lazy模式下会在重定位时填充上,在rtld_now模式下默认为0,由于改地址和libdl.so的实现有关,自定义实现的linker无法获取和使用该地址,需要重现实现加载方法并进行填充,从而实现对不同加载模式的兼容性。[0153]在一实施例中,所述根据所述重定位信息对所述解密后的elf文件进行重定位之后,所述方法还包括:[0154]在所述解密后的elf文件为可执行文件时,则跳转至启动函数,通过所述启动函数执行所述可执行文件;在所述解密后的elf文件的文件类型为动态链接库文件时,则返回至结束函数,通过所述结束函数结束所述动态链接库文件。[0155]在本实施例中,启动函数可为start函数,还可为其他函数,本实施例对此不作限制,结束函数可为end函数,还可为其他函数,本实施例对此不作限制,在加载完成之后,如果是so文件,直接返回结束,如果是可执行文件,跳转至start所指示的地址,正常执行start。[0156]本实施例通过上述方案,通过对预设字段的识别,确定加载模式,从而可根据加载模式实现不同模式下的重定向,达到提高对不同加载模式的兼容性的目的。[0157]此外,本发明实施例还提出一种存储介质,所述存储介质上存储有加固elf文件的加载程序,所述加固elf文件的加载程序被处理器执行时实现如上文所述的终端入网方法的步骤。[0158]由于本存储介质采用了上述所有实施例的全部技术方案,因此至少具有上述实施例的技术方案所带来的所有有益效果,在此不再一一赘述。[0159]此外,参照图9,本发明实施例还提出一种加固elf文件的加载装置,所述加固elf文件的加载装置包括:[0160]调用模块10,用于在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数。[0161]在本实施例中,主要应用于加固elf文件的加载,加固elf文件为在elf文件进行加密,从而得到安全性较高的加固elf文件,如图3所示的elf文件格式,包括链接视图和执行视图,elfheader包含section和programheader,两者都记录了文件内各个字段的类型和信息。链接视图是从section的角度观察elf结构,执行过程中并不依赖section的数据结构,但默认编译出的elf文件section划分较细,linux下可通过readelf-sfilename查看各个section的信息,下表列举了关键的一些section信息,如图4所示的所示的elf文件链接视图的结构说明框图,例如记录了text表示执行代码,dynamic表示动态表,执行时用于查找linker需要用到的字段,got以及got.plt表示重定位地址,由.rel.dyn和.rel.plt中标记具体地址以及重定位方法等,执行视图是运行过程需要用到的结构,是从加载段的角度分析elf结构,如图5所示的所示的elf文件执行视图的结构说明框图,例如记录了pt_load表示加载到内存的地址映射关系以及权限等。[0162]可以理解的是,本实施例中的elf文件可包括so文件以及可执行文件,还可为其他格式的文件,本实施例对此不作限制,在本实施例中,以so文件以及可执行文件为例进行说明,so和可执行文件加载流程几乎一样,下面以so的加载流程为例介绍elf是如何加载到内存的,如图6所示的elf文件加载流程示意图以及如图7所示的调用函数说明框图,其中,调用do_dlopen表示加载动态链接库,调用find_library表示内存中查找是否已加载动态链接库,如果未加载执行后续函数,调用load_library表示加载动态链接库,调用loadsegment表示将pt_load指定的文件区域加载到内存,调用prelink表示读取动态节点,调用linkimage表示重定位,调用callconstructors表示开始调用so中init函数。[0163]具体的加载过程为:加载过程中,重定位是为了保证所有函数调用以及变量获取能正常执行。由于编译器编译出的so和可执行文件,代码和数据的相对位置是关联的,所以so加固后还原的原则是不能修改代码和数据的相对偏移,加上不同系统下内存的对齐方式不同,一般还原到内存的位置和正常加载的位置是相同的,所以最安全的做法是不修改每个pt_load的起始位置和长度,在有需要的情况下,唯一可以修改的是最后一个pt_load的长度。[0164]因此,在加固过程中,还可获取待加固elf文件中的预设字段信息,其中,所述预设字段信息为pt_load,根据所述预设字段信息中的起始位置和长度进行加固,得到加固的elf文件,从而保证对pt_load中的数据信息不进行修改,保证在加载时与内存中的位置和加载的位置对齐,从而实现加载的准确性。[0165]系统linker在加载时会从dynamic字段中读取并保存一些字段内容到内存,为兼容这些数据,dynamic必须保留部分数据,且dynamic位置不可修改,否则如果还原时因数据覆盖到dynamic区域,可能造成不可预期的错误。[0166]在本实施例中,在加固过程中,还可获取动态表中的字段信息,将所述动态表中的字段信息进行加固,并将保留动态表中的字段信息部分数据,从而保证加固elf文件在加载时与还原的elf文件保持一致。[0167]可以理解的是,加固elf文件的加载请求可为用户在进行elf文件操作时生成的加固elf文件的加载请求,还可为通过其他形式生成加固elf文件的加载请求,本实施例对此不作限制。其中,动态链接库接口信息可为动态链接库libdepend.so,还可为其他形式,本实施例对此不作限制,加固elf文件为可执行文件时,预设初始化函数为start函数,加固elf文件为动态链接库文件时,预设初始化函数为init函数。[0168]确定模块20,用于根据所述预设初始化函数得到解密函数以及重定位信息。[0169]需要说明的是,所述预设初始化函数设有与解密函数以及重定位信息的调用逻辑,其中,解密函数为实现加固elf文件还原的函数,重定位信息为实现加固elf文件还原后的elf文件的逻辑地址空间变换成内存中的实际物理地址的映射关系。[0170]由于解密函数包含重定位的逻辑,如果以shellcode的形式写入文件,难度比较大,如果shellcode太长可能会影响ptload的大小,导致部分平台的兼容性问题,可以考虑将逻辑单独编译成动态链接库libdepend.so,调用libdepend.so中的解密函数来还原so。[0171]在本实施例中,建立shellcode与start函数或init函数的调用逻辑,通过start函数或init函数从而得到解密函数以及重定位信息。[0172]解密模块30,用于根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件。[0173]在具体实现中,由于加固elf文件为经过加密后的elf文件,在进行加固elf文件加载时,需要通过解密函数对加固elf文件进行解密,得到解密后的elf文件,即实现加固elf文件的还原,从而保证加固elf文件能进行正常的加载。[0174]重定位模块40,用于根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载。[0175]可以理解的是,如果so直接被加载,重定位信息都是从其他so中查找,那么原so所有内容都可被加密,只需要在init中实现重定位并覆盖so的内存即可。[0176]如果so作为依赖,被其他so加载,那加载过程在重定位时并不会执行解密,所以加固的so需要保留导出符号的所有相关信息。至于导入符号,可以自己实现重定位方法来做重定位并做还原。[0177]本实施例通过上述方案,通过在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数;根据所述预设初始化函数得到解密函数以及重定位信息;根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件;根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载,从而可通过在加固elf文件上设有动态链接库接口信息,通过动态链接库接口信息调用预设初始化函数,从而得到解密函数以及重定位信息,实现加固elf文件的加载,避免了调用android平台上的jni_onload函数,可实现所有平台的加固elf文件的加载,达到提高加固的elf进行加载时的兼容性的目的。[0178]本发明所述加固elf文件的加载装置采用了上述所有实施例的全部技术方案,因此至少具有上述实施例的技术方案所带来的所有有益效果,在此不再一一赘述。[0179]以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的
技术领域
,均同理包括在本发明的专利保护范围内。[0180]本发明公开了a1,一种加固elf文件的加载方法,所述加固elf文件的加载方法包括以下步骤:[0181]在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数;[0182]根据所述预设初始化函数得到解密函数以及重定位信息;[0183]根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件;[0184]根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载。[0185]a2、如权利要求a1所述的加固elf文件的加载方法,所述在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数,包括:[0186]在获取到加固elf文件的加载请求时,判断所述加固elf文件的文件类型;[0187]在所述加固elf文件的文件类型为可执行文件时,将start函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用start函数;[0188]在所述加固elf文件的文件类型为动态链接库文件时,将init函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用init函数。[0189]a3、如权利要求a1所述的加固elf文件的加载方法,根据所述预设初始化函数得到解密函数之前,所述方法还包括:[0190]获取所述预设初始化函数的函数地址;[0191]将所述函数地址调整为解密函数的跳转地址;[0192]所述根据所述预设初始化函数得到解密函数,包括:[0193]根据所述预设初始化函数的跳转地址得到解密函数。[0194]a4、如权利要求a1至a3中任一项所述的加固elf文件的加载方法,所述加固elf文件包括执行代码函数;[0195]所述根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数之前,所述方法还包括:[0196]将所述加固elf文件的动态链接库接口信息指向执行代码函数,将所述执行代码函数指向填充函数;[0197]将所述填充函数指向预设初始化函数。[0198]a5、如权利要求a1至a3中任一项所述的加固elf文件的加载方法,所述加固elf文件包括导出符号信息;[0199]根据所述预设初始化函数得到重定位信息之前,所述方法还包括:[0200]将所述加固elf文件的导出符号信息指向预设初始化函数;[0201]所述预设初始化函数得到重定位信息,包括:[0202]根据所述预设初始化函数得到所述加固elf文件的导出符号信息;[0203]对所述导出符号信息进行解析,得到重定位信息。[0204]a6、如权利要求a1至a3中任一项所述的加固elf文件的加载方法,所述在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数之前,所述方法还包括:[0205]获取待加固elf文件;[0206]确定所述待加固elf文件中的预设预留数据以及对应的预留区域信息;[0207]将所述预设预留数据以及对应的预留区域信息写入壳代码中,生成壳文件;[0208]获取所述待加固elf文件中的解密函数和重定位信息,将所述解密函数和重定位信息指向预设初始化函数,根据所述预设初始化函数得到动态链接库接口信息;[0209]根据解密函数对所述待加固elf文件的数据部分和代码部分进行加密,得到加密数据;[0210]根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件。[0211]a7、如权利要求a6所述的加固elf文件的加载方法,所述根据解密函数对所述待加固elf文件的数据部分和代码部分进行加密,得到加密数据之前,所述方法还包括:[0212]根据所述动态链接库接口信息对所述待加固elf文件中的原始数据进行分析,以判断所述待加固elf文件中的原始数据是否含有与所述动态链接库接口信息关联的数据;[0213]在所述待加固elf文件中的原始数据未含有与所述动态链接库接口信息关联的数据时,将未含有与所述动态链接库接口信息关联的数据作为数据部分。[0214]a8、如权利要求a6所述的加固elf文件的加载方法,所述根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件之前,所述方法还包括:[0215]根据所述预留区域信息得到可填充区域;[0216]将所述加密数据填入所述可填充区域,得到填充数据;[0217]所述根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件,包括:[0218]根据所述壳文件、动态链接库接口信息以及填充数据生成加固elf文件。[0219]a9、如权利要求a1至a3中任一项所述的加固elf文件的加载方法,所述重定位信息包括加载模式信息;[0220]所述根据所述重定位信息对所述解密后的elf文件进行重定位,包括:[0221]根据所述加载模式信息确定目标加载模式;[0222]根据所述目标加载模式得到重定位时机或者重定位符号的查找范围;[0223]根据所述重定位时机或者重定位符号的查找范围对所述解密后的elf文件进行重定位。[0224]a10、如权利要求a9所述的加固elf文件的加载方法,所述根据所述加载模式信息确定目标加载模式,包括:[0225]判断所述加载模式信息中是否存有预设字段;[0226]在所述加固elf文件中的动态表存有预设字段时,根据所述预设字段确定目标加载模式。[0227]a11、如权利要求a1至a3中任一项所述的加固elf文件的加载方法,所述根据所述重定位信息对所述解密后的elf文件进行重定位之后,所述方法还包括:[0228]在所述解密后的elf文件为可执行文件时,则跳转至启动函数,通过所述启动函数执行所述可执行文件;[0229]在所述解密后的elf文件的文件类型为动态链接库文件时,则返回至结束函数,通过所述结束函数结束所述动态链接库文件。[0230]本发明还公开了b12、一种加固elf文件的加载装置,所述加固elf文件的加载装置包括:[0231]调用模块,用于在获取到加固elf文件的加载请求时,根据所述加固elf文件中的动态链接库接口信息调用预设初始化函数;[0232]确定模块,用于根据所述预设初始化函数得到解密函数以及重定位信息;[0233]解密模块,用于根据所述解密函数对所述加固elf文件进行解密,得到解密后的elf文件;[0234]重定位模块,用于根据所述重定位信息对所述解密后的elf文件进行重定位,以实现文件的加载。[0235]b13、如权利要求b12所述的加固elf文件的加载装置,所述调用模块,还用于在获取到加固elf文件的加载请求时,判断所述加固elf文件的文件类型;[0236]在所述加固elf文件的文件类型为可执行文件时,将start函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用start函数;[0237]在所述加固elf文件的文件类型为动态链接库文件时,将init函数作为预设初始化函数,根据所述加固elf文件中的动态链接库接口信息调用init函数。[0238]b14、如权利要求b12所述的加固elf文件的加载装置,所述加固elf文件的加载装置还包括:跳转模块;[0239]所述跳转模块,用于获取所述预设初始化函数的函数地址;[0240]将所述函数地址调整为解密函数的跳转地址。[0241]b15、如权利要求b12至b14中任一项所述的加固elf文件的加载装置,所述加固elf文件包括执行代码函数;[0242]所述调用模块,还用于将所述加固elf文件的执行代码函数指向填充函数;[0243]将所述填充函数指向预设初始化函数。[0244]b16、如权利要求b12至b14中任一项所述的加固elf文件的加载装置,所述加固elf文件包括导出符号信息;[0245]所述重定位模块,还用于将所述加固elf文件的导出符号信息指向预设初始化函数。[0246]b17、如权利要求b12至b14中任一项所述的加固elf文件的加载装置,所述加固elf文件的加载装置还包括:加固模块;[0247]所述加固模块,用于获取待加固elf文件;[0248]确定所述待加固elf文件中的预设预留数据以及对应的预留区域信息;[0249]将所述预设预留数据以及对应的预留区域信息写入壳代码中,生成壳文件;[0250]获取所述待加固elf文件中的解密函数和重定位信息,将所述解密函数和重定位信息指向预设初始化函数,根据所述预设初始化函数得到动态链接库接口信息;[0251]根据解密函数对所述待加固elf文件的数据部分和代码部分进行加密,得到加密数据;[0252]根据所述壳文件、动态链接库接口信息以及加密数据生成加固elf文件。[0253]b18、如权利要求b17所述的加固elf文件的加载装置,所述加固模块,还用于根据所述动态链接库接口信息对所述待加固elf文件中的原始数据进行分析,以判断所述待加固elf文件中的原始数据是否含有与所述动态链接库接口信息关联的数据;[0254]在所述待加固elf文件中的原始数据未含有与所述动态链接库接口信息关联的数据时,将未含有与所述动态链接库接口信息关联的数据作为数据部分。[0255]b19、如权利要求b17所述的加固elf文件的加载装置,所述加固模块,还用于根据所述预留区域信息得到可填充区域;[0256]将所述加密数据填入所述可填充区域,得到填充数据。[0257]b20、如权利要求b12至b14中任一项所述的加固elf文件的加载装置,所述重定位信息包括加载模式信息;[0258]所述重定位模块,还用于根据所述加载模式信息确定目标加载模式;[0259]根据所述目标加载模式得到重定位时机或者重定位符号的查找范围;[0260]根据所述重定位时机或者重定位符号的查找范围对所述解密后的elf文件进行重定位。[0261]b21、如权利要求b20所述的加固elf文件的加载装置,所述重定位模块,还用于判断所述加载模式信息中是否存有预设字段;[0262]在所述加固elf文件中的动态表存有预设字段时,根据所述预设字段确定目标加载模式。[0263]b22、如权利要求b12至b14中任一项所述的加固elf文件的加载装置,所述加固elf文件的加载装置还包括:执行模块;[0264]所述执行模块,用于在所述解密后的elf文件为可执行文件时,则跳转至启动函数,通过所述启动函数执行所述可执行文件;[0265]在所述解密后的elf文件的文件类型为动态链接库文件时,则返回至结束函数,通过所述结束函数结束所述动态链接库文件。当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献