zoukankan      html  css  js  c++  java
  • .Net 中枚举AppDomains

    .Net 框架提供的基础类库中并没有枚举AppDomains的功能,只提供了获取当前执行代码所在的AppDomain功能。

    国外一家提供.Net保护工具的,同时提供了一个AppDomain dump工具。用来证明其保护有效。

    名称就不提了,简单介绍一下其保护原理:整体加密保护,支持嵌入程序集生成单一可执行文件。

    也就是用native loader 包裹一下,仍然还是整体加密保护模式。

    但是和其它工具有一点区别。程序集整体解密后不是放在默认AppDomain中执行的,它另外创建了一个AppDomain。

    其提供的dump 工具的原理:

    注入到选择的进程,然后获取当前AppDomain,枚举AppDomain中的 程序集,直接整体dump程序集。

    这个工具可以对付大多数整体加密保护。却对付不了他们自家的。被其用来证明自己的保护效果。

    程序集一般在默认AppDomain中执行的,其注入后,获取当前appdomain得到的使默认AppDomain,所以无法枚举被加密保护的程序集。

    如果加上AppDomain的枚举功能,这个工具就可以用来对付他们自己的保护产品了。

    基础类库中并没有枚举AppDomains的功能,那是否可以在C#中实现呢?

    答案使肯定的。基础类库没有,但是其宿主接口提供了这个功能。

    ICorRuntimeHost 接口中的两个方法

    EnumDomains 和 NextDomain 。

    具体详情可以参考 msdn。

    在C#中怎么使用呢?

    首先添加引用

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscoree.tlb

    路径根据实际情况来定,版本号也不一定非得要2.0.50727 只要存在 mscoree.tlb就行。

    这个接口在 1.0 中就提供了,更高的版本就不用说了。

     

    IntPtr enumHandle = IntPtr.Zero;

    CorRuntimeHostClass host = new mscoree.CorRuntimeHostClass();

    host.EnumDomains(out enumHandle);

    object domain = null;

    while (true)

    {

    host.NextDomain(enumHandle, out domain);

    if (domain == null) break;

    AppDomain appDomain = (AppDomain)domain;

    //********

    }

    host.CloseEnum(enumHandle);

    Marshal.ReleaseComObject(host);

  • 相关阅读:
    webpack 打包性能分析工具
    npm 使用
    npm 构建时,次要版本变化引起的问题
    AtomicStampedReference、AtomicMarkableReference 区别
    vue-cli 中的静态资源处理
    vue-cli 构建项目中 config/index.js 文件解读
    webpack的3个路径配置项: assetsRoot、assetsSubDirectory、assetsPublicPath
    Vue2 dist 目录下各个文件的区别
    DllPlugin、DllReferencePlugin 可以提取的第三方库列表
    JUC集合之 CopyOnWriteArrayList
  • 原文地址:https://www.cnblogs.com/rick/p/1204904.html
Copyright © 2011-2022 走看看