我听说,如果我们在EXE文件的末尾添加一些字节,它仍然可以正常工作。这是真的吗?这是一种安全的方式吗?
我打算使用程序执行文件中的数据编写演示,这样它就可以是安全的(至少对普通用户来说是安全的),而且我不必在其他地方存储数据。
这是不可能用特定的"是"或"否"回答的。
我假设您将在可执行文件的末尾存储数据,而不是将程序状态存储在配置文件中。我进一步假设您这样做是为了好玩,最终结果不需要完美。
任何可能在您的平台上存在的代码签名机制都会因为这些技巧而大呼犯规。只有在可执行文件没有实质性更改的情况下,签名才有效。(至少,在我帮助实现的代码签名机制中,加密签名是在可执行文件的整个内容上计算的——除了签名本身——而不仅仅是在程序头中标记为可执行文件或数据的段。)
你的平台上可能存在的任何反病毒机制都会因为这些技巧而大呼犯规。自修改代码肯定与试图保持隐藏或模糊的程序有关,而写入自身的代码将触发行为反病毒工具中的警报。
tripwire或mtree
等工具总是会抱怨您的程序。rpm -qa
或debsums
将始终报告可执行文件的问题。很难将此程序从一个站点可靠地转移到另一个站点。
在大多数环境中,对标准可执行文件的权限将完全禁止这种行为。用户帐户没有权限修改系统上的大多数可执行文件——只能写入将运行可执行文件的用户拥有的可执行文件。(即便如此,如果配置得当,AppArmor、SELinux、TOMOYO或SMACK等强制性访问控制系统也可能禁止进程写入程序文件。几乎所有合理的安全配置文件都会禁止它。)
任何系统管理员都不会让两个用户执行和写入可执行文件。
您还有一个实用的问题,首先查找可执行文件。至少Linux提供了/proc/self/exe
,但(a)系统管理员可能没有安装它(b)系统管理员不会让大多数进程使用it(c)如果在程序执行时替换了可执行文件,则很难找到要修改的正确文件。
您必须在两种更新可执行文件的方法之间做出决定:要么修改现有文件(ftell(3)
和fseek(3)
),要么将更改后的内容写入新文件并替换可执行文件。这两种方法都很麻烦:如果修改文件,可能会同时执行多个副本,试图对文件进行冲突编辑。聪明的编程可以避免巨大的问题,但整个可执行文件可能不处于一致的状态。如果替换该文件,则可能会同时执行多个副本,并且在系统重新启动之前,可执行文件的磁盘副本可能不会被释放并且实际上是可移动的。你可能有十几个可执行程序文件的副本,无形中占用了磁盘空间。它们在执行时都不能共享内存,这增加了内存压力。
是的,可以将配置数据保存在程序中执行,甚至可以使其在某些环境中工作。但这不是生产质量问题。