【发布时间】:2019-11-19 07:34:08
【问题描述】:
我有一个带有“身份验证”方法的 dll,用于检查密码是否有效,如下所示:
public static void AuthenticationExample(string password)
{
if (PasswordIsValid(password))
this.locked = false;
}
为了防止密码被循环“破解”,我希望该方法在身份验证失败时使整个应用程序崩溃,如下所示:
public static void AuthenticationExample(string password)
{
if (PasswordIsValid(password))
this.locked = false;
else
Crash();
}
有没有办法做到这一点?
另外,保护 dll 的更好方法是什么?
【问题讨论】:
-
据我所知,使应用程序崩溃的唯一可靠方法是导致
StackOverflowException,因为其他异常可能会被捕获和忽略。为什么你的 DLL 有密码?为什么您希望最终用户不简单地对 DLL 进行逆向工程以破解它。也许更值得注意的是,您为什么希望用户不会简单地通过反射设置locked = false?我在运行时替换了第三方 DLL 许可类中的属性一次(为了好玩,而不是为了盈利),然后 DLL 调用我的方法来验证许可。 -
另外我猜用户可以重新启动应用程序,或者我错过了什么?
-
该 dll 有一个密码,使盗版更加困难。我开始只是混淆它,但后来我意识到如果他们在项目中实现它,任何人仍然可以使用它。您能否详细说明如何更改“锁定”字段?是的,用户可以重新启动应用程序,但它更难,更耗时。
-
typeof(AuthenticationClass).GetField("locked", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField).SetValue(authenticationClassInstance, false);- Working example -
撕掉我的锁定方法。你知道更好的方法吗?