macos - Darwin 10.15 上的自修改代码导致“畸形的 mach-o 图像”?
问题描述
我有一个生成自修改代码的程序(如果您有兴趣,请参阅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 非常接近,但该限制不仅适用于在 Catalina 上运行且最低 macOS 10.15.0 及更高版本的可执行文件。
有 2 种格式的 Mach-O 加载命令指示可执行文件本身可以使用的最小 MacOS :-(如果我没记错的话,新版本在 10.14 左右引入)
-
(旧版本)LC_BUILD_VERSION
LC_VERSION_MIN_MACOSX
即使使用以下命令回退到旧的 MacOS 版本LC_VERSION_MIN_MACOSX
:
gcc -segprot __TEXT rwx rwx -mmacosx-version-min=10.6 self_modifying.c
我们遇到了同样的问题。
要绕过检查,我发现一个可行的解决方案是完全摆脱 min macos 版本。我不知道有任何gcc
或ld
标志可以实现这一点。幸运的是,我们可以在 Jonathan Levin 的jtool2的帮助下链接可执行文件后进行处理
所以命令链变成:
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
应该正确启动:-)
推荐阅读
- javascript - 将 Chrome 应用程序移植到 UWP:如何处理“背景页面”?
- angular - Angular 2 路由:匹配具有给定前缀的任何路径
- recaptcha - 将 ReCaptcha 与凭据管理 API 一起使用
- mysql - 从示例数据库中,我如何进行查询以搜索所有重复 Kivuto Id 的区域(区域 id)?
- python - 如何修复 django 中的 NoReverseMatch 错误
- powershell - 比较 2 个 .csv 文件
- knockout.js - 更新 knockout.js 和 SignalR 库后,knockout-mapping js 不会更新视图中的列表
- javascript - iFrame 内容的下一页和上一页按钮
- python - 如何在 Python 中检查有向图的连通性?
- php - 为什么 symfony 3.4 中的 php 模板渲染正在打印 http 标头?