C 子进程中的篡改检测

C 子进程中的篡改检测,c,compilation,tampering,C,Compilation,Tampering,我正在使用C开发一个简单的应用程序,我想知道是否有任何方法可以检测应用程序何时被篡改。据我所知,散列是确保数据完整性的一种方法,但我不知道在编译代码时如何在代码中硬编码进程的散列,或者我甚至不知道这是一种好方法。 非常感谢您提供的任何帮助/提示。您应该保护您的哈希不受静态修改(当您的应用程序在磁盘上时)。例如,您可以使用一些私钥对其进行签名,这些私钥将隐藏在篡改检测代码的某处。我不能告诉你如何隐藏它,因为它应该是你的秘密 要拥有自我验证的可执行文件,可以在源代码中分配哈希,但要指示编译器将其存储

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

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

要拥有自我验证的可执行文件,可以在源代码中分配哈希,但要指示编译器将其存储在命名的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文章中,该文章可通过

验证。您必须为哈希定义一个具有一定空间的变量(无论使用何种哈希算法),在编译后计算二进制的哈希,并将该哈希嵌入保留空间。这也意味着您必须从哈希计算中排除保留空间,因为在事实发生后添加哈希也会更改整个文件的哈希。此外,二进制文件的磁盘表示形式与加载到内存中的内容不一样。您可能只希望散列二进制文件的代码块,并忽略任何元数据,如链接/编译器信息。您需要更具体地说明代码运行的位置以及您试图防御的内容。谢谢您的评论。让我更具体一点。我得到了一个父进程(称为a)和一个子进程(称为B)。从A的角度来看,我可以通过将散列(B)硬编码到A来检测篡改。除此之外,我还想检测B本身的篡改。Intel SW产品之一提供了类似的功能。在那里搜索篡改保护。