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