用于将代码注入到应用程序中的系统和方法

文档序号:10517826阅读:409来源:国知局
用于将代码注入到应用程序中的系统和方法
【专利摘要】本发明提供了一种用于将代码注入到应用程序中的计算机实施的方法。在一个实施例中,识别元数据指针。所述元数据指针指向应用程序启动文件中的第一元数据节区。所述第一元数据节区包括应用程序元数据。在所述应用程序启动文件中创建第二元数据节区。将所述应用程序元数据复制到所述第二元数据节区。所述第二元数据节区包括复制的应用程序元数据。修改所述第二元数据节区中的所述复制的应用程序元数据。更新所述元数据指针以指向所述第二元数据节区。
【专利说明】用于将代码注入到应用程序中的系统和方法
【背景技术】
[0001]计算机系统和计算机相关技术的使用继续高速增长。计算机系统使用的这种增长 影响了计算机相关技术的进展。计算机系统的确已日益成为商业领域和个人消费者活动密 不可分的一部分。计算机系统可用于执行若干商业、工业和学术活动。包括互联网的计算机 网络的使用增长促进了计算机的广泛使用。
[0002] 计算机系统可托管供最终用户使用的应用程序。用户可使用这些应用程序来执行 各种功能。在许多情况下,应用程序被编写来向尽可能多的用户提供广泛功能。然而,在很 多情况下,可能有利的是修改应用程序以满足某些规格。例如,企业可能需要修改应用程序 以降低安全风险和/或提升管理应用程序数据或功能的能力。

【发明内容】

