手工制作的 macOS 可执行文件

Mar*_*lli 4 macos assembly mach-o arm64

我正在尝试为 macOS实现一个微型编译器。我在配备 M1 的 MacBook Pro 上运行macOS 11.5。该assembly编码工作正常,我对这个结果(移交给锵编译和运行的时候就好了)很高兴。

我的问题是我找不到自己生成有效可执行文件的方法。我到了一个点,radare2 正确反汇编了可执行文件的每个部分,但是每次我尝试运行我的可执行文件时,我都会从终端获得 SIGKILL (9)。

我阅读了整个文件,因为我找不到关于 Mach-O 格式的任何其他文档来源。SPOILER:它的效果不是很好,这就是为什么我希望某种 Mach-O 巫师能够阅读此内容。

我的问题详细说明: Mach-O 标头很好。我的问题是关于加载命令

我尝试注入以下段/命令:

  • __PAGEZERO
  • __文本
  • __文本,__文本
  • __链接编辑
  • LC_DYLD_INFO
  • LC_LOAD_DYLINKER
  • LC_MAIN
  • LC_LOAD_DYLIB

但是无论我尝试什么(我什至尝试从其他可执行文件复制它们的值,然后我“替换”了入口点的地址以匹配我的),我都找不到使我的可执行文件工作的方法。

有谁知道我需要注入可执行文件及其值的确切加载命令是什么?

PS:如果有一种不使用 dyld 的方法,我会更高兴(我打算坚持使用系统调用)

Sig*_*uza 5

你应该可以,如果你使用沟dyld的LC_UNIXTHREAD替代LC_MAIN

但至少你被杀的一个原因是你没有代码签名。虽然 x86_64 代码可以在没有一个的情况下运行,但 arm64(e) 绝对必须有一个。Apple 甚至修改了他们的链接器,为 arm64 隐式添加了一个临时代码签名(您可以使用 禁用它-Wl,-no_adhoc_codesign,但它不会运行)。
尝试codesign -s - path/to/binary在您制作的文件上运行,看看是否可以正常工作。我不能确定这是你的二进制文件的唯一问题,但它肯定是一个。如果您也想自己生成这些代码签名,那么最直接查看的代码可能是libcodedirectory.cld64 source。Apple 还开源了更复杂的代码设计代码,并且有 3rd-party 实现,例如身份证

  • 这个错误至少给了你一些可以处理的东西。有关“mSuspicious”的实例,请参阅[此文件](https://opensource.apple.com/source/Security/Security-59754.140.13/OSX/libsecurity_utilities/lib/macho++.cpp.auto.html)。这不会与内核中的检查完全相同,但它应该是一个很好的起点。 (2认同)