【问题标题】:How NOT to debug a referenced dll?如何不调试引用的 dll?
【发布时间】: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


【解决方案1】:

由于执行我最初想要的操作的可能性非常小,因此第二个最佳解决方案是在 NuGet 之间自动切换,这适用于 Choose-When-Otherwise。 PackageReference 或 ItemGroup 中的条件不起作用(至少在 VisualStudio 中不起作用,根据this)。所以我将创建两个 NuGet,一个是带有篡改检测的 Release,另一个也是 Release,但没有篡改检测(此版本添加了“-debug”后缀)。然后不会通过 NuGet 管理器安装 NuGet,而只会在 .csproj 中更新 dllVersion:

<PropertyGroup>
  <dllVersion>1.2.3</dllVersion>
</PropertyGroup>
<Choose>
  <When Condition="'$(Configuration)'=='Debug'">
    <ItemGroup>
      <PackageReference Include="dllNuGet" Version=$(dllVersion)-debug/>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <PackageReference Include="dllNuGet" Version=$(dllVersion)/>
    </ItemGroup>
  </Otherwise>
</Choose>

【讨论】:

    【解决方案2】:

    看来你要根据Debug模式下的某个开关来决定是否调试dll。

    很明显,你给出的方法有问题。毕竟是基于项目当前的配置。启用发布模式后,您将无法调试主项目的代码。本质上,您仍然想调试代码。

    然而,在Tools-->Options-->Debugging下禁用Enable Just My Code选项- ->General会让你在Release模式下调试代码。但这不是一个完美的Debug模式,有时我无法命中断点,无法进一步调试,不推荐。

    我有两个解决方案:

    ================================================ ======

    提示一)直接使用Assembly dll而不是nuget

    1) 创建一个名为Debug_NotDLL 的新配置,它继承调试模式。

    另外,制作DebugRelease模式的两个dll。

    2) 将这些添加到csproj 文件中:

     <Reference Include="test" Condition="'$(Configuration)'=='Debug'">
          <HintPath>..\test\bin\Debug\xxx\xxx.dll</HintPath>
        </Reference>
        <Reference Include="test" Condition="'$(Configuration)'=='Debug_NotDLL'">
          <HintPath>..\test\bin\Release\xxx\xxx.dll</HintPath>
     </Reference>
    

    那么,你可以切换DebugDebug_NotDLL配置,得到你想要的。

    ================================================ =====

    提示二)使用 nuget

    新建包,在这种情况下,我建议你应该使用net标准类库项目。

    我建议你可以为你的 dll 创建两个 nuget 包。

    您最好将Release模式的dll重命名为xxx_Release.dllxxx_Debug.dll用于Debug模式。

    要创建发布nuget包,你应该直接在发布模式下右键单击lib项目-->点击Pack。要重命名 nuget 包,您可以使用 PackageId msbuild 属性将其名称设置为 xxx_Releasecsproj 文件下。检查this document

    注意,如果在本地机器下创建nuget包,由于当前机器上有项目源码的缓存,所以总是可以输入nuget源码。这是一种特殊情况。所以你应该在另一台机器上测试 nuget 包。

    要创建调试nuget包dllpdb文件是不够的,你还应该将源文件添加到nuget包中。

    那么,在Debug模式下打包这样一个名为xxx.Debug.x.x.x.nupkg的nuget包。这是one linktwo link 关于创建调试nuget 包的步骤。

    完成后,你可以安装这两个nuget包,并将它们添加到主项目下,

    <ItemGroup>
        <PackageReference Include="xxx.Debug" Version="1.0.0" Condition="'$(Configuration)'=='Debug'" />
      <PackageReference Include="xxx.Release" Version="1.0.0" Condition="'$(Configuration)'=='Debug_NotDLL'" />
     </ItemGroup>
    

    【讨论】:

    • 我想你误解了我想要的。我不想将调试版本提供给其他团队,我希望他们能够调试他们的部分代码,即使他们使用引用的 dll 的发布版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多