代码之家  ›  专栏  ›  技术社区  ›  Silly Dude

.NET:如何隔离反调试类库?

  •  -1
  • Silly Dude  · 技术社区  · 3 年前

    我建了一个。NET类库,并使用模糊处理程序通过反调试对其进行模糊处理。

    我使用我的模糊类库构建了一个测试项目。我本希望反调试禁止调试器介入 进入 我的类库。但当我在调试模式下启动项目时(通过在Visual Studio中按“F5”)调用我的类库时,它只是抛出了异常“Debugger detected”。

    这意味着 如果项目使用我的库,那么开发人员根本无法调试 。他们可能有数百万行与我的库无关的代码。不能在他们的项目中调试只意味着一件事:他们不会使用我的库。

    开发人员能做些什么吗?” 隔离 “我的库,这样他们就可以在其他地方调试了?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Mostafa    2 年前

    特别感谢@Artem Razin:

    将敏感代码隔离到使用 启用了反调试功能。

    它很棒,很有帮助。此外,他指定的虚拟化也是一种不错的方法。如果你需要使用反调试环境,我会给你发布一个很好的方法。如果您提到例外情况: Debugger Detected

    我假设你使用Eziriz。NET反应器。当我在支持下发言时。他们说你不能为特定的HardwareID提供两个反调试版本。因为HardwareID涉及到许可证系统,它决不能绕过!

    我可以通过使用告诉您一个解决方法。NET Reactor CLI和MSBuild目标。

    应该是什么情况?(我将展示在编写CLI之前我们需要做什么…)

    1. 如果你有一个开发团队,或者朋友需要使用你的模糊库。太好了。但他不能调试,因为它是反调试的。
    2. 然后我们必须把一个程序集分成两个程序集。一个用于开发人员的模糊但没有启用反调试功能。和其他程序集到发布文件夹中,供消费者或您的受众使用。
    3. 因此,当您构建程序集时。或者需要为它创建nuget包。你需要做双重模糊处理。首先,您将混淆消费者的反调试版本到consumer/AntiDebug文件夹中。其次,您将再次混淆原始DLL,但对于没有反调试功能的开发人员!

    所以请使用目录。为此构建目标。以下是模糊处理的代码:

    <Target Name="ObfuscateDLL" Condition="'$(Configuration)' == 'Release' AND $(OutputType) == 'Library'"
            AfterTargets="AfterBuild">
    
        <PropertyGroup>
              <ObfuscatedFolder>$(MSBuildThisFileDirectory)\Anti Debug</ObfuscatedFolder>
              <ObfuscatorPath>C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.Console.exe</ObfuscatorPath>
              <ObfuscatorParameters>-antitamp 1 -anti_debug 1 -hide_calls 1 -hide_calls_internals 1 -control_flow_obfuscation 1 -flow_level 9 -resourceencryption 1 -antistrong 1 -virtualization 1 -necrobit 1 -mapping_file 1 -mapping_file_overwrite 1 -mapping_filename "&lt;ProtectedAssemblyLocation&gt;\&lt;AssemblyName&gt;.nrmap" </ObfuscatorParameters>
        </PropertyGroup>
    
        <!-- Obfuscate with anti-debug to Obfuscated folder or \Release path when GenerateNuget enabled -->
        <Exec Command="&quot;$(ObfuscatorPath)&quot; -file &quot;$(TargetPath)&quot; -targetfile &quot;$(ObfuscatedFolder)\$(TargetFileName)&quot; $(ObfuscatorParameters)"/>
    
        <!-- Obfuscate without anti-debug to /Release path for Nuget package for Developers -->
        <Exec Command="&quot;$(ObfuscatorPath)&quot; -file &quot;$(TargetPath)&quot; -targetfile &quot;$(TargetPath)&quot; $(ObfuscatorParameters.Replace('-anti_debug 1','').Replace('-mapping_file 1', ''))"/>
    </Target>
    

    请使用以上代码! 如果你需要它尽可能简单。但您需要为开发人员手动创建nuget包。通过MSBuild或您需要的方式。

    但是 如果您使用。NET Framework,并希望生成模糊可调试的nuget包(用于开发人员)。同时还为您的消费者提供反调试版本。可以使用以下MSBuild目标。

    1. 它包含自动创建具有所有依赖项的Nuget包的能力。
    2. 它将使用者库混淆为Anti-Debug文件夹。然后它会混淆nuget版本并将其打包。然后将反调试版本复制回Release文件夹。
    3. 您可以手动打开/关闭GenerateNuget属性。如果不生成nuget,那么只生成反调试版本。
    4. 根据您的需要更改代码。。。

    https://pastebin.com/wmvcWMUp

    (请参阅链接XML内容较大,无法发布到StackOverflow)

        2
  •  1
  •   Artem Razin    3 年前

    自exe打包器时代以来,反调试是一个众所周知的功能。不幸的是,这是一个全过程的事情。通常NET模糊处理程序检查调试器特定的环境变量。

    无法阻止调试器进入程序集。

    我想说的是,反调试适用于那些希望保护其最终用户产品的人,而不是库。

    你可以虚拟化你的代码(像ArmDot这样的现代模糊处理程序提供了这一功能),所以调试它几乎没有意义。

    另一个想法是将敏感代码隔离到一个单独的进程中,该进程使用启用的反调试功能运行。在客户端,您只需提供一个代理,将所有调用重定向到进程。

    推荐文章