最近在想怎么才能防止DLL非法调用的问题,想来想去也没想到什么好的方法。
只想到了下面这么一个方法,但是对一般的人来说还是管用的。
平台:WinXP sp3,Visual Studio 2008 Professional(CN)
1)程序分为:MyEXE.exe 和 MyDLL.dll
2)用MyKey.snk 签名 MyEXE.exe 和 MyDLL.dll
3)测试代码如下:
4)这样就差不多了,我试验了一下用别的EXE调用DLL,失败。但是限于水平,我总感觉这样不是很好,但我现在也不知道怎么破解的了。
5)最后就是要注意代码的编写了,能 sealed 就 sealed,能 private 就 private 。
只想到了下面这么一个方法,但是对一般的人来说还是管用的。
平台:WinXP sp3,Visual Studio 2008 Professional(CN)
1)程序分为:MyEXE.exe 和 MyDLL.dll
2)用MyKey.snk 签名 MyEXE.exe 和 MyDLL.dll
3)测试代码如下:
//MyDLL
namespace MyDLL
{
sealed public class MyClass
{
static public void ShowMsg()
{
if (ValidateUser() == false)
return;
Console.WriteLine("Hello,my name is MyDLL.MyClass.");
}
/// <summary>
/// 验证使用者
/// </summary>
/// <returns></returns>
static private bool ValidateUser()
{
//MyEXE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=52b73f80d00d732b
if (Assembly.GetEntryAssembly().GetName().FullName ==
"MyEXE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=52b73f80d00d732b")
return true;
return false;
}
}
}
//MyEXE
namespace MyEXE
{
class MyProgram
{
static void Main(string[] args)
{
MyDLL.MyClass.ShowMsg();
Console.ReadLine();
}
}
}
namespace MyDLL
{
sealed public class MyClass
{
static public void ShowMsg()
{
if (ValidateUser() == false)
return;
Console.WriteLine("Hello,my name is MyDLL.MyClass.");
}
/// <summary>
/// 验证使用者
/// </summary>
/// <returns></returns>
static private bool ValidateUser()
{
//MyEXE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=52b73f80d00d732b
if (Assembly.GetEntryAssembly().GetName().FullName ==
"MyEXE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=52b73f80d00d732b")
return true;
return false;
}
}
}
//MyEXE
namespace MyEXE
{
class MyProgram
{
static void Main(string[] args)
{
MyDLL.MyClass.ShowMsg();
Console.ReadLine();
}
}
}
4)这样就差不多了,我试验了一下用别的EXE调用DLL,失败。但是限于水平,我总感觉这样不是很好,但我现在也不知道怎么破解的了。
5)最后就是要注意代码的编写了,能 sealed 就 sealed,能 private 就 private 。