对软件程序集的本机图像进行防病毒检查的系统和方法

文档序号:9922226阅读:459来源:国知局
对软件程序集的本机图像进行防病毒检查的系统和方法
【技术领域】
[0001] 本公开大体涉及计算机科学领域,更具体地,涉及对软件程序集的本机图像进行 防病毒检查的系统和方法。
【背景技术】
[0002] 目前,可安装在用户装置(例如,个人计算机、智能电话、平板电脑等)上的软件应 用显著地增长,且可由这些应用创建的文件的数目也指数地上升。在应用的安装和运行时 由软件应用创建的某些文件是唯一的,即,文件可作为单一副本存在。很难在不执行其内容 的详细分析的情况下分类此类文件。
[0003] 通常,这些文件可为机器代码中的父程序集的图像(即,本机图像),这是.NET技术 的一部分。.NET应用可使用一定数目的程序集一起创建,其中程序集为由公共语言运行(" CLR")环境辅助的二进制文件。.NET程序集包括以下元数据元素:
[0004] ?可移植执行(〃PE〃)文件标头;
[0005] .CLR 标头;
[0006] ?公共中间语言("CIL")代码;
[0007] ?在各种类型的程序集中使用的元数据(例如,类别、接口、结构、列举 (enumerations)、委托);
[0008] ?程序集的清单;以及
[0009] ?额外的内置资源。
[0010]大体上,PE标头识别程序集可在Window?系列的操作系统中加载和执行。PE标头 还识别应用(例如,控制台应用、具有图形用户接口的应用、代码库等)的类型。
[0011] CLR标头构成可支持所有.NET程序集以便它们可在CLR环境中维护的数据。CLR标 头包含诸如标记、CLR版本、入口点(例如,在特定情况下,开始函数Main()的地址),这允许 执行环境确定管理的文件的组成(即,包含管理代码的文件)。
[0012] 各个程序集均包含CIL代码,其为并非依赖处理器的中间代码。在执行期间,CIL代 码由JIT(准时,即,动态编译)以实时模式编译成对应于特定处理器的要求的指令。
[0013] 在任何给定程序集中,还存在完整描述存在于程序集内的类型(例如,类别、接口、 结构、计数、委托等)以及程序集参照的外部类型(即,其它程序集中描述的类型)的格式的 元数据。在可执行环境中,元数据用于确定二进制文件中的类型的位置,以将类型置于存储 器中,且简化类型的方法的远程调用的进程。
[0014] 程序集还可包含清单,其描述组成程序集的各个模块、程序集的版本以及还有当 前程序集参照的任何外部程序集。清单还包含指定程序集的版本和身份的程序集的要求所 需的所有元数据,以及确定程序集的范围和允许链接至资源和类别所需的所有元数据。下 表示出了包含在程序集的清单中的数据。前四个元素(程序集名称、版本号、语言和区域参 数,以及强名称数据)构成程序集的身份。
[0015]
[0017] 任何.NET程序集都可包含任何给定数目的嵌入资源,如,应用图标、图形文件、音 频片段或字符串表。
[0018] 程序集可由若干模块构成。模块为程序集的一部分,即,代码或资源的逻辑收集。 用于程序集中的实体的等级为:程序集 >模块> 类型(类别、接口、结构、计数、委托 (delegate))〉方法。模块可为内部(即,程序集的文件内)或外部的(即,分离文件)。模块没 有入口点,其也不具有任何独立的版本号,且因此其不可由CLR环境直接地载入。模块仅可 由程序集的主模块载入,如,包含程序集的清单的文件。模块的清单仅包含所有外部程序集 的计数。各个模块均具有模块版本标识符("MVID"),其为程序集的各个模块中写出的唯一 标识符,其在各次编译期间变化。
[0019] 图1A示出了单文件程序集的示例性布局。如图所示,在单文件程序集中,所有要求 元素(例如,标头、CIL代码、类型的元数据、清单和资源)位于单个文件*. exe或*.dll内。
[0020] 图1B示出了多文件程序集的实例。多文件程序集由一组.NET模块构成,其以单个 逻辑单元的形式配置,且设有相同的版本号。通常,这些模块中的一个称为主模块,且包含 程序集的清单,且还可包含所有所需的CIL指令、元数据、标头和附加资源。
[0021] 主模块的清单描述主模块的操作依赖的所有其它相关模块。多文件程序集中的次 级模块可分配扩展名*. netmodule。次级*. netmodule模块也包含CIL代码和类型的元数据, 以及模块的水平的清单,其中列举了由给定模块所需的外部程序集。
[0022]正如任何PE文件,程序集可利用数字签名(例如,X. 509)来签名,其位于PE文件或 数字签名目录文件(.cat)的叠加部分(overlay)中。强名称签名另外或单独使用,即,通过 使用程序集的内容和RSA私钥生成的哈希值。哈希值位于PE标头与元数据之间的程序集中。 哈希值使得有可能检查程序集从其编译时的时间起没有变化。对于单文件程序集,当编译 文件时,在PE标头之后没有字节。文件的哈希值然后使用私钥计算,且所得的哈希值输入这 些可用的字节中。
[0023]该技术对于多文件程序集是不同的。除程序集的主文件的哈希值之外,还计算外 部模块的哈希值,此后,数据输入主程序集中。模块没有其自身的签名,且它们具有不同于 主模块的MVID。以下项目输入程序集的清单中:
[0024] · PublicKey,g卩,强名称签名的公钥,以及
[0025] · PublicKeyToken,即,强名称签名的密钥的公开部分的哈希。
[0026]通常,程序集分成:私密和公开/共享。私密程序集应当总是位于与它们用于其中 的客户应用相同的目录(即,应用目录)中或其子目录中的一个中。
[0027]相比之下,公开程序集可同时用于同一装置上的若干应用中。公开程序集并非位 于与它们被认为应用其中的应用相同的目录内。相反,它们可安装在全局程序集缓存(GAC) 中。GAC可同时位于如下表所示的若干位置中:
[0028]
[0029] 安装在GAC中的程序集应当具有强名称。强名称是用于COM中的全局唯一标识符 (GUID)的当代.NET等同物。不同于128位数字的COM中的⑶ID值,.NET的强名称部分地基于 称为公开密钥和秘密(私密)密钥的两个相关加密密钥。
[0030] 强名称由一组相关数据构成,至少包括:
[0031] ?程序集的名称(没有文件扩展名的程序集的名称)。
[0032] ?程序集的版本号;
[0033] ?公钥值;
[0034] ?指定区域的值,其不是强制的,且可用于应用的定位;以及
[0035] ?利用从程序集的内容和私钥的值获得的哈希值创建的数字签名。
[0036]为了创建程序集的强名称,例如,用户可获得公钥和私钥,公钥和私钥的数据由提 供为.NET框架SDK的一部分的实用程序sn.exe生成。实用程序生成包含用于两个不同但数 学上相关的密钥(公钥和私钥)的数据的文件。该文件的位置然后向编译器指出,编译器写 出程序集的清单中的公钥的全部值。
[0037] 在特定情况中,编译器基于程序集的全部内容(例如,CIL代码、元数据等)生成对 应的哈希值。哈希值是对于固定输入数据在统计上唯一的数值。因此,在.NET程序集的任何 数据(甚至字符串字面值中的单个字符)的变化的情况下,编译器将生成不同的哈希值。生 成的哈希值然后与包含在文件内的私钥数据组合,以获得插入CLR标头数据内的程序集中 的数字签名。
[0038] 图1C示出了用于生成强名称的示例性进程。通常,私钥数据未在清单中指出,而是 仅用于由数字签名(连同生成的哈希值)识别程序集的内容。在完成创建和分配强名称的进 程之后,程序集可安装在GAC中。
[0039]例如,至GAC中的程序集的路径可为:
[0040] C:\ffindows\assembly\GAC_32\KasperskyLab\2.0.0.0__b03f5f7f1Id50a3a\ Kaspersky Lab · dll,其中:
[0041 ] C: \Windows\assembly 是至 GAC 的路径;
[0042] \GAC_32是处理器的GAC结构;
[0043] \KasperskyLab是程序集的名称;
[0044] \2.0.0.0_b03f 5f7f 1 Id50a3a是程序集_公钥标记的版本;以及
[0045] KasperskyLab · dl 1是\程序集名称的扩展名。
[0046]在一个特定情况中,程序集的代码的执行按以下发生。首先,分析PE标头来确定应 当开始哪个进程(32或64位)。接下来,载入的选择的文件版本MSCorEE.dll (对于32
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1