无论如何程序都知道它是否已被编译和构建后被修改过? 我想在构建之后防止.exe被修改。
答案 0 :(得分:1)
您可以使用私钥对EXE进行签名,使用公钥来检查该签名。我近20年来没有使用EXE文件格式,但我记得有空间可以存储这样的签名。当然,您正在检查的文件部分必须排除签名本身。
但是,如果您尝试这样做以防止破解您的EXE,那么您运气不好:破解者只需修补验证签名的代码。
答案 1 :(得分:0)
即使你知道......知道你有这种阻止的人,也会将计算机时间改为你的构建时间而不是修改这个exe ..
所以它不能成为预防..
答案 2 :(得分:0)
程序是否有可能知道它自构建以来是否已被修改?
是。程序其余部分的校验和可以存储在隔离的资源字符串中。
程序是否有可能知道它自构建以来是否被恶意修改?
没有。校验和,甚至执行和比较它的函数也可以修改。
答案 3 :(得分:0)
您在谈论Tamper Aware and Self Healing Code吗?
文章展示了检测 硬件故障或未经授权 补丁;回修补可执行文件 嵌入预期的哈希值 .text部分;并演示 修复效果的过程 恶意代码(例如, 未经授权的二进制修补程序该 文章工作中提出的想法 同样好的是可执行文件 被修补在磁盘或内存中。 然而,自我修复发生在 存储器中。
答案 4 :(得分:0)
大多数热门编译器都有一个开关来填充PE标题的“Checksum”字段,或者,您可以将其留空并提供您自己的自定义值。无论如何,这是存储此类数据的“标准”位置。
不幸的是,没有真正的方法可以阻止某人篡改二进制文件,因为你必须在exe文件中放入检查来检测它,此时它们可以被修补。
此问题的一个解决方案是加密某些函数并使用某些已知数据的校验和作为键(例如另一个函数的校验和)。然后,当您离开该功能时,您重新加密它。显然你需要提出自己的序言/结语代码来处理这个问题。如果您的程序是多线程的,那么这不太合适,但是如果您是单线程或只是轻微线程(并且可以对函数进行serizalize并控制所有入口点),那么如果你的话,这将“提高标准”将
这是大多数“打包者”的一步,它只是加密.text / .data / .rdata / etc部分并在运行时解密所有部分。这些非常容易“转储”,因为你所要做的就是运行程序,挂起所有线程,然后将内存转储到文件中。例如,这种攻击对抗Themida(最具侵略性的打包者之一)。从那里你需要做的就是重建IAT,修复一些重定位等等。
当然,攻击者仍然可以使用调试器来转储未加密的代码,从而“解压缩”exe,但显然没有什么是万无一失的。