0

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

4

1 回答 1

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 KB 文章中,可通过https://technet.microsoft.com/ru-ru/library/ee829684获得

于 2015-05-18T12:44:46.783 回答