是否会发生某些程序(甚至操作系统本身)出于某种原因更改可执行文件的 __TEXT 段的内容?
- 注意:这里,我指的是“__TEXT”段,而不是“__text”段。
换句话说:我是否可以依靠可执行文件的 __TEXT 段中的字节来检测我的可执行文件是否已损坏(例如通过计算该段的校验和),或者是否有可能因为该段可能被修改而得到误报在用户的计算机上安装程序后?
谢谢!
段本质上是一种虚拟内存结构:它们通常在页面边界上对齐,因此它们最终可能包含比应用程序代码更多的内容。鉴于__TEXT
段通常从 Mach-O 文件的开头开始,这通常也包括 Mach-O 标头。
在 OS X 10.3 及更早版本中,预绑定可能会影响段(此处__TEXT
详细描述)。在以后的版本中,代码签名也可以修改段。__TEXT
您可能想使用 OS X 的内置代码签名机制进行调查(您的问题的原因和解决方案?)。一些推荐的参考资料:
您可能会发现macholib在探索中很有用。(它包含在最近的 OS X 版本中以支持 py2app。)这是我用来提取__TEXT
段的简单脚本。
from macholib.MachO import MachO
m = MachO('foo')
__TEXT = (cmd for load_cmd, cmd, data in m.headers[0].commands
if getattr(cmd, 'segname', '').rstrip('\0') == '__TEXT').next()
print '__TEXT segment: offset %x size %x' % (__TEXT.fileoff, __TEXT.filesize)
f = open('foo', 'rb')
f.seek(__TEXT.fileoff)
open('foo__TEXT', 'wb').write(f.read(__TEXT.filesize))
当然,你也可以使用otool -lv
,但是输出有点乱,很难解析。