Darwin 10.15 上的自修改代码导致“格式错误的 mach-o 图像”?

2024-01-15

我有一个可以生成自修改代码的程序(请参阅https://tigress.wtf/selfModify.html https://tigress.wtf/selfModify.html如果你有兴趣的话)。它在 x86 Darwin 和 Linux 上运行。在达尔文上,我编译

gcc -g -segprot __TEXT rwx rwx self_modifying.c -o self_modifying.exe

最近,这似乎不起作用,我明白了

dyld: malformed mach-o image: __TEXT segment maps start of file but is writable

当我运行程序时。

我在 MacOS 10.15.3 上运行 clang 版本 6.0.1。任何帮助,将不胜感激。


@AlexDenisov 非常接近,但该限制不仅仅适用于在最低 macOS 10.15.0 及更高版本的 Catalina 上运行的可执行文件。

Mach-O 加载命令有 2 种格式,指示可执行文件本身可以使用的最低 MacOS:
- LC_BUILD_VERSION(新的如果我没记错的话是10.14左右推出的)
- LC_VERSION_MIN_MACOSX(遗留的)

即使使用回退到较旧的 MacOS 版本LC_VERSION_MIN_MACOSX:

gcc -segprot __TEXT rwx rwx -mmacosx-version-min=10.6 self_modifying.c 

我们遇到了同样的问题。

To 绕过检查我发现有效的一个解决方案是完全摆脱最小的 macOS 版本。我不知道有什么gcc or ld可以实现这一点的标志。幸运的是,我们可以在 Jonathan Levin 的帮助下链接可执行文件后进行处理jtool2 http://www.newosxbook.com/tools/jtool.html

所以命令链变成:

gcc -segprot __TEXT rwx rwx self_modifying.c 
jtool2 -l a.out                             
    LC 00: LC_SEGMENT_64             Mem: 0x000000000-0x100000000   __PAGEZERO
    LC 01: LC_SEGMENT_64             Mem: 0x100000000-0x100001000   __TEXT
        Mem: 0x100000f60-0x100000f83        __TEXT.__text   (Normal)
        Mem: 0x100000f84-0x100000f8a        __TEXT.__stubs  (Symbol Stubs)
        Mem: 0x100000f8c-0x100000fa6        __TEXT.__stub_helper    (Normal)
        Mem: 0x100000fa6-0x100000fb2        __TEXT.__cstring    (C-String Literals)
        Mem: 0x100000fb4-0x100000ffc        __TEXT.__unwind_info    
    LC 02: LC_SEGMENT_64             Mem: 0x100001000-0x100002000   __DATA_CONST
        Mem: 0x100001000-0x100001008        __DATA_CONST.__got  (Non-Lazy Symbol Ptrs)
    LC 03: LC_SEGMENT_64             Mem: 0x100002000-0x100003000   __DATA
        Mem: 0x100002000-0x100002008        __DATA.__la_symbol_ptr  (Lazy Symbol Ptrs)
        Mem: 0x100002008-0x100002010        __DATA.__data   
    LC 04: LC_SEGMENT_64             Mem: 0x100003000-0x100004000   __LINKEDIT
    LC 05: LC_DYLD_INFO             
           Rebase info: 8     bytes at offset 12288 (0x3000-0x3008)
           Bind info:   24    bytes at offset 12296 (0x3008-0x3020)
        No Weak info
           Lazy info:   16    bytes at offset 12320 (0x3020-0x3030)
           Export info: 48    bytes at offset 12336 (0x3030-0x3060)
    LC 06: LC_SYMTAB                
    LC 07: LC_DYSYMTAB              
            1 local symbols at index     0
            2 external symbols at index  1
            2 undefined symbols at index 3
           No TOC
           No modtab
            3 Indirect symbols at offset 0x30b8
    LC 08: LC_LOAD_DYLINKER         /usr/lib/dyld
    LC 09: LC_UUID                  UUID: 6AE91487-DB61-3FA8-8DBE-686FEC1DA8FC
    LC 10: LC_BUILD_VERSION         Build Version:           Platform: MacOS 10.15.0 SDK: 10
    LC 11: LC_SOURCE_VERSION        Source Version:          0.0.0.0.0
    LC 12: LC_MAIN                  Entry Point:             0xf60 (Mem: 0x100000f60)
    LC 13: LC_LOAD_DYLIB            /usr/lib/libSystem.B.dylib
    LC 14: LC_FUNCTION_STARTS       Offset:     12384, Size:      8 (0x3060-0x3068)
    LC 15: LC_DATA_IN_CODE          Offset:     12392, Size:      0 (0x3068-0x3068)
jtool2 -rc 10 --inplace a.out

现在你的a.out应该正确启动:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Darwin 10.15 上的自修改代码导致“格式错误的 mach-o 图像”? 的相关文章

随机推荐

  • Heroku + Apartment PG::错误:错误:函数 pg_stat_statements_reset() 不存在

    我在 Rails 4 中使用 Apartment gem 来支持 Heroku 上 Postgres 9 3 3 中的多租户 Apartment gem 创建新租户时出错 深入调查显示创建了一个架构 但内部没有表 Heroku 日志显示错误
  • 除了实际破解代码之外,了解 VM 实现的最佳方法是什么?

    我想了解有关虚拟机实现和优化的更多信息 现在 我正在 以很小的方式 使用 JRuby 做出贡献 并且还在使用我自己的在虚拟机中运行的类似 lisp 的语言实现进行游戏 编写 不过 我想获得有关使用虚拟机并设计它们的更多信息 除了阅读 使用现
  • Oracle 在评估 rownum 之前是否会获取所有行?

    我有一个包含数百万条记录的表 我想确保 Oracle 只要找到第一个匹配项就停止查找 select from table1 where table1 column1 somevalue AND table2 column2 somevalu
  • 数据未写入数据库

    我正在 CheckboxProcess CheckedChanged 事件中向数据库写入一个位值 然而 实际上什么也没有写出来 我里面有一些代码填充了适配器 但我把它拿出来了 有人能看出哪里出了问题吗 protected void Page
  • 禁用表单仍然允许子控件接收输入

    最近几天我在使用 delphi 时感到很头疼 我想做的很简单 在某个点阻止接口并在其他点之后启用 但听起来很简单 我无法弄清楚为什么设计允许某些事情 所以澄清一下 1 创建一个项目 2 在表单中放置一个编辑和一个按钮 编辑的Tab顺序必须是
  • Chrome / Safari 未填充 Flex 父级的 100% 高度

    我想要一个具有特定高度的垂直菜单 每个子项都必须填充父项的高度 并且文本居中对齐 孩子的数量是随机的 所以我必须使用动态值 Div container包含随机数量的子项 item 总是必须填充父级的高度 为了实现这一点 我使用了 Flexb
  • 创建 mozilla 扩展以在其中显示弹出窗口和 iframe

    我正在尝试开发一个 mozilla 扩展 我只需要在弹出窗口中显示 iframe 但不知道该怎么做 我的要求是 在顶部导航工具栏添加扩展按钮 单击扩展按钮时在弹出窗口上显示 iframe 我没有找到任何与此类似的教程 请帮我 谢谢 哈里普拉
  • PHP使用正则表达式将大写文件扩展名转换为小写

    我正在尝试实现以下转换 IM22 htp JPG gt IM22 htp jpg 到目前为止 我已经尝试了以下方法 但似乎不起作用 string IM22 htp JPG pattern w i replacement 1 strtolow
  • 在 p:datatable primefaces 之外找不到标识符为 h:selectBooleanCheckbox 的组件

    我的应用程序中有这段代码 我想将 h selectBooleanCheckbox 值提交到服务器 h selectBooleanCheckbox 位于 p tabView 内部和 p dataTable 外部 我想提交 h selectBo
  • Maven:自定义 web-app 项目的 web.xml

    我有一个 Web 应用程序 Maven 项目 我想根据正在运行的配置文件自定义 web xml 文件 我正在使用 Maven War plugin 它允许我定义一个 资源 目录 可以在其中过滤文件 然而 仅靠过滤对我来说还不够 更详细地说
  • 静态类中静态方法中的变量

    请考虑这段代码 1 public static class MyClass 2 3 public static DateTime MyMethod DateTime dt 4 5 DateTime temp new DateTime 6 t
  • 使用字符串数组声明 java 枚举

    我试图根据从数据库检索的数据声明枚举类型 我有一个方法 它返回表中所有行的字符串数组 我想将其转换为枚举类型 有没有办法用数组构造枚举 这是我尝试过的 但从它在 Eclipse 中的外观来看 这似乎只是创建了一个具有该名称的方法 publi
  • CodeMirror - 样式 Tern 智能感知标签

    我正在使用 CodeMirror 的 Tern 插件 它向编辑器添加了智能感知功能 即弹出内联提示标签 我想改变提示标签的样式 该怎么做 Tern 将 CSS 类名附加到提示框 您可以利用它们来设置样式 例如 CodeMirror Tern
  • 编写脚本来检查远程主机服务是否运行[重复]

    这个问题在这里已经有答案了 这是脚本 但即使 Apache 正在运行其 show stop 输出也是错误的 我使用的是 Ubuntu 12 04 ssh qn root ip if ps aux grep h ttpd gt dev nul
  • 发送电子邮件时出现 VBScript 错误“80040211”

    我在发送电子邮件时遇到错误 错误 80040211 这是我的代码的示例 Dim objMessage Set objMessage CreateObject CDO Message objMessage Subject Super Serv
  • 向元组添加值

    我最初使用 Idictonary 在 MVC 模型中存储字符串值 如下所示 public IDictionary
  • JavaScript 数组排序中的奇怪行为[重复]

    这个问题在这里已经有答案了 我在尝试对 JavaScript 数组进行排序时遇到了奇怪的行为 var arr a b C d e f g h I k arr sort function a b console log a b if a le
  • 为什么 Funcs 不接受超过 16 个参数?

    由于 Javascript 是我最精通的语言 因此我熟悉使用函数作为一等对象 我原本以为C 缺少这个功能 但后来我听说了Func and Action and delegate 我认为这非常棒 例如 您可以声明一个Func连接两个字符串并在
  • 我这里如何使用锁和条件?

    这里我有一个任务 我必须使用锁和条件 在方法 sum 和 randomSwap 中是我必须完成的任务 所以列举了我必须做的事情 首先是没有我编辑的方法中的类和任务 public class LockedDataObject extends
  • Darwin 10.15 上的自修改代码导致“格式错误的 mach-o 图像”?

    我有一个可以生成自修改代码的程序 请参阅https tigress wtf selfModify html https tigress wtf selfModify html如果你有兴趣的话 它在 x86 Darwin 和 Linux 上运