【问题标题】:tamper detection in a child process子进程中的篡改检测
【发布时间】:2014-11-10 20:07:19
【问题描述】:

我正在使用 C 开发一个简单的应用程序,并且想知道是否有任何方法可以检测到应用程序何时被篡改。根据我的知识,哈希是确保数据完整性的一种方法,但我不知道在编译时如何在代码中硬编码进程的哈希,或者我什至不知道这是一个好方法做。 非常感谢任何帮助/提示。

【问题讨论】:

  • 您必须为您的散列定义一个带有一些空间的 var(无论您使用什么散列算法),在编译后计算二进制的散列,并将该散列嵌入保留空间。这也意味着您必须从哈希计算中排除保留空间,因为事后添加哈希也会更改整个文件的哈希。
  • 另外,二进制文件的磁盘表示与加载到内存中的内容不同。您只想散列二进制文件的代码块并忽略链接/编译器信息等任何元数据。
  • 您需要更具体地了解您的代码在哪里运行以及您要防御什么。
  • 感谢您的 cmets。让我更具体一点。我有一个父进程(称为 A)和一个子进程(称为 B)。从 A 的角度来看,我可以通过将 hash(B) 硬编码到 A 中来检测篡改。除此之外,我还想检测 B 本身的篡改。

标签: c compilation tampering


【解决方案1】:

您应该保护您的哈希免受静态修改(当您的应用在磁盘上时)。例如,您可以使用隐藏在篡改检测代码中某处的私钥对其进行签名。我不能告诉你如何隐藏它,因为它应该是你的秘密。

要具有自我验证的可执行文件,您可以在源中分配哈希,但指示编译器将其存储在命名的 PE/ELF 部分中。签署二进制文件时,将您的命名部分从哈希计算中排除,并将计算的哈希存储在其中。

要将哈希放入 Microsoft 编译器的命名部分,您可以使用

#pragma section("tdhash", read)
__declspec(allocate("tdhash")) const unsigned char hash[32] = {0};

对于 GCC 编译器:

const unsigned char hash[32] __attribute__ ((section ("tdhash"))) = {0};

注意:更改 PE 后,您希望更新标头中的校验和,还要从哈希计算中排除校验和字段。示例位于“如何防止“检查完整性”加载失败”Microsoft 知识库文章中,https://technet.microsoft.com/ru-ru/library/ee829684

【讨论】:

  • 英特尔软件产品之一提供了类似的功能。在那里搜索防篡改。
猜你喜欢
  • 2018-10-12
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2011-02-07
相关资源
最近更新 更多