如何编写一个程序,可以自行检测它已被更改?

时间:2009-01-02 06:33:04

标签: security

我需要编写一个可以检测到它已被更改的小程序。请给我一个建议!

谢谢。

8 个答案:

答案 0 :(得分:7)

简短的回答是创建程序的哈希或密钥,并让程序加密并将该密钥存储在自身中。程序会不时地对自己进行校验和,并将其与该哈希/密钥进行比较。如果存在差异,请相应处理。

有很多方法可以解决这个问题。有许多非常聪明的工程师知道如果你想避免的话,该如何解决它。

答案 1 :(得分:4)

最简单的方法是使用hash function生成一个简短的代码,它是整个程序的摘要,然后检查它。

调试代码并替换哈希值以颠覆它是相当容易的。


更好的方法是使用您的私钥生成digital signature并使用程序中的公钥进行检查。

这将需要更改公钥和哈希,以及理解程序,或更改程序代码本身以破坏检查。


到目前为止所描述的情况下你能做的就是让颠覆变得更加困难,但是可以付出一定的努力。我建议查看加密技术和复制保护以获取更多信息以适合您的具体情况。

答案 2 :(得分:2)

你是说程序'foo'应该能够判断它的某些部分是否在运行时之前/期间被修改了?这不是程序的责任,它是目标操作系统中安全钩子的责任。

例如,如果已安装且受信任的'foo'具有签名“xyz1234”,则内核应该拒绝运行修改的(或全新的)'foo'。 “foo”在内存中运行时也是如此。查找'Trusted Path Of Execution',又名TPE开始。

一个更好的问题是如何签署你发布的'foo'版本,这取决于你的目标平台。

答案 3 :(得分:0)

尝试搜索“代码签名”

答案 4 :(得分:0)

最简单的方法是程序检测自己的md5并将其存储在单独的文件中,但这并不完全安全。 MD5 + CRC可能稍好一些。

或正如其他人所建议的那样,sha1,sha2或sha3比目前的md5安全得多。

答案 5 :(得分:0)

我会要求外部工具进行检查。这个问题让我想起写a program that prints itself的挑战。在Bash你可以这样做:

#!/bin/bash
cat $0

真的要求外部工具来完成这项工作。这是通过远离solving the problem ...

来解决问题的方法

答案 6 :(得分:0)

最好的选择是代码签名 - 使用本地友好操作系统提供的工具(例如,如果您的目标是Windows,您可能需要查看Authenticode操作系统处理篡改),或通过滚动自己的选项存储MD5哈希并进行比较

重要的是要记住,如果有人在您的流程中注入一个线程(可能会导致您正在进行的检查等等),或者如果他们篡改您编译的应用程序以绕过所述检查,那么投注就会消失。

答案 7 :(得分:0)

未提及的另一种方法是使用二进制包装器,例如UPX 如果在磁盘上更改二进制文件,则解压缩代码可能会失败 但是,如果有人在内存中更改了二进制文件,则无法保护您。