C# 如何对内存中加载的可执行文件进行CRC检查?

C# 如何对内存中加载的可执行文件进行CRC检查?,c#,.net,winapi,crc32,C#,.net,Winapi,Crc32,出于保护原因,我想运行一个线程来检查当前可执行文件的内存映像。如何在当前内存可执行文件(WinAPI或.NET方式)上执行CRC?我的应用程序是用.NET编写的。我不知道用.NET编写的方法。 如果您对保护可执行文件感兴趣,可以使用sn生成一个新密钥,并将其添加到AssemblyInfo.cs,这样,如果应用程序被修改,至少它不会运行。包含一个方法来计算流上的密钥。其用途是: MiscUtil.Checksum.Adler32.ComputeChecksum(stream); 至于从当前正在运行

出于保护原因,我想运行一个线程来检查当前可执行文件的内存映像。如何在当前内存可执行文件(WinAPI或.NET方式)上执行CRC?我的应用程序是用.NET编写的。

我不知道用.NET编写的方法。 如果您对保护可执行文件感兴趣,可以使用
sn
生成一个新密钥,并将其添加到AssemblyInfo.cs,这样,如果应用程序被修改,至少它不会运行。

包含一个方法来计算流上的密钥。其用途是:

MiscUtil.Checksum.Adler32.ComputeChecksum(stream);

至于从当前正在运行的程序集创建memorystream。。。我不知道这是否可行(或可取)。

我认为在.NET中这将是相当困难的。加载可执行文件时,它可能会被拆分并加载到内存中的几个不同区域。您需要熟悉窗口的可执行格式:

以及Windows可执行文件加载过程

您可能还需要关注依赖性DLL。你会做这么多本地电话,你可能想考虑在C.这样做/P>
恐怕答案不多。

在程序集上签名将为您提供与验证.Net程序集的CRC相关的最佳验证(请参阅Rodrigo的答案)

如果您担心有人会在运行时修补程序集,您可能担心得太多了。与简单地分解.Net代码并进行修复(包括删除CRC检查)相比,它需要更好地理解已JIT的方法的运行时到内存中的补丁IL


若你们做这件事只是为了好玩,那个么你们应该能够找到加载程序集的基址并计算某种CRC。。。或者查看页面是否标记为已修改

您执行的任何运行时检查都有以下缺点:

  • 假阳性。因为这是.NET,所以不能假设运行时没有修改内存中的代码。你可以在没有黑客的地方发现黑客
  • 您进行的任何运行时检查都不会比您试图保护的代码更安全。这包括您在应用程序中创建的任何运行时机制,如定期CRC检查、sentinel进程,甚至与可能伪造请求的服务器进行检查
  • 您将降低合法应用程序的性能,在没有所有这些检查的情况下,盗版版本将运行得更好
  • 您将无法解决修补EXE的问题
  • 我理解你只是想让它尽可能的难,即使它不是100%不可破解的。但是,你提出的解决方案(以及你自己可能实现的任何解决方案)对挫败任何普通的破坏者几乎没有什么作用


    因为这是一个需要的特性,所以我会寻找第三方解决方案,他们已经为一个复杂的解决方案付出了努力,这个解决方案可以随着破解技术的发展而更新。但我个人无法推荐。

    你想达到什么目的?作为一名黑客,如果我可以更改您的代码(它将驻留在一个只读页面中,因此我需要适当的权限来修改它),我还可以禁用此检查。另外,DEP()可能已经在保护您的代码了。许多个人防火墙还钩住了OpenProcess等函数,以捕获试图调试您的进程的人。你可以检查你是否在虚拟机内。。。你可以让它变得困难,但你永远不能让它变得不可能。@blez:我在努力为你节省时间,也为你的用户节省时间。使用线程/定期CRC检查不会使破解应用程序变得更加困难。修补后只需分离调试器。这是白费力气。裂纹以二元形式分布;运行时检查如何防止修补EXE本身?@blez:threads不再进行破解过程。而分离调试器是如此的微不足道,以至于它可能什么都不是。我不是想抨击你,我想让你找到一个解决方案,它是最划算的,而且不会惹恼用户。让他们想买你的应用。对CRC进行定期运行时检查肯定不是对您的努力的好回报,尤其是在您提出的策略中,对不起…@tenfour:用户甚至不知道什么是CRC,他们也不知道这是在后台进行的。不管怎样,如果有那么糟糕,请告诉我更好的解决方案。“…从当前正在运行的程序集创建memorystream…”。。。哎呀!:)一切都可以修补,这是真的。我的代码被弄糊涂了,但还是打了补丁。现在我正在尽我最大的努力使它难以破解。但是我发现令人不安的是,.net修改了它的内存可执行文件。我想我只检查文件。