(请参阅本文末尾的更新)
出于 $reasons 的原因,我需要对一个旧的 Director 投影仪进行代码设计,我们无法再重新发布(无法访问原始源代码或 Director)。
我这样做是因为在没有签名的情况下运行时,该应用程序现在会打开一个 Finder 窗口,并提示“在哪里……”,要求提供作为嵌入式投影仪资源之一的文件。
但是......如果我cd
进入Projector.app
内容(它不是真的这么叫,但你明白了)并在里面找到投影仪二进制文件Contents/MacOS/
并从终端运行这个二进制文件,应用程序启动并运行良好,一旦它被解压缩(大概)附加存档在二进制文件的末尾...
/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppleFSCompression/AppleFSCompression-96.30.2/Common/ChunkCompression.cpp:50: Error: unsupported compressor 8
/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppleFSCompression/AppleFSCompression-96.30.2/Libraries/CompressData/CompressData.c:353: Error: Unknown compression scheme encountered for file '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/Exceptions.plist'
/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppleFSCompression/AppleFSCompression-96.30.2/Common/ChunkCompression.cpp:50: Error: unsupported compressor 8
/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppleFSCompression/AppleFSCompression-96.30.2/Libraries/CompressData/CompressData.c:353: Error: Unknown compression scheme encountered for file '/System/Library/CoreServices/CoreTypes.bundle/Contents/Library/AppExceptions.bundle/Exceptions.plist'
271 blocks
1120 blocks
274 blocks
136 blocks
255 blocks
120 blocks
1487 blocks
575 blocks
1128 blocks
570 blocks
104 blocks
2042 blocks
4889 blocks
677 blocks
388 blocks
363 blocks
700 blocks
23010 blocks
...app opens and runs correctly at this point
我不能要求我们的用户这样做(他们非常非技术性)所以我猜测“在哪里......”提示是 OS X Gatekeeper 的某个方面,因此我希望签署二进制文件将使其再次点击运行。
当我尝试对二进制文件进行代码设计时,App.app/Contents/MacOS/projector
我得到:
main executable failed strict validation
设置--no-strict
codesign 选项提供了更多细节:
the __LINKEDIT segment does not cover the end of the file (can't be processed)
我认为这是因为 Director 投影仪是一个二进制文件,带有一个包含应用程序其余资源的捆绑存档,附加到可执行文件的末尾。一些谷歌搜索显示其他项目的嵌入式资源也存在类似问题。
我尝试使用macho_edit来查看是否可以修改二进制文件,但没有任何乐趣。我也尝试过使用jtool进行签名,但同样,这不起作用。
所以现在,在MachOView中打开二进制文件:
我希望我可以对二进制文件进行十六进制编辑并更改它的值,__LINKEDIT segment
以便它覆盖文件的末尾,因此代码设计将起作用,但我不知道修改后的值应该是什么,或者如果有的话还有什么我需要改变。任何提示表示赞赏。
更新 1 - 回应Kamil.S 的回答
我已经尝试调整File Size
__LINKEDIT 段中的值,所以 this + theFile Offset
与实际的二进制文件相同(我尝试了几次;您实际上需要将 更改为与操作系统VM Size
相同的值File Size
或您获得的值。相同Killed: 9
如果您设置File Size
为二进制文件的总大小,则会发生这种情况),但没有运气。使用新的File Size
和VM Size
值,我仍然可以运行二进制文件,但我不能对其进行代码设计;但是,我确实收到了一条略有不同的错误消息:
file not in an order that can be processed (link edit information does not fill the __LINKEDIT segment)
更新 2 - https://github.com/pyinstaller/pyinstaller/wiki/Recipe-OSX-Code-Signing#pyinstaller-fix-implementation对同一问题有更多详细信息:
PyInstaller 会破坏 OSX 代码签名,因为它会在二进制文件末尾附加 python 代码。在可执行文件末尾附加数据会破坏 Mach-o 格式结构。
codesign
实用程序抱怨以下消息。the __LINKEDIT segment does not cover the end of the file (can't be processed) file not in an order that can be processed (link edit information does not fill the __LINKEDIT segment)
修复 __LINKEDIT - 文件大小(偏移量 + 文件大小 == exe 大小),VM 大小 - 与“文件大小”相同
修复 LC_SYMTAB - 字符串表大小 - mach-o 文件中的最后一个数据(偏移量 + 大小 = 文件系统上的 exe 大小) - 附加到可执行文件的数据将成为“字符串表”的一部分(Mach-O 文件中的最后一个数据部分)。
我会看看修复LC_SYMTAB
,看看是否有帮助。