动态解密引用的dll

时间:2012-01-06 14:49:33

标签: c# reference encryption

我想在我的Windows窗体应用程序项目中有一个引用的dll。我必须首先加密dll,然后在需要使用时在运行时解密。

请考虑以下示例,其中子例程最初是加密的,但随后进行了解密和实例化。请注意,这只是一个概念性的想法,我不知道如何在代码方面做到这一点。

Class clsSO
{
void myVoid()
{
Console.WriteLine("We are here now ...");
}
} // End class

上面的代码将包装在.dll中,并作为引用的dll添加到我的项目中。然后引用dll并调用子例程:

clsSo myRef = new clsSo();

myRef.myVoid();

控制台输出显示:

  

我们现在在这里......

我需要做什么: 包装器dll的内容将被加密,因此无法读取/无法直接引用该类。因此,dll将以某种方式解密,并使用解密的数据动态更新,以便我可以引用它。

这样的事情已经存在吗?它甚至可以完成吗?

我很欣赏大家的时间!

谢谢,

埃文

1 个答案:

答案 0 :(得分:4)

您需要在文件的解密字节上调用Assembly.Load(Byte[])。一旦你有了,你将需要使用反射或将类强制转换为接口,以便您可以访问这些方法。

这是一个例子

class Example
{
    static void Main(string[] args)
    {
        byte[] decryptedLibArray;
        using (var fs = new FileStream("clsSo.cDll", FileMode.Open, FileAccess.Read))
        using (var aesProvider = new AesCryptoServiceProvider())
        using (var aesTransform = aesProvider.CreateDecryptor(YourKey, YourIV))
        using (var cryptoStream = new CryptoStream(fs, aesTransform, CryptoStreamMode.Read))
        {
            decryptedLibArray = ReadFully(cryptoStream);
        }

        var lib = Assembly.Load(decryptedLibArray);

        IclsSO classInstance = (IclsSO)lib.CreateInstance("clsSO"); //If you use a namespace this will be namespace.clsSO

        classInstance.myVoid();

    }

    /// <summary>
    /// Reads data from a stream until the end is reached. The
    /// data is returned as a byte array. An IOException is
    /// thrown if any of the underlying IO calls fail.
    /// </summary>
    /// <param name="stream">The stream to read data from</param>
    public static byte[] ReadFully (Stream stream)
    {
        byte[] buffer = new byte[32768];
        using (MemoryStream ms = new MemoryStream())
        {
            while (true)
            {
                int read = stream.Read (buffer, 0, buffer.Length);
                if (read <= 0)
                    return ms.ToArray();
                ms.Write (buffer, 0, read);
            }
        }
    }
}

interface IclsSO
{
    void myVoid();
}

ReadFully来自this posting。阅读它,看看为什么我不只是做cryptoStream.Read(data, 0, decryptedLibArray.Length);最后一个例子有一些错误,但他给出的内存流示例是完美的。

然而,有人可能只是转储你的程序的ram并获得解密的二进制文件,或者可能反编译你的主程序并获得解密密钥并自己解密。因此,取决于你是多么偏执,你可能仍然想投资一个混淆器。