【问题标题】:It is possible to make the program with md5 hash the change every start?是否可以让程序每次开始都使用 md5 散列更改?
【发布时间】:2013-03-08 14:13:23
【问题描述】:

每次打开都能自动改变他自己的md5哈希的简单程序? 有一个像“WinMD5”这样的程序可以扫描程序的 md5 哈希。 我的问题是我们是否可以在每次打开程序时更改它。 我知道如果我们添加一些简单的东西/或删除一些。我们可以重新合作,堆放程序,然后我们得到一个新的 md5 哈希。 但是如果我们只用几行代码就能做到这一点,程序就会自动改变。这将会非常棒 ! 有什么改变吗?

【问题讨论】:

  • .exe 的内容是不可变的,只要你改变了一个字节,你就会破坏它。此外,你为什么要这样做?
  • 如果你这样做,你的病毒扫描程序会变得非常激动。

标签: c++ winapi md5


【解决方案1】:

这是可以做到的,但不是微不足道的。您需要打开程序的可执行文件,了解文件的内部结构(Portable Executable,PE),并在其中更改一些不会影响程序执行的内容。 ELF 二进制格式(在 Linux 中使用)支持所有类型的注释和符号以及不直接影响程序执行的额外字段,可能 PE 文件也有它们可以使用。您还可以使用您在程序中专门为此目的创建的一些静态全局变量,因为该变量的初始值存储在可执行文件中,位于程序的数据段上。

微小的变化就足以完全改变 MD5 哈希值(MD5 就是这样设计的)。因此,每次执行程序时在 .exe 文件中增加一些 4 字节计数器就足够了(重复执行哈希需要 2³² 次)。使用 8 个字节,使人类生存期间无法重复。

正如我所说,这并非微不足道,但也不是某些人可能认为的那么困难或不可能。注意运行程序的用户必须有修改二进制可执行文件的权限(也许Windows会要求管理员权限?我不知道,我不是Windows人)。

祝你好运。

【讨论】:

  • Windows 不会主动请求许可,它没有水晶球。一旦进程开始,您将无法获得管理员权限。 “以管理员身份运行”意味着您在整个过程中确实获得了管理员权限。
  • @MSalters 当然,这与 Unix 没有什么不同。 Windows 有一个标准函数来找出可执行文件的完整路径。 Unix 没有(但 IIRC,您可以在 Linux 下的 /proc/<pid> 下的文件之一中找到它)。
  • @JamesKanze 函数并不比 Linux 中的 /proc/<pid> 方式更标准,因为它们都是特定于平台的解决方案。
  • 我只是说它不是标准的 Unix。它可以在 Linux 下工作,但在 Solaris 或 AIX 下你需要一些不同的东西。
【解决方案2】:

打开或执行文件对其内容没有影响。 在 Windows 下(但不是在 Unix 下),可以获得 可执行文件的全名。如果你知道有的地方 微不足道的字节,您可以打开文件并修改它们。 (例如,COFF 格式有一个四字节的时间戳, 你可以设置几乎任何东西。或者你可以创建 构建程序时的一些无用符号,以及 修改他们的名字。)

当然,这假设用户没有写保护 可执行文件。我认为这很少 但是,在开发环境中除外。

【讨论】:

  • 可执行文件的常见问题不是太多的写保护(u-w/+R 位),也不是 root/sysadmin(o-w 位/ACL)。
  • 如果我无权写入文件,我认为文件被写保护。即使对于我作为普通用户安装的属于我的文件,我也会写保护可执行文件。就此而言,即使对于我自己开发的工具,将它们从开发目录复制到$PATH 可以找到它们的位置的脚本也会对它们进行保护。 (当然,作为所有者或 root,我可以更改保护,修改文件,然后重置它。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2020-10-09
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多