【发布时间】:2021-01-07 14:23:47
【问题描述】:
我正在使用其他项目中引用的 dll 的发布版本。这个dll在调试器运行时有篡改检测(dll也是我的,我不打算做一些非法的事情),调试时会给出误报。
Visual Studio (2017-1019) 中是否有一个选项可以不“调试”引用的 dll,但仍然能够调试正在开发的代码? “调试”意味着我不想在这个特定的 dll 中单步执行,而只是想从方法中获取数据,就像在 Release 中获取数据一样。
例如:
//Release dll
int Sum (int a, int b)
{
bool TamperingDetected = CheckForTampering();
if (TamperingDetected)
return 0;
else
return a + b;
}
//Other project
MessageBox.Show(dll.Sum(1, 1));
如果我在 Release 中运行这部分代码,我可以轻松获得正确的值。不会检测到篡改,如果有人想对这种方法进行逆向工程,在 Release 中“合法”很容易做到。如果我在 Debug 中运行,我将始终得到 0。如前所述,我不想在 Sum 方法中进行 Step-In,因此不应在此 dll 中进行调试,但其他一切都应该像在 Debug 中一样工作。
Just My Code 选项没有任何区别。
背景是一个团队使用篡改检测创建此 dll,而另一个团队将其用作 NuGet。现在他们无法调试他们的代码部分,因为我们正在检测篡改并返回错误值。 其他团队拥有源代码就太过分了,因为这样我们就有可能在构建他们不知道的那部分代码的过程中做错事。
一种选择是给他们Debug和Release dll,他们可以像这里解释的那样在它们之间切换:https://stackoverflow.com/a/7284102,但是我们失去了共享NuGet的简单性,我们仍然冒着复制Debug dll而不是Release的风险dll,从而在最终产品中丢失了篡改检测。然后 NuGet 始终处于 Release 状态。
通过切换调试和发布配置来自动切换 NuGet 是不可能的,或者我仍然没有找到方法,但这也是一个不错的选择。仅当使用某个完全其他的项目来下载调试和发布 NuGet,然后使用上面提到的答案,但我也不喜欢它。
【问题讨论】:
-
好吧,我们不知道调试篡改是如何实现的,但它可能会检查 IsDebuggerPresent 在这种情况下,您是否尝试进入检测代码并不重要——整个过程将不受限制。 --- 我们在类似情况下所做的是检查网络域名,而不是标记它是否是我们的。也许你可以让他们在你的情况下做类似的事情,即寻找一些只能在内部发生的已知状态,然后不会标记为篡改?
-
@500 你不知道篡改检测的工作原理是正确的,因为它来自我们使用的第三方软件,这就是我无法设置任何规则的原因。或已启用或已禁用。
-
如果在调试器上工作太多,那么如何在 NuGet 之间进行自动切换的想法会更好。然后我可以创建“Release”NuGet 和“ReleaseWithoutDebuggerDetection”NuGet。由于它是自动的,因此在最终产品发布期间应该没有错误或错误。
标签: c# visual-studio dll nuget