欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

使用公共语言运行时获取持久性(下)

来源:本站整理 作者:佚名 时间:2019-09-23 TAG: 我要投稿


上篇文章,虽然我们已经知道可以重写的方法和属性,以及如何更改CLR使用的默认应用程序域管理器。今天,我们就来继续说说如何将实现System.AppDomainManager的强名称程序集安装到GAC中,并最终实现使用公共语言运行时获取持久性。
程序集和全局程序集缓存
如上所述,必须将实现System.AppDomainManager的强名称程序集安装到GAC中,但是,仍有很多问题,比如:
1.什么是程序集?
2.什么是全局程序集缓存(GAC)?
3.为什么以及如何将强名称程序集安装到GAC中?
对于.Net Framework,程序集是一个单元,每个程序集都可以包含MSIL代码、类型、资源和清单。所有这些数据可以分组到一个文件(例如assembly.dll)或拆分成多个文件(例如assembly.dll,assembly.dll.manifest和picture.png)。应该注意的是,只需要清单就可以了。

清单包含用于描述程序集的所有信息,例如程序集名称(例如Context.CLRHooking)、版本(例如1.0.0.0)、 语言文化(culture)属性属性属性(例如neutral)、强名称信息、程序集中所有文件的列表、类型引用信息和关于引用程序集的信息。名称、版本、语言文化(culture)属性属性属性和强名称的组合表示程序集的标识。
强名称程序集只不过是使用强名称密钥(SNK)文件签名的程序集,该文件使用公钥加密并为程序集提供唯一标识。
程序集可以设计为由一个应用程序使用,也可以在多个应用程序之间共享。在这种情况下,全局程序集缓存(GAC)会发挥作用,因为GAC会存储任何打算在整个系统范围内共享的程序集。
在Windows 10或Windows Server 2019等最新的系统中,都有两个GAC,一个位于“C:\Windows\assembly\”,用于在4.0版之前使用.Net Framework的应用程序,另一个位于“C:\Windows\Microsoft.NET\assembly”适用于使用.Net Framework 4.0及以上版本的应用程序。
有两种常规方法可以将程序集安装到GAC中;
1.安装应用程序时,Microsoft安装程序将自动将需要在GAC中的任何程序集安装到GAC中;
2.通过使用Windows软件开发工具包(SDK)中的GAC工具“gacutil.exe”。
由于目标系统不太可能安装Windows SDK,并且安装应用程序不方便,因此应采用其他解决方案。应该注意,无论使用何种技术,都需要管理权限才能将强名称程序集安装到GAC中。
虽然可以手动安装,但是,需要提前了解GAC如何存储程序集。
GAC的根文件夹包含三个文件夹,其中 'GAC_32'包含32位程序集,'GAC_64'包含64位程序集,'GAC_MSIL'包含针对任何平台的程序集。

如果强名称程序集安装到'AC_MSIL'文件夹中,则32位和64位运行时主机都可以使用它。
通过分析已安装到GAC中的强名称程序集,可以找到强名称程序集使用的全名和.Net Framework版本。 'System.Reflection.Assembly'中的'LoadFrom'静态方法用于将程序集加载并存储到变量中。从此变量中,可以访问“FullName”和“ImageRuntimeVersion”属性。

程序集的全名是 ‘Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ ,.Net Framework版本是“v4.0.30319”。该程序集位于:‘Accessibility\v4.0_4.0.0.0__ b03f5f7f11d50a3a’。
基于以上所述,可以得出结论,当使用Microsoft安装程序或GAC工具将程序集安装到GAC中时,它们首先创建一个名为“GAC_32”,“GAC_64”或“GAC_64”下程序集名称的文件夹。 “GAC_32”,“GAC_64”或“GAC_64”都是基于编译程序集的平台。然后,创建一个子目录,该目录的名称基于程序集的标识。
格式如下:
1.“v”字符+ .Net Framework版本+“_”字符的主要版本;
2.程序集的版本+“_”字符;
3. 语言文化(culture)属性属性属性如果不是中性+“_”字;
4.程序集强名称;
例如,如果强名称程序集全名为“Context.Hook,Version = 0.0.0.0,Culture = en,PublicKeyToken = 343c81d3defacaa9”且运行时版本为“v4.0.30319”,则程序集理论上应位于:“C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ Context.Hook \ v4.0_0.0.0.0_en_343c81d3defacaa9 \”。
要自动将程序集安装到GAC中,可以使用以下PowerShell脚本:https://gitlab.com/snippets/1878274。

最后,需要将程序集安装到GAC中的原因是它们需要完全受信任,但也因为运行时主机具有一种特定的方法来定位和将程序集嵌入到系统上。
实际上,CLR执行了四个步骤。首先,CLR检查应用程序配置文件、发布服务器策略文件和机器配置文件,以便定位必须加载的程序集和依赖项。其次,CLR检查运行时主机或应用程序域是否已经加载了程序集。如果已经加载,CLR将使用先前加载的程序集。第三,如果请求强名称程序集,CLR将在GAC中搜索强名称程序集。最后,如果程序集不是强名称程序集或在GAC中找不到,则CLR将探测应用程序库。
如果强名称程序集不引用语言文化(culture)属性属性属性(即中性),则CLR将探测以下目录:

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载