CN117716357A - 受保护的数据包 - Google Patents
受保护的数据包 Download PDFInfo
- Publication number
- CN117716357A CN117716357A CN202180100327.4A CN202180100327A CN117716357A CN 117716357 A CN117716357 A CN 117716357A CN 202180100327 A CN202180100327 A CN 202180100327A CN 117716357 A CN117716357 A CN 117716357A
- Authority
- CN
- China
- Prior art keywords
- file
- code portion
- class
- code
- supplemental
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 claims abstract description 100
- 230000000153 supplemental effect Effects 0.000 claims abstract description 73
- 230000004048 modification Effects 0.000 claims abstract description 41
- 238000012986 modification Methods 0.000 claims abstract description 41
- 230000004044 response Effects 0.000 claims abstract description 6
- 238000012545 processing Methods 0.000 claims description 12
- 230000001419 dependent effect Effects 0.000 claims 1
- 230000008569 process Effects 0.000 description 5
- 238000004590 computer program Methods 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000000354 decomposition reaction Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 239000013589 supplement Substances 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
描述了一种从初始文件生成受保护的数据包的方法。初始文件具有预定的文件格式,该方法包括:(a)标识要保护的初始文件的代码部分;(b)生成包括代码部分的副本(或版本)的补充文件;以及(c)修改初始文件,其中修改包括用替换数据至少替换初始文件的代码部分,从而提供修改文件,其中修改文件具有与初始文件相同的预定文件格式,并且其中修改被布置成当预定文件格式的读取器试图从修改文件加载代码部分时引起失败。受保护的数据包包括修改文件和补充文件。还描述了一种用于预定文件格式的读取器来执行受保护的数据包的方法。受保护的数据包包括修改文件和补充文件。修改文件包括替换数据,该替换数据已经替换了修改文件所基于的初始文件的至少代码部分。修改文件和初始文件具有预定的文件格式。补充文件包括代码部分的副本(或版本)。该方法包括,在运行时:响应于当试图从修改文件加载代码部分时的失败,处理补充文件以便从补充文件加载代码部分。
Description
技术领域
本发明涉及生成和执行受保护的数据包。特别地,本文描述的方法对于保护.dex文件和Java类文件有用。
背景技术
Java编译器用于将Java源代码编译成Java类文件(具有.class文件名扩展),其包含可以在Java虚拟机(JVM)上执行的Java字节码。.jar文件是包文件格式,其通常用于将多个.class文件和相关联的元数据和资源(文本、图像等)聚合成一个文件以便分发。
Android设备使用称为Dalvik的替代字节码格式。是Android软件开发工具包(SDK)的部分的dx工具/编译器用于将.class文件和任何.jar库转换成包含Dalvik字节码的.dex文件(即Dalvik可执行文件)。.dex文件具有由Google Android定义的预定格式,并且可以在Dalvik虚拟机(DVM)中运行。dx工具通过将应用的所有类打包成单个.dex文件来消除类中存在的所有冗余信息。
当Android系统执行.dex文件时,它将整个.dex文件映射到连续的存储器空间,并且整个映射的.dex文件的存储器地址可以容易地在Android文件系统/proc/{pid}/maps文件中找到(其中pid是加载了.dex文件的当前运行进程的ID)。Linux和逆向工程的基本知识使得攻击者能够容易地找到映射的.dex文件的存储器地址并将它从存储器转储(dump)到文件。
因为.dex文件的格式是预定的并且是公开的,并且因为存在可以对.dex文件进行逆向工程或篡改的许多工具,所以合期望的是保护.dex文件免受非法篡改和逆向工程。因此,应用开发人员经常应用某些.dex保护工具以在发布.dex文件之前对其进行加密。加密的.dex文件然后仅在运行时被解密并释放到存储器。因此,该方法可以保护.dex文件免受静态攻击。然而,因为Android系统需要普通的.dex文件来执行,所以攻击者仍然可以访问存储器中的.dex文件,并且然后可以篡改存储器中.dex文件的数据或将清楚的.dex文件从存储器转储到文件。
本发明寻求提供一种保护文件(诸如.dex文件)的替代方式,其提供相对于现有技术的那些方式的各种优势。
发明内容
根据本发明的第一方面,提供了一种从初始文件生成受保护的数据包的方法。初始文件具有预定的文件格式,该方法包括:(a)标识要保护的初始文件的代码部分;(b)生成包括代码部分的副本(或版本)的补充文件;以及(c)修改初始文件,其中修改包括用替换数据替换初始文件的至少代码部分,从而提供修改文件,其中修改文件具有与初始文件相同的预定文件格式,并且其中修改被布置成当预定文件格式的读取器试图从修改文件加载代码部分时引起失败。受保护的数据包包括修改文件和补充文件。
根据本发明的第二方面,提供了一种根据第一方面的方法生成的受保护的数据包。
根据本发明的第三方面,提供了一种用于预定文件格式的读取器执行受保护的数据包的方法。受保护的数据包包括修改文件和补充文件。修改文件包括替换数据,该替换数据已经替换了修改文件所基于的初始文件的至少代码部分。修改文件和初始文件具有预定的文件格式。补充文件包括代码部分的副本(或版本)。该方法在运行时包括:响应于当试图从修改文件加载代码部分时的失败,处理补充文件以便从补充文件加载代码部分。
本发明的其他优选特征在所附权利要求书中阐述。
附图说明
现在将参考附图通过示例的方式描述本发明的实施例,其中:
图1示意性地图示了.dex文件的预定结构/格式。
图2示意性地图示了.dex文件的class_def_item的示例。
图3示意性地图示了.dex文件的class_data_item的示例。
图4示意性地图示了.dex文件的code_item 400的示例。
图5是图示了从初始文件生成受保护的数据包的方法的流程图。
图6示意性地图示了用于执行图5的方法的离线工具。
图7是图示了用于预定文件格式的读取器执行根据图5的方法生成的受保护的数据包的方法的流程图。
图8是图示了图7的方法的子步骤的流程图。特别地,图8是图示了处理补充文件以便从补充文件加载代码部分的流程图。
图9A示出了针对预定文件格式的读取器中的类加载器的默认序列。
图9B示出了针对预定文件格式的读取器中的类加载器的调整序列。
图10是图示了按需将代码部分加载到堆存储器的子步骤的流程图。
图11示出了示例性.class文件数据结构。
具体实施方式
在下面的描述中以及在各图中,描述了本发明的某些实施例。然而,将领会,本发明不限于所描述的实施例,并且一些实施例可能不包括下面描述的所有特征。然而,将清楚的是,可以在不脱离如所附权利要求书中阐述的本发明的更宽泛的精神和范围的情况下在本文中进行各种修改和改变。
预定文件格式的一个示例是.dex文件格式。该示例将在下面详细描述。随后,基于Java类文件格式(.class文件)描述另外的示例。
1:.dex文件格式
对于.dex文件的完整内容,请参考在https://source.androld.com/devices/ tech/dalyik/des-lormat处找到的官方Android文档。然而,图1示意性地图示了.dex文件100的预定结构/格式。
如图1中所示,.dex文件包括头部110、列表区段120和数据区段130。在图1的左手侧以展开的形式示出了头部。列表区段120中的dex_class_def列表125是类定义的列表,每个被称为class_def_item。图2中示意性地图示了class_def_item 200的示例。
返回参考图1,头部110包括class_def_size 102和class_def_off104,它们指定了dex_class_def列表125的大小和位置。头部110还包括data_size 106和data_off108,它们指定了数据区段130的大小和位置。
数据区段130中的class_data区段135是用于对应于在dex_class_def列表125中定义的类的所有类数据的数据区域。特定类的数据称为class_data_item。图3中示意性地示出了class_data_item300的示例。每个class_data_item 300可以包括encoded_field310和encoded_method320。encoded_method330是用于class_data_item 300的特定类的特定方法。encoded_method 330包括code_off330,它指定相关code_item在数据区段130中的位置。code_item是与特定方法相关的实际代码。图4中示意性地图示了示例性的code_item400。
2:离线工具
图5示意性地图示了从初始文件生成受保护的数据包的方法500。如在图6中示意性地图示的,方法500通常由离线工具620离线执行。特别地,离线工具620从初始文件610开始,并生成修改文件630和补充文件640,它们一起形成受保护的数据包650。
初始文件610具有预定的文件格式。在本章节中描述的示例中,预定的文件格式是.dex文件格式。然而,也设想了对其他预定文件格式的保护。例如,下面在章节4中给出了与Java类文件相关的另外示例(即.class文件格式)。
该方法包括标识要保护的初始文件610的代码部分的第一步骤S501。特别地,第一步骤S501标识初始文件610内的相关代码部分的字节码。标识要保护的代码部分的步骤S501可以包括解析初始文件610以标识代码部分和/或标识引用初始文件中代码部分的位置的指针。当初始文件610是.dex文件100时,代码部分可以与.dex文件100的特定类相关联。
在第一示例中,期望的是保护.dex文件100的特定类的整体。在该示例中,要保护的代码部分是图3中所示的class_data_item 300,并且标识要保护的初始文件610的代码部分的步骤S501可以包括多个子步骤。第一子步骤包括解析.dex文件100的头部110以获得class_def_off104和data_off108。第二子步骤包括基于class_def_off104,解析与特定类相关联的class_def_item 200以获得特定类的class_data_off210。第三子步骤包括基于data_off108和class_data_off210,获得与特定类相关联的class_data_item 300。换句话说,该第三子步骤涉及在.dex文件的数据区段130中寻求class_data 135,并得到class_data_item 300。第四子步骤包括将class_data_item 300标识为要保护的初始文件610的代码部分。在该第一示例中,引用初始文件610中的代码部分的位置的指针包括class_data_off210。
在第二示例中,期望的是保护.dex文件100的特定类的特定方法。在该示例中,要保护的代码部分是code_item 400,并且标识要保护的初始文件610的代码部分的步骤S501可以包括多个子步骤。第一子步骤包括解析.dex文件100的头部以获得class_def_off 104和data_off108。第二子步骤包括基于class_def_off 104,解析与特定类相关联的class_def_item 200以获得特定类的class_data_off210。第三子步骤包括基于data_off 108和class_data_off 210,解析与特定类相关联的class_data_item 300以获得与特定方法相关联的encoded_method 320。换句话说,该第三子步骤涉及在.dex文件的数据区段130中寻求class_data 135,并得到class_data_item 300,然后解析class_data_item300以得到encoded_method320。第四子步骤包括解析encoded_method320以获得特定方法的code_off330。第五子步骤包括基于code_off330,获得特定方法的code_item 400。换句话说,该第五子步骤涉及通过code_off 330寻求code_item 400,并得到真实方法数据(即code_item400)。第六子步骤包括将code_item 400标识为要保护的初始文件610的代码部分。在该第二示例中,引用初始文件610中代码部分的位置的指针包括code_off330。
在另外的示例中,要保护的代码部分可以包括至少一个class_data_item 300和至少一个code_item 400。
该方法包括生成包括代码部分的副本(或版本)的补充文件640的第二步骤S502。例如,补充文件640可以包含相关的class_data_item300和/或code_item 400(或其倍数(multiple))的副本。补充文件640可以进一步包括引用补充文件640中代码部分的位置的指针。例如,补充文件640可以包含引用补充文件640中相关class_data_item 300和/或code_item 400(或其倍数)的位置的指针。补充文件640中的(一个或多个)这些指针可以是偏移。
与相关代码部分(例如,相关class_data_item 300和/或code_item400)相关的元数据可以进一步形成补充文件640的部分。例如,当代码部分是class_data_item 300时,作为生成补充文件640的第二步骤S502的部分,离线工具620可以解析相关class_data_item300的长度并将其作为元数据保存在补充文件640内。可以通过从下一个class_data_item的偏移减去该class_data_item 300的偏移210来获得class_data_item 300的长度。可以使用类似的方法在补充文件640中提供元数据,其中在代码部分中包括code_item 400。
该方法包括修改初始文件610的第三步骤S503。步骤S503中的修改包括用替换数据替换初始文件610的至少代码部分,从而提供修改文件630。因此,修改文件630是具有被替换数据替换的至少代码部分的初始文件610的副本。替换数据与被替换数据(包括代码部分)的大小相同。换句话说,在每个情况下,数据的字节数量是相同的。这意味着修改文件630保持与初始文件610相同的预定文件格式(和文件大小)。对于.dex文件(以及以类似方式指定对特定数据结构的偏移的其他文件),这意味着大多数指定的偏移(例如,class_def_off 104和data_off 108)在修改文件630中仍然有效。如果偏移本身被替换数据的部分有意替换,则偏移将仅在步骤S503之后变得无效。在优选示例中,替换数据包括随机数据和/或空(null)数据。
步骤S503中的修改被布置成当预定文件格式的读取器试图从修改文件630加载代码部分时引起失败。这将在下面的“运行时处理”章节中进一步详细讨论。然而,一般将理解,用例如空或随机替换数据替换初始文件610的代码部分将意味着修改文件630在代码部分应该在的地方不具有正确的数据类型。因此,对预期代码部分(即对替换数据)的任何验证过程或检查都将倾向于失败。
由方法500生成的受保护的数据包650包括修改文件630和补充文件640。补充文件640可以被认为是补充修改文件630的元数据。
3:运行时处理
在运行时,期望的是预定文件格式的读取器将能够执行已经根据上述方法(即,图5的方法500)生成的受保护的数据包。换句话说,期望的是通常用于读取预定文件格式的相同读取器也将能够读取受保护的数据包。例如,.dex文件读取器还应该能够读取基于初始.dex文件生成的受保护的数据包。这是通过一种方法来实现的,在该方法中,在运行时,响应于当试图从修改文件630(例如,修改的.dex文件)加载代码部分时的失败,补充文件640被处理以便从补充文件640加载代码部分。
图7示意性地图示了用于预定文件格式的读取器执行受保护的数据包的这样的方法700。方法700通常由预定文件格式的读取器在运行时执行。与先前章节中一样,我们在这里描述了如下示例,在该示例中预定的文件格式是.dex文件格式。在该.dex示例中,读取器通常将是诸如Android移动电话之类的Android设备上的.dex文件读取器。然而,也设想了对其他预定文件格式的保护。例如,下面在章节4中给出了与Java类文件(即.class文件格式)相关的另外示例。
在运行时方法700中,要执行的受保护的数据包650包括修改文件630和补充文件640。如上所述,修改文件630包括替换数据,该替换数据已经替换了修改文件630所基于的初始文件610的至少代码部分。如上面讨论的,例如,替换数据可以包括随机数据和/或空数据。修改文件630和初始文件610二者具有预定的文件格式(例如.dex文件格式)。补充文件640包括代码部分的副本。
参考图7,在第一步骤S701中,方法700包括预定文件格式的读取器试图从修改文件630加载代码部分。在该步骤中,读取器完全与它通常将做的那样行动,以便读取预定文件格式的任何文件。例如,如果初始文件610是.dex文件,则读取器将是.dex文件读取器。在该情况下,读取器将以与它通常将尝试读取正常.dex文件完全相同的方式尝试读取修改的.dex文件630。特别地,.dex文件读取器将把整个修改的.dex文件630映射到连续的存储器空间。如上面讨论的,这意味着整个修改的.dex文件630的存储器地址可以容易地在Android文件系统/proc/{pid}/maps文件中找到。注意,大部分修改的.dex文件630将是.dex文件读取器可读的,因为大部分文件未被变更并且修改的.dex文件630格式仍然与正常的.dex文件相同,因此任何未被替换的偏移值将仍然有效。
步骤S701具体包括预定文件格式的读取器试图从修改文件630加载代码部分(即,试图加载已经在修改文件630中被替换数据替换的初始文件610的一部分)。然而,假设代码部分已经被替换数据(例如,空数据或随机数据)替换,试图加载所述代码部分导致步骤S702中的加载失败。换句话说,当修改文件630中的替换数据包括替换初始文件610的代码部分的第一替换数据时,步骤S702中的加载失败可能是由预定文件格式的读取器检测到第一替换数据包括代码部分的无效数据引起的。当初始文件610中的指针引用初始文件610中的代码部分的位置,并且修改文件630中的替换数据包括替换该指针的第二替换数据时,步骤S702中的替代加载失败可能发生。在该情况下,步骤S702中的加载失败可能是由预定文件格式的读取器检测到第二替换数据包括除了对修改文件630中的文件位置的引用之外的数据引起的。换句话说,第二替换数据可以是空的或无意义的数据,其简单地不指向特定的文件位置,使得当读取器尝试将第二替换数据解释为文件位置时,加载将失败。替代地,步骤S702中的加载失败可能是由预定文件格式的读取器检测到第二替换数据包括对修改文件630中的文件位置的引用而引起的,其中修改文件630中的文件位置包括代码部分的无效数据。换句话说,第二替换数据确实指向修改文件630中的文件位置,但是它是错误的文件位置(即,不是你将预期找到代码部分的文件位置)。在该情况下,与从代码部分预期的内容相比,已经被指向的文件位置将几乎肯定包括无效数据,从而引起步骤S702中的加载失败。
在一个示例中,初始文件610是.dex文件并且代码部分与.dex文件的特定类相关联(例如,代码部分包括特定class_data_item 300或来自特定class_data_item 300的特定code_item 400)。在该示例中,当预定文件格式的读取器使用默认类加载器试图从修改文件630加载代码部分时,步骤S702中的加载失败可能发生。默认的类加载器将失败,因为特定的类被替换数据破坏了。
响应于步骤S702中的加载失败,步骤S703包括处理补充文件640,以便从补充文件640加载代码部分。换句话说,在从修改文件630加载代码部分失败之后,代之以从补充文件640加载代码部分。
在初始文件610是.dex文件并且代码部分与.dex文件的特定类相关联的上面的示例中,处理补充文件630以便从补充文件630加载代码部分的步骤S703可以包括多个子步骤,如在图8中所示。第一子步骤S801可以包括创建包括用于从补充文件630加载代码部分的指令的定制类加载器的实例。第二子步骤S802可以包括调整类加载器的默认序列,使得在默认类加载器从修改文件630加载代码部分失败之后调用定制类加载器。默认的类加载器可能是DexClassLoader(参见https://developer.androld.com/reference/dalvik/ system/DexClassLoader)。定制类加载器继承DexClassLoader,但是重载FindClass和LoadClass方法,使得定制类加载器可以用于在运行时从补充文件640加载代码部分。创建定制类加载器实例以包括受保护的数据包650的路径,并包括PathClassLoader对象(包含应用的主.dex文件的类加载器)。第三子步骤S803可以包括使用定制类加载器从补充文件640加载代码部分。
图9A-B提供了关于图8的方法的另外细节。特别地,图9A示出了预定文件格式的读取器中的类加载器的默认序列900A,并且图9B示出了上述第二子步骤S802之后的类加载器的调整序列900B。在图9A中的类加载器的默认序列900A中,存在引导(boot)类加载器910,其充当应用(app)类加载器920的父亲,该应用类加载器920充当定制类加载器930的父亲。在图9B中的类加载器的调整序列900B中,引导类加载器910仍然在顶部,但是应用类加载器920和定制类加载器920已经被交换。因此,引导类加载器910充当定制类加载器930的父亲,该定制类加载器930充当应用类加载器920的父亲。Java的反射机制可以用于在第二子步骤S802中调整类加载器的默认序列(例如,这可以通过改变定制类加载器930中的私有字段mParentClassLoader来完成)。关于反射机制的另外细节,参见https:// developer.androld.com/reference/java/lang/rellect/package-summary。定制类加载器930然后可以接管类查找和类加载过程,以便从补充文件940加载代码部分。这也提供了对存储器中的加载的修改文件630进行改变的机会。
返回到图7,处理补充文件630以便从补充文件640加载代码部分的步骤S703可以进一步包括按需将代码部分加载到堆存储器。如上面提及的,当Android系统执行.dex文件时,它将整个.dex文件映射到连续存储器空间。因此,修改的.dex文件630的整体将由.dex文件读取器加载到堆中的连续存储器空间。在攻击者可以基于Android系统/proc/{pid}/maps文件从存储器访问修改的.dex文件630的整体时,该修改的.dex文件630仅包含初始.dex文件610的所选部分。换句话说,修改的.dex文件630是初始.dex文件610的损坏版本并且修改的.dex文件630的内容是不完整的。然而,代码部分仅按需被加载到堆。这使得对于攻击者而言访问代码部分难得多。换句话说,因为代码部分(例如,特定的class_data_item300和/或code_item 400)被按需加载到存储器,所以对于攻击者而言一次得到所有的字节码是非常困难的。
按需代码部分加载步骤可以形成图8的子步骤S803的部分。如在图10中所示,按需将代码部分加载到堆存储器本身可以包括多个子步骤。第一子步骤S1001可以包括为代码部分的字节码分配堆存储器。第二子步骤S1002可以包括修改修改文件630中的指针以引用分配的存储器。第三子步骤S1003可以包括将代码部分的字节码从补充文件640加载到分配的存储器。第四子步骤S1004可以包括将加载的字节码转换成机器代码。第五子步骤S1005可以包括释放分配的存储器。第六子步骤S1006可以包括修改修改文件640中的指针,使得它不再引用分配的存储器。因此,修改文件640中的指针仅指向堆中的正确的代码部分存储器位置持续有限的时间(即,在第二至第五子步骤S1002-S1005之后)。这使得对于攻击者而言从存储器访问代码部分难得多。
换句话说,一旦在步骤S703的子步骤S802中调整了类加载器的默认序列,子步骤S803就包括使用定制类加载器930从补充文件640加载代码部分。这涉及使用定制类加载器930拦截代码部分的加载过程。已知哪个代码部分将被加载(即,我们知道哪个class_data_item 300或code_item 400将被加载),因此可能的是修改修改文件630中的(一个或多个)相关偏移值并为代码部分字节码动态分配堆存储器。换句话说,对于与代码部分相关联的特定类,读取器可以从修改文件630读取所有的类元数据,并且为与该类相关的代码部分的字节码分配堆存储器。然后可以相应地修改相关的偏移。例如,如果代码部分包括特定类的class_data_item 300,则该class_data_item 300的元数据可以从补充文件640(如果这包括相关元数据)或从修改文件630本身获得。基于该元数据,可能的是为class_data_item300的字节码分配适当的堆存储器,并修改修改文件630中的相关联的偏移(class_data_off210)。class_data_item 300的字节码然后从补充文件640加载到分配的堆存储器。换句话说,已经将class_data_item 300重新定位到新的存储器地址,并且也已经改变了class_data_off 210,有可能通过新的偏移来寻求class_data_item 300的新位置。类似地,对于包括特定code_item 400的代码部分,已经将code_item 400重新定位到新的存储器地址,并且还已经改变了相关的encoded_method320中的code_off330,有可能通过新的偏移来寻求code_item 400的新地址。在相关字节码成功加载到堆存储器之后,字节码被转换成机器代码并且分配的堆存储器可以被释放,并且偏移被改变。在该阶段处改变偏移确保当代码部分从补充文件640加载到存储器时,在修改的.dex文件630中的相关代码部分的(一个或多个)偏移仅指向堆中的(一个或多个)正确存储器位置持续有限的时间。这使得对于攻击者而言找到和访问堆上的代码部分难得多。
尽管数据偏移已经被修改并且代码部分已经从修改的.dex文件630移动到新的分配的存储器,.dex文件结构不改变。由于修改文件630的格式与初始文件610的格式相同,因此Android系统能够通过解析不同数据结构中的偏移并寻求对应的存储器地址来寻求相关数据。这样,.dex文件读取器仍然能够处理修改的.dex文件630。
如上面指出的,代码部分(例如,特定的class_data_item 300和/或code_item400)被动态加载到堆存储器,并且一旦Android系统已经完成将代码部分字节码转换成机器代码,堆存储器的该部分就被释放。因此,对于攻击者而言,即使他们可以取得整个存储器的快照,他们也仅可以得到class_data_item 300和/或code_item 400的非常有限的部分。此外,即使攻击者曾经能够从存储器访问整个代码部分,那么对于他们而言花费相当多的时间来从修改的(即损坏的).dex文件630恢复初始的.dex文件610也将是必要的。因此,受保护的数据包650的使用使得对于攻击者而言转储或篡改受保护的.dex数据包650是非常困难的。
在现有技术中,已知对.dex文件进行加密,或者使用隐藏.dex文件的一些其他方法。然而,在该情况下,当.dex文件需要被加载到Android设备上的DWM时,必要的是解密或恢复存储器中或盘上的加密/隐藏的.dex文件。因此,这为攻击者提供了以这些现有技术方法访问.dex文件的良好机会。相反,本方法使得.dex文件的核心数据(即所选代码部分)能够利用堆从通常的.dex存储器位置移动到另一个位置。此外,修改的.dex文件630中的(一个或多个)相关偏移在Android需要(即,按需)访问该数据时仅被改变为指向(一个或多个)正确的存储器地址。因此,本方法防止了运行时的.dex文件的非法存储器转储或篡改。此外,根据本方法,正在对软件文件(例如.dex文件)进行修改,以便改进软件执行的运行时安全性,从而使用技术手段提供技术效果。
4:Java类文件示例
Java字节码.class文件以许多方式具有与.dex文件类似的文件结构,并且也可以从具有一些差异的针对.dex文件的上述保护中获益,如下面讨论的那样。
.class文件包含与该类相关联的所有方法的字节码。然而,.class文件中的数据是以序列化方式存储的,因此在.class文件中不存在“偏移”概念,并且当解析.class文件时,必要的是逐个地解析不同的数据结构。图11示出了示例性.class文件数据结构。为了寻求图11的access_flags字段,必要的是经过magic、minor_version、major_version、constant_pool_count和constant_pool[constant_pool_count-1],以便寻求access_flags的正确位置(或地址或偏移)。
图5的方法500可以用于从与特定类相关联的初始的.class文件610生成受保护的数据包650。方法500的第一步骤S501是标识要保护的代码部分。值得注意的是,.class文件方法的字节码放在methods[methods_count]中。一般而言,这些方法包含期望保护的代码(就像class_data_item 300和code_item 400包含在.dex文件中最期望保护的代码一样)。因此,对于初始的.class文件610,要保护的代码部分包括methods[methods_count]。在该情况下,标识要保护的代码部分的步骤S501包括(a)解析特定类的初始.class文件610,以获得methods[methodcount],以及(b)将methods[methodcount]标识为代码部分的一部分。不是保护methods[methodcount]的整体,而是替代地有可能仅保护methods[methodcount]的(一个或多个)特定方法。如在方法500的步骤S502中,生成补充文件640以包括来自初始的.class文件610的代码部分的副本。如在方法500的步骤S503中,初始的.class文件被修改,其中修改包括用替换数据替换初始的.class文件的至少代码部分,从而提供修改的.class文件640。该方法由离线工具620执行。
.class文件读取器可以使用图7的方法700来执行受保护的数据包。具体地,在运行时,响应于当试图从修改的.class文件630加载代码部分时的失败,补充文件640被处理,以便代之以从补充文件640加载代码部分。在该情况下,当使用默认类加载器试图从修改的.class文件630加载代码部分时,图7的步骤S702的加载失败发生。在运行时,创建定制类加载器(按照图8的步骤S801),并且调整类加载器的默认序列(按照图8的步骤S802),以便重载FindClass方法。一旦Java虚拟机(JVM)已经试图加载与修改的.class文件相关联的特定类,定制类加载器就可以拦截加载动作,并将代码部分填充回到存储器中的修改的.class文件630。一旦类已经成功加载并且所有的字节码都已经转换成机器代码,则我们就可以擦除我们填充到.class文件中的代码部分。
因此,处理补充文件640以便从补充文件640加载代码部分可以包括:(a)将修改文件的字节码加载到存储器;(b)创建定制类加载器的实例,包括用于从补充文件加载代码部分的指令;(c)调整类加载器的默认序列,使得在默认类加载器从修改文件加载代码部分失败之后调用定制类加载器;(d)将代码部分的字节码从补充文件加载到存储器中对应于修改文件中代码部分的位置的位置;(e)将代码部分的加载的字节码转换成机器代码;以及(f)从存储器删除代码部分的加载的字节码。
这由于.class文件的数据结构序列化而不同于上面针对.dex文件所述的方法;序列化意味着我们不能将代码部分加载到堆存储器的另一部分——取而代之,必要的是以堆中存储的.class文件中的代码部分的原始位置将代码部分加载到堆存储器。因此,提供给.class文件的保护比提供给.dex文件的保护稍弱,因为整个.class文件在存储器中存在有限的时间。尽管如此,如果攻击者没有在恰好正确的时间从存储器转储.class文件,则他们就将仅获得初始.class文件610的损坏版本(即它们将获得修改的.class文件630)。因此,本方法也为Java字节码提供了有用的保护。
5:修改
将领会,所描述的方法已经被示出为以特定顺序执行的个体步骤。然而,本领域技术人员将领会,这些步骤可以被组合或者以不同的顺序执行,同时仍然实现期望的结果。
将领会,本发明的实施例可以使用多种不同的数据处理系统来实现。特别地,尽管各图以及其讨论提供了与将分别在DVM/JVM上运行的.dex文件和.class文件相关的示例,但这些仅被呈现来在讨论本发明的各个方面时提供有用的参考。本发明的实施例可以在诸如个人计算机、膝上型计算机、个人数字助理、移动电话、机顶盒、电视、服务器计算机等之类的任何合适的数据处理设备上执行。当然,为了讨论的目的,已经简化了对系统和方法的描述,并且它们只是可以用于本发明的实施例的许多不同类型的系统和方法中的一个。将领会,逻辑块之间的边界仅仅是说明性的,并且替代实施例可以合并逻辑块或元件,或者可以对各种逻辑块或元件施加功能性的替代分解。
将领会,上面提及的功能性可以作为硬件和/或软件实现为一个或多个对应的模块。例如,上面提及的功能性可以被实现为由系统的处理器执行的一个或多个软件部件。替代地,上面提及的功能性可以被实现为硬件,诸如在一个或多个现场可编程门阵列(FPGA)、和/或一个或多个专用集成电路(ASIC)、和/或一个或多个数字信号处理器(DSP)、和/或一个或多个图形处理单元(GPU)、和/或其他硬件布置上。在本文中包含的流程图中实现的或者如上所述的方法步骤中的每个可以由对应的相应模块来实现;在本文中包含的流程图中实现的或者如上所述的多个方法步骤可以由单个模块一起实现。
将领会,在本发明的实施例由计算机程序实现的范围内,则存储或承载计算机程序的一个或多个存储介质和/或一个或多个传输介质形成本发明的方面。计算机程序可以具有一个或多个程序指令或程序代码,所述一个或多个程序指令或程序代码在由一个或多个处理器(或一个或多个计算机)执行时,执行本发明的实施例。如本文使用的术语“程序”可以是被设计用于在计算机系统上执行的指令序列,并且可以包括子例程、函数、过程、模块、对象方法、对象实现、可执行应用、小应用、小服务程序、源代码、目标代码、字节码、共享库、动态链接库和/或被设计用于在计算机系统上执行的其他指令序列。存储介质可以是磁盘(诸如硬盘驱动器或软盘)、光盘(诸如CD-ROM、DVD-ROM或蓝光盘)、或存储器(诸如ROM、RAM、EEPROM、EPROM、闪存或便携式/可移动存储器设备)等。传输介质可以是通信信号、数据广播、两个或更多计算机之间的通信链路等。
Claims (19)
1.一种从初始文件生成受保护的数据包的方法,初始文件具有预定文件格式,所述方法包括:
标识要保护的初始文件的代码部分;
生成包括代码部分的副本的补充文件;以及
修改初始文件,其中修改包括用替换数据替换初始文件的至少代码部分,从而提供修改文件,其中修改文件具有与初始文件相同的预定文件格式,并且其中修改被布置为在预定文件格式的读取器试图从修改文件加载代码部分时引起失败;
其中,受保护的数据包包括修改文件和补充文件。
2.根据权利要求1所述的方法,其中,替换数据包括随机数据和/或空数据。
3.根据权利要求1或权利要求2所述的方法,其中,标识要保护的初始文件的代码部分包括解析初始文件以标识代码部分。
4.根据任何前述权利要求所述的方法,其中标识要保护的初始文件的代码部分包括解析初始文件以标识引用初始文件中的代码部分的位置的指针。
5.根据任何前述权利要求所述的方法,其中,补充文件还包括引用补充文件中的代码部分的位置的指针。
6.根据权利要求1-5中的任一项所述的方法,其中,初始文件是.dex文件,其中代码部分与.dex文件的特定类相关联。
7.根据权利要求1-5中的任一项所述的方法,其中,初始文件是.dex文件,其中,代码部分与.dex文件的特定类的特定方法相关联。
8.根据权利要求1-5中的任一项所述的方法,其中,初始文件是与特定类相关联的Java类文件,并且其中代码部分与特定类的特定方法相关联。
9.一种根据任何前述权利要求所述的方法生成的受保护的数据包。
10.一种用于预定文件格式的读取器执行受保护的数据包的方法,受保护的数据包包括经修改文件和补充文件,修改文件包括替换数据,替换数据已经替换了修改文件所基于的初始文件的至少代码部分,修改文件和初始文件具有预定文件格式,补充文件包括代码部分的副本,并且所述方法包括:在运行时:
响应于在试图从修改文件加载代码部分时的失败,处理补充文件,以便从补充文件加载代码部分。
11.根据权利要求10所述的方法,其中,替换数据包括随机数据和/或空数据。
12.根据权利要求10或权利要求11所述的方法,其中,修改文件中的替换数据包括替换初始文件的代码部分的第一替换数据,并且其中失败是由预定文件格式的读取器检测到第一替换数据包括代码部分的无效数据而引起的。
13.根据权利要求10-12中的任一项所述的方法,其中,初始文件中的指针引用初始文件中的代码部分的位置,并且其中修改文件中的替换数据包括替换指针的第二替换数据,使得失败是由以下内容之一引起的:
预定文件格式的读取器检测到第二替换数据包括除了对修改文件中的文件位置的引用之外的数据;或者
预定文件格式的读取器检测到第二替换数据包括对修改文件中的文件位置的引用,其中修改文件中的文件位置包括代码部分的无效数据。
14.根据权利要求10-13中的任一项所述的方法,其中,初始文件是.dex文件,其中代码部分与.dex文件的特定类相关联,并且其中,当预定文件格式的读取器使用默认类加载器试图从修改文件加载代码部分时,发生失败。
15.根据权利要求14所述的方法,其中,处理补充文件以便从补充文件加载代码部分包括:
创建定制类加载器的实例,包括用于从补充文件加载代码部分的指令;以及
调整类加载器的默认序列,使得在默认类加载器从修改文件加载代码部分失败之后调用定制类加载器。
16.根据权利要求10-15中的任一项所述的方法,其中,处理补充文件以便从补充文件加载代码部分还包括按需将代码部分加载到堆存储器。
17.当从属于权利要求14或权利要求15时根据权利要求16所述的方法,其中,按需将代码部分加载到堆存储器包括:
为代码部分的字节码分配堆存储器;
修改修改文件中的指针以引用分配的存储器;
将代码部分的字节码从补充文件加载到分配的存储器;
将加载的字节码转换为机器代码;
释放分配的存储器;以及
修改修改文件中的指针,使得其不再引用分配的存储器。
18.根据权利要求10-12中的任一项所述的方法,其中,初始文件是与特定类相关联的Java类文件,其中代码部分与特定类的特定方法相关联,并且其中当使用默认类加载器试图从修改文件加载代码部分时,失败发生。
19.根据权利要求18所述的方法,其中,处理补充文件以便从补充文件加载代码部分包括:
将修改文件的字节码加载到存储器;
创建包括用于从补充文件加载代码部分的指令的定制类加载器的实例;
调整类加载器的默认序列,使得在默认类加载器从修改文件加载代码部分失败之后调用定制类加载器;
将代码部分的字节码从补充文件加载到存储器中与修改文件中的代码部分的位置相对应的位置处;
将代码部分的加载的字节码转换为机器代码;
从存储器删除代码部分的加载的字节码。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/CN2021/105154 WO2023279319A1 (en) | 2021-07-08 | 2021-07-08 | Protected data packages |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117716357A true CN117716357A (zh) | 2024-03-15 |
Family
ID=77021012
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202180100327.4A Pending CN117716357A (zh) | 2021-07-08 | 2021-07-08 | 受保护的数据包 |
Country Status (3)
Country | Link |
---|---|
EP (1) | EP4367586A1 (zh) |
CN (1) | CN117716357A (zh) |
WO (1) | WO2023279319A1 (zh) |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108681457B (zh) * | 2018-05-11 | 2020-09-01 | 西北大学 | 基于代码下沉与残码解释的Android应用程序保护方法 |
KR20210083780A (ko) * | 2019-12-27 | 2021-07-07 | 주식회사 린아레나 | Dex 파일 분할 및 난독화를 통한 안드로이드 앱 보안성 향상 방법 및 시스템 |
-
2021
- 2021-07-08 EP EP21735564.3A patent/EP4367586A1/en active Pending
- 2021-07-08 WO PCT/CN2021/105154 patent/WO2023279319A1/en active Application Filing
- 2021-07-08 CN CN202180100327.4A patent/CN117716357A/zh active Pending
Also Published As
Publication number | Publication date |
---|---|
EP4367586A1 (en) | 2024-05-15 |
WO2023279319A1 (en) | 2023-01-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11748468B2 (en) | Dynamic switching between pointer authentication regimes | |
US8434064B2 (en) | Detecting memory errors using write integrity testing | |
US7313824B1 (en) | Method for protecting digital content from unauthorized use by automatically and dynamically integrating a content-protection agent | |
KR101966754B1 (ko) | 소프트웨어 코드의 생성 및 캐싱 기법 | |
AU2012352754B2 (en) | Facilitating system service request interactions for hardware-protected applications | |
EP2460113B1 (en) | Automated unpacking of portable executable files | |
US20190114401A1 (en) | On device structure layout randomization for binary code to enhance security through increased entropy | |
US8181166B2 (en) | System and method for determining when an EJB compiler needs to be executed | |
JP5740573B2 (ja) | 情報処理装置および情報処理方法 | |
EP1031910A1 (en) | Software program protection mechanism | |
MX2007011026A (es) | Metodo y sistema para la deteccion de codigo extrano. | |
US20060064576A1 (en) | Boot systems and methods | |
US20080270806A1 (en) | Execution Device | |
WO2005096121A1 (ja) | 実行装置 | |
WO2007033321A2 (en) | Secure yet flexible system architecture for secure devices with flash mass storage memory | |
US8473936B2 (en) | System and method for runtime class extracting | |
US10795974B2 (en) | Memory assignment for guest operating systems | |
US8972745B2 (en) | Secure data handling in a computer system | |
US20220308991A1 (en) | Test processing method and information processing apparatus | |
CN111625296A (zh) | 一种通过构建代码副本保护程序的方法 | |
WO2023279319A1 (en) | Protected data packages | |
CN115422554A (zh) | 请求处理方法、编译方法和可信计算系统 | |
US11113392B2 (en) | Executable binary code insertion | |
US20200183675A1 (en) | Image file packaging method and image file packaging system | |
JP7320071B2 (ja) | ヒープメモリを利用して実行可能ファイルを保護する方法およびシステム |
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 |