我想在我的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将以某种方式解密,并使用解密的数据动态更新,以便我可以引用它。
这样的事情已经存在吗?它甚至可以完成吗?
我很欣赏大家的时间!
谢谢,
埃文
答案 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并获得解密的二进制文件,或者可能反编译你的主程序并获得解密密钥并自己解密。因此,取决于你是多么偏执,你可能仍然想投资一个混淆器。