脏黑客:在c#中添加属性或字段到基类型?

时间:2014-09-26 22:54:49

标签: c# security

所以这很可能是我提出的最糟糕的编程问题,我觉得很糟糕。真的,我知道。

有没有办法重新编译一个dll,插入一个公共字段或属性并覆盖一个类中的方法(一个构造函数)?

我使用的是我必须使用的库,但在我看来,设计很差。基本上我们会跟踪加入群组的人的数据。

当我们在系统中创建一个组时,我们可以为组中的每个成员指定我们想要跟踪的自定义字段。在原始系统中,没有办法让成员在注册时自己指定这些数据,这样就为我们的管理人员带来了大量的额外工作。我添加了一个页面来执行此操作,但是,我们有一些组,其中数据应该由工作人员单独使用,因此向用户询问它会让他们感到困惑。我们需要两种功能。

我想要做的是在数据库中添加一列来跟踪所有这些自定义字段,并添加一个"对公众可见"属性到基类,然后破解从数据库中提取数据以正确设置属性的构造函数(构造函数已经获取了一个SqlDataReader参数,所以如果我可以访问该代码,它只会是一个额外的行)。

通常,解决这个问题的方法是创建一个子类并强制相关的地方使用这个新类。不幸的是,代码中使用的内容已经是一组子类,所以正确的地方就是基类,因为每个子类都需要知道它是否可以被公众看到。

所以...如果没有十六进制编辑器,我想做什么呢?

2 个答案:

答案 0 :(得分:3)

首先 - 这听起来像是一种可怕的,无法保证的方法。

有人说......

实际上有两种方法:

  1. 反编译程序集,编辑源代码并重建它。
  2. 通过Fody之类的工具使用IL编织来更改磁盘上的实现。

答案 1 :(得分:1)

您可以创建extension method

public static class Extensions
{
    public static bool IsVisibleToPublic(this MyBaseClass obj) {
        // implementation here
    }
}

实施取决于您。您的实现可能是简单的(虽然效率低下),例如进行数据库调用,或者它可能更复杂,例如包含系统所有IsVisibleToPublic值的延迟加载的静态字典。

然后,从MyBaseClass继承的所有类都将使用IsVisibleToPublic()扩展方法。