2

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

4

5 回答 5

3

签署您的程序集将为您提供与验证 .Net 程序集的 CRC 相关的最佳验证(请参阅 Rodrigo 的回答)。

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

如果您这样做更多是为了好玩,而不是您应该能够找到加载程序集的基地址并计算某种形式的 CRC……或者查看页面是否被标记为已修改……

于 2011-02-21T20:53:20.997 回答
2

我认为这在 .NET 中会非常困难。加载可执行文件时,它可能会被拆分并加载到内存中的几个不同区域。您需要熟悉 Window 的可执行文件格式: http: //www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx

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

您可能还想关注依赖 dll。您将进行如此多的本机调用,您可能需要考虑在 C 中执行此操作。

恐怕没有太多答案。

于 2011-02-21T20:29:55.557 回答
2

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

  1. 误报。因为这是 .NET,所以您不能假设运行时不会修改您的内存代码。您可能会检测到没有黑客攻击。
  2. 您进行的任何运行时检查都不会比您尝试保护的代码更安全。这包括您在应用程序中创建的任何运行时机制,例如定期 CRC 检查、哨兵进程,甚至检查可以伪造请求的服务器。
  3. 您将降低合法应用程序的性能,如果没有所有这些检查,盗版版本将运行得更好
  4. 您将无法解决修补 EXE 问题。

我知道你只是想尽可能地让它变得困难,即使它不是 100% 不可破解的。但是您提出的解决方案(以及您可以自己实施的任何解决方案)对于阻止任何普通的破解者几乎没有什么作用。

因为这是一个非常需要的功能,所以我会寻找第 3 方解决方案,他们已经为复杂的解决方案付出了努力,该解决方案可以随着破解技术的发展而更新。我个人不能推荐任何人。

于 2011-02-21T21:08:58.800 回答
1

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

于 2011-02-21T20:26:50.130 回答
0

Jon Skeet 的 Miscellaneous Utility Library包含一种计算流上的Adler32 校验和的方法。它的用法是:

MiscUtil.Checksum.Adler32.ComputeChecksum(stream);

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

于 2011-02-21T20:28:21.807 回答