[0003] 根据至少一个实施例,描述了用于将代码注入到应用程序中的计算机实施的方 法。在一个实施例中,可识别元数据指针。元数据指针可指向应用程序启动文件中的第一元 数据节区(section)。第一元数据节区可包括应用程序元数据。可在应用程序启动文件中创 建第二元数据节区。可将应用程序元数据复制到第二元数据节区。第二元数据节区可包括 复制的应用程序元数据。可修改第二元数据节区中复制的应用程序元数据。可更新元数据 指针以指向第二元数据节区。
[0004] 在一些实施例中,可在应用程序启动文件的末尾创建第二元数据节区。例如,第二 元数据节区可能是应用程序启动文件中最后一个项目。
[0005] 在一些实施例中,修改复制的应用程序元数据可包括修改复制的应用程序元数据 以加载注入的对象。在一些情况下,修改复制的应用程序元数据可包括确定应用程序启动 对象。在一个例子中,可根据入口点指令或不同文件中的引用确定应用程序启动对象。在一 些情况下,修改复制的应用程序元数据可包括在复制的应用程序元数据中根据确定的应用 程序启动对象识别应用程序启动对象的构造器代码。在一些情况下,修改复制的应用程序 元数据以加载注入的对象包括修改应用程序启动对象的构造器代码以加载注入的对象作 为创建应用程序启动对象中的第一步骤。在一个例子中,修改复制的应用程序元数据以加 载注入的对象包括修改指向构造器代码的构造器代码指针,以用于创建指向修改的构造器 代码的启动对象。在一个例子中,修改的构造器代码可附加至应用程序启动文件(例如附加 在末尾)。
[0006] 在一些实施例中,修改复制的应用程序元数据以加载注入的对象包括修改复制的 应用程序元数据中的至少一个流。在一些实施例中,修改复制的应用程序元数据以加载注 入的对象包括修改复制的应用程序元数据以定义用于加载注入的对象的构造器。在一些实 施例中,修改复制的应用程序元数据以加载注入的对象包括修改复制的应用程序元数据以 添加对用于实施注入的对象的代码的引用。在一些实施例中,修改复制的应用程序元数据 以加载注入的对象包括修改复制的应用程序元数据以指定代码中的对象名称。
[0007] 在一些实施例中,可确定应用程序启动文件。在一个例子中,可根据可执行文件或 不同文件确定应用程序启动文件。
[0008] 在一些实施例中,应用程序启动文件包括可移植的可执行文件。例如,应用程序启 动文件可为可移植的可执行文件格式。
[0009] 在一些实施例中,第一元数据节区可为.NET元数据节区。在一些实施例中,第二元 数据节区可为.NET元数据节区。
[0010]还描述了被配置用于将代码注入到应用程序中的计算设备。计算设备可包括处理 器和与处理器电子通信的存储器。存储器可存储指令,所述指令在由处理器执行时使得处 理器:识别元数据指针,其中元数据指针指向应用程序启动文件中的第一元数据节区,其中 第一元数据节区包括应用程序元数据;在应用程序启动文件中创建第二元数据节区;将应 用程序元数据复制到第二元数据节区,其中第二元数据节区包括复制的应用程序元数据; 修改第二元数据节区中复制的应用程序元数据;并且更新元数据指针以指向第二元数据节 区。
[0011] 还描述了用于将代码注入到应用程序中的计算机程序产品。计算机程序产品可包 括存储指令的非暂态性计算机可读介质。指令可由处理器执行以:识别元数据指针,其中元 数据指针指向应用程序启动文件中的第一元数据节区,其中第一元数据节区包括应用程序 元数据;在应用程序启动文件中创建第二元数据节区;将应用程序元数据复制到第二元数 据节区,其中第二元数据节区包括复制的应用程序元数据;修改第二元数据节区中复制的 应用程序元数据;并且更新元数据指针以指向第二元数据节区。
【附图说明】
[0012] 附图示出了多个示例性实施例并且为说明书的一部分。这些附图结合下面的描述 展示并且说明本发明的各种原理。
[0013] 图1是示出环境的一个实施例的框图,在该环境中可实施本发明的系统和方法;
[0014] 图2是示出注入模块的一个例子的框图;
[0015]图3是不出修改模块的一个例子的框图;
[0016] 图4是示出应用程序启动文件中新节区165的一个例子的框图;
[0017] 图5是示出本文所描述的系统和方法的一个实施例的框图;
[0018] 图6是示出本文所描述的系统和方法的一个实施例的框图;
[0019] 图7是示出用于将代码注入到应用程序中的方法的一个实施例的流程图;
[0020] 图8是示出用于将代码注入到.NET应用程序中的方法的一个实施例的流程图; [0021]图9是示出根据各个实施例的用于将代码注入到应用程序中的设备的例子的框 图;并且
[0022] 图10示出了适于实施本发明的系统和方法的计算机系统的框图。
[0023] 虽然本文所述的实施例易受各种修改和替代形式的影响,但在附图中以举例的方 式示出了特定实施例并且将在本文详细描述。然而,本文所述的示例性实施例并非旨在限 于所公开的特定形式。相反,本发明涵盖落在所附权利要求范围内的所有修改形式、等同形 式和替代形式。
【具体实施方式】
[0024] 本文所述的系统和方法涉及将代码注入到应用程序中。在一个例子中,本文所述 的系统和方法可涉及将代码注入到.NET应用程序(例如使用.NET框架至少部分实施的应用 程序)中。例如,本文描述的系统和方法可用于将代码注入到Microsoft Silverlight应用 程序(例如Windows Phone应用程序)中。
[0025] 在各种情况下,可能期望更改应用程序的操作。例如,在企业环境下,可能期望向 预先存在的应用程序添加各种管理和/或安全策略。可通过以下方式将管理和/或安全策略 添加至预先存在的应用程序:重写预先存在的应用程序以包括管理和/或安全策略,或者将 预先存在的应用程序包裹在额外层中,该额外层实施所需的管理和/或安全策略。如果使用 了应用程序包裹,则可在不更改预先存在应用程序的情况下实施所需的管理和/或安全策 略。
[0026] 应用程序包裹通常涉及在应用程序启动进程的早期将包裹代码载入应用程序进 程。在一个例子中,可在应用程序启动进程的早期通过修改可移植可执行文件(PE)的导入 地址表(IAT)来加载包裹代码。在启动时,IAT可加载一个或多个动态链接库(DLL)。通过修 改IAT,可加载额外的DLL(例如用于实施应用程序包裹)。然而,在一些情况下(例如在 Windows Phone .NET应用程序中),IAT可仅在系统目录中引用DLL;可禁止对于系统目录的 另外访问(例如禁止将DLL添加至系统目录)。因此,包裹代码无法通过修改IAT来加载。本文 描述的系统和方法可以克服上述挑战。例如,本文所描述的系统和方法可用于将代码注入 到.NET应用程序中(例如以加载包裹代码)。在一些情况下,本文描述的系统和方法可用作 经由IAT修改注入代码的替代方案。例如,本文描述的系统和方法可用于在注入的代码本身 基于.NET时注入代码。
[0027]图1是示出环境100的一个实施例的框图,在该环境中可实施本发明的系统和方 法。环境100可包括设备105和存储装置125。设备的例子包括计算机、服务器、个人计算设 备、移动设备、智能手机等。设备105可经由连接120耦接至存储装置125。连接120的例子包 括局部总线、局域网(LAN)、广域网(WAN)、互联网等。在一个例子中,存储装置125可在设备 105的内部。在另一个例子中,存储装置125可在设备(例如网络附接存储装置)外部。存储装 置125可存储一个或多个文件。文件的例子包括可移植的执行文件、应用程序启动文件130 和/或其他文件(例如文件135、注入的文件140)。在一个例子中,可移植的执行文件、应用程 序启动文件130和/或其他文件可包含在应用程序文件集180中。在一些情况下,应用程序文 件集180可为安装文件格式(例如,Windows Phone的.XAP、.zip、程序包等)。
[0028] 设备105可包括注入模块110。在一个例子中,注入模块110可将代码注入到文件 中。例如,注入模块110可将代码注入到应用程序文件集180和/或应用程序启动文件130中。 在一个例子中,应用程序启动文件130和/或其他文件可为可移植的可执行文件的形式(例 如.exe文件、.dll文件等)。在一个例子中,应用程序文件集180可为用于运行第三方应用程 序的应用程序文件集。在一个例子中,应用程序启动文件130可为启动应用程序执行的文件 (例如汇编文件、DLL)。在一个实施例中,文件135和/或注入的文件140可为动态链接库 (DLL)文件。在一些情况下,应用程序启动文件130和/或应用程序文件集180可基于.NET框 架。
[0029] 在一种配置中,应用程序启动文件130可包括多个节区。例如,应用程序启动文件 130可包括一个或多个标头节区135、元数据节区150以及一个或多个其他节区。在一个例子 中,标头节区135可为.NET标头节区135。标头节区135可包括指向元数据节区150的位置的 指针145 (例如.NET元数据节区)。在一个例子中,元数据节区150可包括应用程序元数据155 (例如.NET应用程序元数据)。
[0030] 在一个例子中,通过修改应用程序元数据155,注入模块110可将代码注入到应用 程序文件集180中。然而,修改包括在元数据节区150中的应用程序元数据155(例如直接修 改应用程序元数据155)可能存在各种挑战。
[0031] 与直接修改应用程序元数据155相关的挑战之一涉及更新应用程序启动文件130 中的链接和引用。应用程序启动文件130可包括多个位置特定的链接或引用。在一个例子 中,位置特定的链接或引用可能基于应用程序启动文件130中链接或引用的位置。因此,修 改应用程序启动文件130中链接或引用的位置(例如,由于元数据的插入)可能必需更新链 接或引用来反映新位置。由于元数据节区150可前置于一个或多个节区(例如其他节区 160),因此直接修改元数据节区150中的应用程序元数据155(例如由此注入代码)可能必需 更新后续节区(例如其他节区160)中每个位置特定链接或引用。在一些情况下,更新位置特 定链接或引用可能较为耗时和/或容易出错。
[0032] 在一个例子中,注入模块110可在应用程序启动文件130中创建新节区165。新节区 165可创建在应用程序启动文件130的末尾,使得由于对新节区165的修改,而不存在后续位 置特定链接或引用需要修改。在一个例子中,注入模块110可将包含在元数据节区150中的 应用程序元数据155复制到新节区165。注入模块110可将新节区165中的复制的应用程序数 据保存为复制的应用程序元数据170。在将应用程序元数据155复制到新节区165时,复制的 应用程序元数据170可为应用程序元数据155的精确副本。
[0033] 在一个例子中,注入模块110可修改复制的应用程序元数据170。例如,注入模块 110可修改复制的应用程序元数据170以包括注入的元数据175。在一个例子中,注入的元数 据175可引用和/或加载一个或多个注入的文件140。例如,注入的元数据175可触发应用程 序以结合应用程序的启动加载包裹代码(例如由此包裹应用程序)。
[0034] 在一个例子中,注入模块110可修改指针145以指向新节区165而非元数据节区 150。由此,可执行已经修改为包括注入的元数据175的复制的应用程序元数据170,而非元 数据节区150中的应用程序元数据155。在注入的元数据175和注入的文件140对应于包裹代 码的情况下,应用程序可在指针145指向新节区165时作为包裹的应用程序执行或可在指针 145指向元数据节区150时正常地执行(没有应用程序包裹)。
[0035]在一个例子中,设备105可包括执行模块115。在一些实施例中,执行模块115可通 过处理应用程序启动文件130来执行应用程序。在一个例子中,执行模块115可处理指针145 指向的元数据并可根据所指向的元数据执行应用程序。在本文描述的系统和方法中,可修 改指针145以指向已修改为包括注入的元数据175的复制的应用程序元数据170。
[0036]图2是示出注入模块110-a的一个例子200的框图。注入模块110-a可为图1中示出 的注入模块110的一个例子。注入模块110-a可包括启动文件检测模块205、节区创建模块 210、元数据复制模块215、修改模块220、代码注入模块225、指针更新模块230以及重新打包 模块235。注入模块110-a的至少一些操作和功能可通过或结合模块205-235执行。
[0037]在一个实施例中,启动文件检测模块205可检测应用程序启动文件(例如应用程序 启动文件130)。应用程序启动文件可为在应用程序启动进程中执行的第一文件。除此之外 或作为另外一种选择,应用程序启动文件可为包括用于设置启动对象(例如启动执行应用 程序的对象)的.NET元数据的文件。在一个例子中,启动文件检测模块205可根据应用程序 清单文件(例如WMAppManifest.xml)检测应用程序启动文件。例如,启动文件检测模块205 可根据在应用程序清单文件中作为启动文件引用的应用程序启动文件(例如引用的第一汇 编文件)来检测应用程序启动文件。在另一个例子中,启动文件检测模块205可确定应用程 序启动文件可为应用程序文件集中单独的可执行文件(例如.ΕΧΕ文件)。
[0038]在一个实施例中,节区创建模块210可在应用程序启动文件中创建新节区(例如新 节区165)。例如,节区创建模块210可在应用程序启动文件的末尾创建新节区。如之前所述, 节区创建模块210可在应用程序启动文件末尾创建新节区以最大程度减少需要更新的位置 特定链接或引用的数目。在应用程序启动文件末尾创建新节区可确保在新节区后面没有位 置特定链接或引用。尽管如此,应注意,可能由于新节区中的修改而需要执行位置特定链接 或引用的一些更新。
[0039]在一个实施例中,元数据复制模块215可将应用程序元数据(例如应用程序元数据 155)从元数据节区(例如元数据节区150)复制到新节区。因此,在修改之前,复制的应用程 序元数据170可为元数据节区中应用程序元数据的精确副本(例如,无论所使用的元数据是 否为来自从新节区复制的应用程序元数据的元数据节区的应用程序元数据,应用程序都可 完全一样地工作)。
[0040] 在一个实施例中,修改模块220可修改复制的应用程序元数据。例如,修改模块220 可添加(例如注入)、移除和/或修改复制的应用程序元数据中的元数据。在一个例子中,修 改模块220可允许注入的代码结合应用程序加载。例如,修改模块220可允许应用程序(例如 使用.NET框架实施的应用程序)的应用程序包裹。在下面进一步详述了修改模块220。
[0041] 在一个实施例中,代码注入模块225可将代码注入到应用程序文件集(例如应用程 序文件集180)中。例如,代码注入模块225可在应用程序文件集中插入一个或多个注入的文 件(例如注入的文件140)。在一个例子中,注入的文件可为DLL、汇编文件等。在一个例子中, 对于应用程序元数据的修改可引用和执行包括在注入的文件中的代码。
[0042] 在一个实施例中,指针更新模块230可更新指向.NET元数据的指针(例如指针 145)。例如,(例如在已修改复制的应用程序元数据后)指针更新模块230可更新指针以指向 新节区中的复制的应用程序元数据。在一个例子中,指针更新模块230可将指针更新回元数 据节区中的应用程序元数据,以用于在没有注入的代码的情况下执行应用程序。在一个例 子中,这可允许在将应用程序作为包裹的应用程序运行或没有任何包裹地运行应用程序之 间便利地切换。
[0043] 在一个实施例中,重新打包模块235可重新打包应用程序文件集,使其包括注入的 文件140。例如,重新打包模块235可将应用程序启动文件以及其他文件(例如文件135、注入 的文件140)重新打包为单个文件(例如.exe、.zip、.xap等)。
[0044] 图3是示出修改模块220-a的一个例子300的框图。修改模块220-a可为图2中示出 的修改模块220的一个例子。修改模块220-a可包括流识别模块305、流修改模块310、启动对 象识别模块315、构造器代码检测模块320以及构造器代码修改模块325。修改模块220-a的 至少一些操作和功能可通过或结合模块305-325执行。
[0045]在一个实施例中,流识别模块305可识别应用程序元数据(例如.NET应用程序元数 据)中的一个或多个流。例如,流识别模块305可识别.NET元数据中的《Strings流和/或#~ 流。在一些实施例中,流识别模块305还可识别流中的一个或多个表。例如,流识别模块305 可识别#~流中的AssemblyRef表、#~流中的TypeRef表、#~流中的MemberRef表和/或#~ 流中的MethodDef表。
[0046] 在一个实施例中,流修改模块310可修改(例如添加、移除或更改)流中的元数据。 例如,流修改模块310可修改各个流中的元数据,使得可正确地构造至少一个注入的对象, 该注入的对象将作为应用程序的一部分加载。在一个例子中,流修改模块310可修改# Strings流中的元数据、#~流中的As semblyRef表、#~流中的TypeRef表、#~流中的 MemberRef表和/或#~流中的MethodDef表。
[0047] 在一个例子中,流修改模块310可为注入的汇编文件(例如包裹汇编)、注入的文件 命名空间(例如包裹命名空间)和/或注入的对象(例如包裹对象)添加名称(例如字符串)。 这些名称可由一个或多个其他流引用。
[0048] 在一个例子中,流修改模块310可修改#~流内的AssemblyRef表中的元数据,以添 加有关注入的汇编文件(例如注入的DLL文件)的信息。有关注入的汇编文件的信息可引用 注入的汇编文件。在一个例子中,有关注入的汇编文件的信息可包括注入的汇编文件的版 本信息。AssemblyRef表中修改的元数据可引用一个或多个添加流的名称。例 如,有关注入的汇编文件的信息可引用注入的汇编文件的流中添加的名称。 [0049]在一个例子中,流修改模块310可修改#~流内的TypeRef表中的元数据以添加对 注入的对象的类型引用(例如对象类型)。新类型引用可引用有关在AssemblyRef表中添加 的注入的汇编文件的信息。新类型引用也可引用注入的文件命名空间和/或注入的对象。在 一个例子中,类型引用可指示可创建的对象的类别。
[0050] 在一个例子中,流修改模块310可修改#~流内的MemberRef表中的元数据以对注 入的对象添加构造器。构造器可引用在TypeRef表中引用的新类型。构造器可允许注入的对 象通过使用在TypeRef表中列出的新类型引用并且正确引用在AssemblyRef表中列出的注 入的汇编文件集来创建。
[0051]在一些情况下,流修改模块310可根据对表的修改而更新#~流内的表中的行数的 计数器。例如,当额外的行添加至表时,流修改模块310可增大表中行数的计数器,而当从表 移除行时,行数的计数器可能减小。在一些情况下,可能需要表中行数的每个计数器都正 确,以便正确地在应用程序启动文件中引用。
[0052]在一个实施例中,构造器代码检测模块320可检测用于启动对象(例如创建应用程 序的对象)的构造器。在一些情况下,构造器代码检测模块320可通过识别启动对象而检测 用于启动对象的构造器代码。在一个例子中,可在清单文件中引用启动对象。例如,可将启 动对象作为清单文件中的入口对象引用。在另一个例子中,可根据在应用程序启动文件中 识别的入口点指令来识别启动对象。一旦识别了启动对象(例如根据清单文件或入口点指 令),便可在#~流中的MemberRef表中搜索用于启动对象的构造器。在MemberRef表中找到 用于启动对象的构造器之后,构造器代码检测模块320可检测用于启动对象的构造器代码。 [0053]在一个实施例中,构造器代码修改模块325可修改用于启动对象的检测到的构造 器代码。例如,构造器代码修改模块325可修改检测到的构造器代码以加载注入的对象(例 如使用为注入的对象创建的构造器)作为创建启动对象中的第一步骤。这可允许注入的代 码结合应用程序加载。在一个例子中,这可允许第三方应用程序(例如使用.NET实施的应用 程序)包裹有注入的代码(例如管理和/或安全策略)。
[0054] 在一些实施例中,修改模块2 2 0 - a可额外地修改清单文件(例如 WMAppManifest .xml)来引用添加的汇编文件。在一些情况下,可修改AppManifest · xaml文 件以将.NET对象作为部署的汇编添加。在一些情况下,可执行这些步骤中的一个或两个来 重新签署程序包。
[0055]图4是示出应用程序启动文件130-a中新节区165-a的一个例子400的框图。应用程 序启动文件130-a可为图1中示出的应用程序启动文件130的例子。如之前所述,新节区165-a可包括复制的应用程序元数据170-a。在该例子中,复制的应用程序元数据170-a可包括第 一流405和第二流415。在一个例子中,第一流405可为#Strings流而第二流415可为#~流。 如之前所述,第一流405可包括注入的元数据175-a-l。注入的元数据175-a-l可包括一个或 多个注入的字符串410。例如,所述一个或多个注入的字符串410可包括用于包裹汇编的名 称、包裹命名空间的名称和/或包裹对象名称的字符串。
[0056] 在一个例子中,第二流415也可包括注入的元数据175-a_2。例如,注入的元数据 175-a-2可包括注入的汇编信息420(例如包括在AssemblyRef表中)、注入的类型引用425 (例如包括在TypeRef表中)和/或注入的构造器430(例如包括在MemberRef表中)。如之前所 述,第一和第二流中注入的元数据可允许创建注入的对象。在一个例子中,第二流415可额 外地包括用于启动对象435的修改的构造器指针(例如修改的构造器指针可在MemberRef表 中)。如之前所述,用于启动对象435(例如附加至新节区165-a中的复制的应用程序元数据 170-a的启动对象)的修改的构造器可加载注入的对象作为创建启动对象中的第一步骤。
[0057] 图5是示出本文所描述的系统和方法的一个实施例500的框图。图5中示出的实施 例可为图1中示出的实施例的例子。然而,在实施例500中,应用程序文件集180可包括清单 文件505 (例如WMAppManifest · xml)。在一个例子中,包括清单文件505可对应于Windows phone应用程序的应用程序文件集180。
[0058] 如之前所述,应用程序文件集180可包括应用程序启动文件130、一个或多个文件 135 (例如汇编文件、DLL文件)。此外,应用程序文件集180可包括清单文件505。在一个例子 中,清单文件505可包括启动对象引用510以及启动文件引用515。在一个例子中,启动对象 引用510可识别应用程序的启动对象(例如入口点对象)。在一个实施例中,启动文件引用可 识别应用程序启动文件(例如包括用于创建启动对象的构造器代码的汇编文件)。
[0059] 在一些实施例中,注入模块110可将应用程序文件集180解包(例如解压)以将代码 注入到应用程序文件集180中。在一个例子中,注入模块110可根据启动文件引用505确定应 用程序文件集180中的哪个文件135为应用程序启动文件130。在确定哪个文件135是应用程 序启动文件130之后,注入模块110可从元数据节区复制应用程序元数据155并在应用程序 启动文件130末尾将复制的应用程序元数据170-b保存在新节区165中。如之前所述,注入模 块110可修改复制的应用程序元数据170-b以包括注入的元数据175并且可修改应用程序文 件集180以包括一个或多个注入的文件140(例如汇编或DLL文件)。在一个例子中,注入模块 110可根据清单文件505中的启动对象引用510识别启动对象的构造器。如之前所述,注入模 块110可修改启动对象的构造器以创建启动对象435的修改的构造器。在一个例子中,注入 的元数据可包括修改的构造器指针,该指针指向启动对象435的修改的构造器。在一些情况 下,启动对象435的修改的构造器可附加至应用程序启动文件130的末尾(例如在复制的应 用程序元数据的末尾、在新节区中或者在不同的节区中)。如之前所述,启动对象435的修改 的构造器可加载注入的对象作为创建启动对象中的第一步骤。
[0060] 图6是示出本文所描述的系统和方法的一个实施例600的框图。图6中示出的实施 例可为图1和/或图5中示出的实施例的例子。然而在实施例600(例如非电话.NET应用程序) 中,应用程序启动文件130可为应用程序文件集180中单独的.ΕΧΕ文件。因此,注入模块110 可能无需确定应用程序启动文件130。在该例子中,启动对象引用510可包含在应用程序启 动文件130中。例如,启动对象引用510可由入口点指令引用。在一个例子中,在应用程序启 动文件130中包括启动对象引用510可对应于基于Windows的.NET应用程序的可移植的可执 行文件180。如之前所述,注入模块110可将元数据注入到复制的应用程序元数据170-b中并 且可将一个或多个注入的文件140注入到应用程序文件集180中。在一个例子中,注入模块 11 〇可使用启动对象引用510来识别启动对象的构造器。注入模块110可修改启动对象的构 造器以生成启动对象435的修改的构造器。在一个例子中,注入的元数据可包括修改的构造 器指针,该指针指向启动对象435的修改的构造器。在一些情况下,启动对象435的修改的构 造器可附加至应用程序启动文件130的末尾(例如在复制的应用程序元数据的末尾、在新节 区中或者在不同的节区中)。在一个例子中,启动对象435的修改的构造器可加载注入的对 象作为创建启动对象中的第一步骤。
[0061] 图7是示出用于将代码注入到应用程序中的方法700的一个实施例的流程图。在一 些配置中,方法700可通过图1、图2、图5和/或图6中示出的注入模块110实施。
[0062]在方框705处,可识别元数据指针。元数据指针可指向应用程序启动文件中的第一 元数据节区。在方框710处,可在应用程序启动文件中创建第二元数据节区。在方框715处, 可将应用程序元数据复制到第二元数据节区。在方框720处,可修改第二元数据节区中复制 的应用程序元数据。在方框725处,可更新元数据指针以指向第二元数据节区。
[0063]图8是示出用于将代码注入到.NET应用程序中的方法800的一个实施例的流程图。 在一些配置中,方法800可通过图1、图2、图5和/或图6中示出的注入模块110实施。
[0064]在方框805处,可识别元数据指针。元数据指针可指向应用程序启动文件中的第一 元数据节区。在方框810处,可在应用程序启动文件中创建第二元数据节区。在方框815处, 可将应用程序元数据复制到第二元数据节区。在方框820处,可修改复制的应用程序元数据 以加载注入的对象。在方框825处,可在复制的应用程序元数据中识别应用程序启动对象的 构造器代码。在方框830处,可修改应用程序启动对象的构造器代码以加载注入的对象,作 为创建应用程序启动对象中的第一步骤。在方框835处,可更新元数据指针以指向第二元数 据节区。
[0065]图9是示出根据各个实施例的用于将代码注入到应用程序中的设备105-a的框图 900。设备105-a可具有各种配置中的任一种,诸如移动设备、平板电脑或个人电脑。设备 105- a可具有内置电源,诸如小型电池,以便于移动操作。在一些实施例中,设备105-a可为 图1、图5和/或图6的设备105。
[0066] 设备105-a可包括天线930、收发器模块905、存储器915以及处理器模块925,这些 组件各自可彼此直接或间接通信(例如经由一个或多个总线)。收发器模块905可被配置为 经由天线930和/或一个或多个有线或无线链接与一个或多个网络双向通信。例如,收发器 模块905可被配置为与一个或多个企业服务器双向通信。收发器模块905可包括调制解调 器,该调制解调器被配置为调制数据包并将经过调制的数据包提供给天线930进行传输,并 且将从天线930接收的数据包解调。
[0067] 存储器915可包括随机存取存储器(RAM)以及只读存储器(ROM)。存储器915可存储 包含指令的计算机可读、计算机可执行软件代码920,所述指令被配置为在被执行时使得处 理器模块925执行本文所述的各种功能(例如识别指针、创建新节区、复制元数据、修改复制 的元数据、更新指针等)。作为另外一种选择,软件代码920可不直接由处理器模块925执行, 但是被配置为使得计算机(例如在被编译和执行时)执行本文所述的功能。
[0068] 处理器模块925可包括智能硬件设备,例如中央处理单元(CPU)、微控制器、专用集 成电路(ASIC)等。
[0069]根据图9的体系结构,设备105-a可进一步包括通信管理模块910。通信管理模块 910可通过一个或多个其他设备管理通信。以举例的方式,通信管理模块910可为设备105-a 的经由总线与移动设备105-a的一些或所有其他组件通信的组件。作为另外一种选择,通信 管理模块910的功能可实施为收发器模块905的组件、计算机程序产品、和/或处理器模块 925的一个或多个控制器元件。
[0070] 根据图9的体系结构,设备105-a还可包括注入模块110-b。注入模块110-b可为图 1、图2、图5和/或图6中示出的注入模块110的一个例子。如上所述,注入模块110-b可实施本 文所述的系统和方法。
[0071] 图10示出了适于实施本发明的系统和方法的计算机系统1000的框图。计算机系统 1000可为图1、图5、图6和/或图9中示出的设备105的一个例子。计算机系统1000包括互连计 算机系统1000的主要子系统的总线1005,所述子系统诸如中央处理器1010、系统存储器 1015 (通常为RAM,但是也可包括ROM、闪存RAM等)、输入/输出控制器1020、外部音频设备(诸 如经由音频输出接口 1030的扬声器系统1025)、外部设备(诸如经由显示适配器1040的显示 屏1035)、键盘1045(与键盘控制器1050连接)(或其他输入设备)、多个通用串行总线(USB) 设备1065(与USB控制器1070连接),以及存储接口 1080。此外,还包括通过串行端口 1060连 接至总线1005的鼠标1055(或其他点击设备)以及网络接口 1085(直接耦接到总线1005)。 [0072]总线1005允许在中央处理器1010和系统存储器1015之间进行数据通信,如前文提 及,系统存储器可以包括只读存储器(ROM)或闪存存储器(均未示出)以及随机存取存储器 (RAM)(未示出hRAM是将操作系统和应用程序装载到其中的主存储器。除了其他代码,ROM 或闪存存储器可以包含控制基本硬件操作(诸如与外围组件或设备的交互)的基本输入输 出系统(BIOS)。例如,用以实施本发明的系统和方法的注入模块110-c可存储在系统存储器 1015中。注入模块110-c可为图1、图2、图5、图6和/或图9中示出的注入模块110的一个例子。 与计算机系统1000驻存在一起的应用程序通常存储在非暂态性计算机可读介质上并通过 它进行访问,所述非暂态性计算机可读介质诸如硬盘驱动器(例如固定磁盘1075)或其他存 储介质。此外,通过接口 1085进行访问时,可以根据应用程序和数据通信技术以电子信号的 形式对应用程序进行调制。
[0073]存储接口 1080与计算机系统1000的其他存储接口一样可以连接到标准计算机可 读介质(诸如固定磁盘驱动器1075)以用于存储和/或检索信息。固定磁盘驱动器1075可以 是计算机系统1000的一部分,或者可以是独立的,并且可以通过其他接口系统进行访问。网 络接口 1085可以经由直接网络链路提供到远程服务器的直接连接,或经由POP(入网点)提 供到互联网的直接连接。网络接口 1085可以使用无线技术提供此类连接,包括数字蜂窝电 话连接、蜂窝数字分组数据(CDH))连接、数字卫星数据连接等。
[0074] 很多其他设备或子系统(未示出)可以通过相似的方式进行连接(例如文档扫描仪、数 码相机等)。相反,不需要提供图10中示出的所有设备亦可实践本发明的系统和方法。可以使 用与图10中所示方式不同的方式来互连设备和子系统。计算机系统的操作(诸如图10中所示的 操作)是本领域中所熟知的,在本申请中不进行详细讨论。用以实施本公开的代码可存储于非暂 态性计算机可读介质中,诸如一个或多个系统存储器1015或固定磁盘1075中。计算机系统1000上 提供的操作系统可为iGS、MS-WINDOWS?, OS/2?. UNIX?、LINUX? 或另外的已知操作系统。
[0075] 此外,关于本文所述的信号,本领域中的技术人员将会认识到,可以将信号从第一 块直接传输到第二块,或者可以在块之间修改信号(例如,放大、衰减、延迟、锁存、缓冲、反 转、过滤或其他修改方式)。尽管上述实施例的信号被特性化为从一个块传输到下一个块, 但本发明的系统和方法的其他实施例可以包括经过修改的信号来代替这些直接传输的信 号,只要信号的信息和/或功能方面在块之间传输。在某种程度上,由于所涉及的电路的物 理限制(例如,不可避免地存在一些衰减和延迟),第二块上的信号输入可以概念化为根据 来自第一块的第一信号输出派生得到的第二信号。因此,正如本文所用,根据第一信号派生 的第二信号包括第一信号或对第一信号所做的任何修改,无论是由于电路限制还是由于通 过不会改变第一信号的信息和/或最终功能方面的其他电路元件。
[0076] 虽然上述公开内容使用特定框图、流程图和例子阐述了各种实施例,但每个框图 组件、流程图步骤、操作和/或本文描述和/或示出的组件可使用多种硬件、软件或固件(或 其任何组合)配置单独和/或共同地实施。此外,包含在其他组件内的组件的任何公开内容 应当被视为在本质上是示例性的,因为可实施许多其他体系结构来实现相同功能。
[0077] 本文描述和/或示出的过程参数和步骤序列仅通过举例的方式给出并且可根据需 要改变。例如,虽然本文示出和/或描述的步骤可以特定顺序示出或讨论,但这些步骤不必 按示出或讨论的顺序来执行。本文描述和/或示出的各种示例性方法也可省略本文描述或 示出的步骤中的一者或多者,或除了所公开的那些步骤之外还包括附加步骤。
[0078] 此外,虽然本文已经在全功能计算系统的背景中描述和/或示出了各种实施例,但 这些示例性实施例中的一者或多者可作为各种形式的程序产品来分配,而不考虑用于实际 进行分配的计算机可读介质的特定类型。本文所公开的实施例也可使用执行某些任务的软 件模块来实施。这些软件模块可包括脚本、批文件或可存储在计算机可读存储介质上或计 算系统中的其他可执行文件。在一些实施例中,这些软件模块可将计算系统配置为执行本 文所公开的示例性实施例中的一者或多者。
[0079] 出于阐释目的,已参考特定实施例进行了以上描述。然而,以上示例性讨论并非旨 在是穷举的或将本发明限制为所公开的精确形式。鉴于上述教导,许多修改形式和变型形 式都是可能的。为了最好地解释本发明的系统和方法的原理及其实际应用,选择并描述了 实施例,由此使得本领域其他技术人员能最好地利用本发明的系统和方法以及具有可适合 所设想的具体用途的各种修改形式的各种实施例。
[0080] 除非另有说明,否则在本说明书和权利要求中使用的术语"一"或"一个"应当理解 为是表示"…中的至少一者"。此外,为了易于使用,在本说明书和权利要求中使用的词语 "包括"和"具有"与词语"包含"可互换并且与词语"包含"具有相同含义。此外,将在说明书 和权利要求中使用的术语"基于"理解为"至少基于"的含义。
【主权项】
1. 一种用于将代码注入到应用程序中的计算机实施的方法,所述方法包括: 识别元数据指针,其中所述元数据指针指向应用程序启动文件中的第一元数据节区, 其中所述第一元数据节区包括应用程序元数据; 在所述应用程序启动文件中创建第二元数据节区; 将所述应用程序元数据复制到所述第二元数据节区,其中所述第二元数据节区包括复 制的应用程序元数据; 修改所述第二元数据节区中的所述复制的应用程序元数据;以及 更新所述元数据指针以指向所述第二元数据节区。2. 根据权利要求1所述的方法,其中所述第二元数据节区在所述应用程序启动文件的 末尾创建。3. 根据权利要求1所述的方法,其中修改所述复制的应用程序元数据包括: 修改所述复制的应用程序元数据以加载注入的对象。4. 根据权利要求3所述的方法,还包括: 确定应用程序启动对象,其中所述应用程序启动对象根据入口点指令或不同文件中的 引用中的至少一者来确定。5. 根据权利要求4所述的方法,还包括: 在所述复制的应用程序元数据中根据所述确定的应用程序启动对象识别所述应用程 序启动对象的构造器代码。6. 根据权利要求5所述的方法,其中修改所述复制的应用程序元数据以加载所述注入 的对象包括: 修改所述应用程序启动对象的所述构造器代码以加载所述注入的对象,作为创建所述 应用程序启动对象中的第一步骤。7. 根据权利要求3所述的方法,其中修改所述复制的应用程序元数据以加载所述注入 的对象包括: 修改所述复制的应用程序元数据中的至少一个流。8. 根据权利要求3所述的方法,其中修改所述复制的应用程序元数据以加载所述注入 的对象包括: 修改所述复制的应用程序元数据以定义用于加载所述注入的对象的构造器; 修改所述复制的应用程序元数据以添加对用于实施所述注入的对象的代码的引用;以 及 修改所述复制的应用程序元数据以在所述代码中指定对象名称。9. 根据权利要求1所述的方法,还包括: 确定所述应用程序启动文件,其中所述应用程序启动文件根据可执行文件或不同文件 中的至少一者来确定。10. 根据权利要求1所述的方法,其中所述应用程序启动文件包括可移植的可执行文 件。11. 根据权利要求1所述的方法,其中所述第一元数据节区包括.NET元数据节区,并且 其中所述第二元数据节区包括.NET元数据节区。12. -种被配置成用于将代码注入到应用程序中的计算设备,包括: 处理器; 与所述处理器进行电子通信的存储器; 存储在所述存储器中的指令,所述指令可由所述处理器执行以: 识别元数据指针,其中所述元数据指针指向应用程序启动文件中的第一元数据节区, 其中所述第一元数据节区包括应用程序元数据; 在所述应用程序启动文件中创建第二元数据节区; 将所述应用程序元数据复制到所述第二元数据节区,其中所述第二元数据节区包括复 制的应用程序元数据; 修改所述第二元数据节区中的所述复制的应用程序元数据;以及 更新所述元数据指针以指向所述第二元数据节区。13. 根据权利要求12所述的计算设备,其中所述第二元数据节区在所述应用程序启动 文件的末尾创建。14. 根据权利要求12所述的计算设备,其中可执行以修改所述复制的应用程序元数据 的所述指令包括可由所述处理器执行以执行以下操作的指令: 修改所述复制的应用程序元数据以加载注入的对象。15. 根据权利要求14所述的计算设备,其中所述指令可由所述处理器执行以: 确定应用程序启动对象,其中所述应用程序启动对象根据入口点指令或不同文件中的 引用中的至少一者来确定。16. 根据权利要求15所述的计算设备,其中所述指令可由所述处理器执行以: 在所述复制的应用程序元数据中根据所述确定的应用程序启动对象识别所述应用程 序启动对象的构造器代码。17. 根据权利要求16所述的计算设备,其中用以修改所述复制的应用程序元数据以加 载所述注入的对象的所述指令包括可由所述处理器执行以执行以下操作的指令: 修改所述应用程序启动对象的所述构造器代码以加载所述注入的对象,作为创建所述 应用程序启动对象中的第一步骤。18. 根据权利要求14所述的计算设备,其中可执行以修改所述复制的应用程序元数据 以加载所述注入的对象的所述指令包括可由所述处理器执行以执行以下操作的指令: 修改所述复制的应用程序元数据中的至少一个流。19. 根据权利要求14所述的计算设备,其中用以修改所述复制的应用程序元数据以加 载所述注入的对象的所述指令包括可由所述处理器执行以执行以下操作的指令: 修改所述复制的应用程序元数据以定义用于加载所述注入的对象的构造器; 修改所述复制的应用程序元数据以添加对用于实施所述注入的对象的代码的引用;以 及 修改所述复制的应用程序元数据以在所述代码中指定对象名称。20. -种用于将代码注入到应用程序中的计算机程序产品,所述计算机程序产品包括 非暂态性计算机可读介质,所述非暂态性计算机可读介质在其上存储有指令,所述指令可 由处理器执行以: 识别元数据指针,其中所述元数据指针指向应用程序启动文件中的第一元数据节区, 其中所述第一元数据节区包括应用程序元数据; 在所述应用程序启动文件中创建第二元数据节区; 将所述应用程序元数据复制到所述第二元数据节区,其中所述第二元数据节区包括复 制的应用程序元数据; 修改所述第二元数据节区中的所述复制的应用程序元数据;以及 更新所述元数据指针以指向所述第二元数据节区。
【文档编号】G06F9/445GK105874429SQ201480069480
【公开日】2016年8月17日
【申请日】2014年12月23日
【发明人】G·D·希尔哈特
【申请人】赛门铁克公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1