MachObfuscator全面解析:Apple平台Mach-O应用程序混淆技术指南

MachObfuscator是一种与编程语言无关的Mach-O应用程序混淆器(适用于Apple平台)。

当前状态

✅ -- 表示功能已完成, ❌ -- 表示功能是待办事项/正在进行中。

✅ Mach-O iOS

✅ Mach-O macOS

✅ iOS NIB(包括故事板)

⚠️ macOS NIB(包括故事板) -- 尚不支持绑定

❌ MOM(CoreData)

❌ Mach-O watchOS

❌ Mach-O tvOS

❌ 位码

❌自动代码重新签名(需要手动重新签名所有图片,请参阅resign.sh

概述

MachObfuscator是一个二进制符号混淆器。这是什么意思?有一些重要的术语:

1.混淆器 -- 一种使软件难以逆向的工具。

2.二进制混淆器 -- 一种混淆器,它在机器代码上运行,而不是在源代码上运行。

3.符号混淆器 -- 一种仅混淆符号名称的混淆器,不会改变程序控制流。

MachObfuscator 直接转换Mach-O文件中的符号。Mach-O格式主要用于Apple平台,作为可执行文件和库的机器代码容器。MachObfuscator不需要访问应用程序源代码以对其进行模糊处理。

类似地,IpaGuard是一款专注于iOS IPA文件混淆的工具,它提供代码混淆、资源文件混淆等功能,无需源码即可操作,支持多种开发平台,有效增加反编译难度。

演示

让我们看看MachObfuscator混淆SampleApp.app应用程序:

通过在MachOView中打开app的主要可执行文件可以看到结果。MachOView显示模糊的ObjC选择器:

和混淆的ObjC类名:

上面仅显示了样本更改。MachObfuscator更改了更多Mach-O部分。

用法细节 $ ./MachObfuscator usage: ./MachObfuscator -qvdhtD -m mangler_key APP_BUNDLE Obfuscates application APP_BUNDLE in-place. Options: -h, --help 帮助 -q, --quiet 安静模式 -v, --verbose 输出详细信息 -d, --debug 调试模式,输出更详细的信息 --dry-run 不保存模糊文件 --erase-methtype 擦除methType部分 -D, --machoview-doom MachOView在尝试打开二进制文件后崩溃(不适用于caesarMangler --swift-reflection 混淆了Swift反射部分(typeref和reflstr)。 --objc-blacklist-selector NAME,NAME... 不会混淆给定的选择器 --objc-blacklist-selector-regex REGEXP 不会混淆与给定正则表达式匹配的选择器 --preserve-symtab 不会删除SYMTAB字符串 --erase-section SEGMENT,SECTION SECTION擦除给定部分,例如:TEXT, swift5_reflstr --erase-source-file-names PREFIX 从二进制文件中擦除源文件路径。删除以给定前缀开头的路径,用常量字符串替换它们 --replace-cstring STRING 用给定的替换任意__cstring(谨慎使用)。匹配整个字符串, --replace-cstring-with STRING 如果需要,可以添加填充0。这些选项必须成对使用。 --skip-all-frameworks 不会混淆框架 --skip-framework framework 不会混淆给定的框架 --obfuscate-framework framework 框架模糊了给定的框架(白名单为--skip-all-frameworks) -m mangler_key, --mangler mangler_key 选择mangler来生成混淆的符号 Development options: --xx-no-analyze-dependencies 不分析依赖关系 Available manglers by mangler_key: caesar - ROT13所有objc符号和dyld信息 realWords - 用随机单词替换objc符号(支持dyld信息混淆)

简单化,MachObfuscator:

1.查找应用包中的所有可执行文件,

2.以递归方式搜索所有依赖库,这些库的依赖关系等等,

3.搜索应用包中的所有NIB文件,

4.区分可模糊文件(应用程序包中的文件)和不可模糊文件(应用程序包外部的文件),

5.从整个依赖图中收集Obj-C符号,导出尝试和导入列表,

6.创建符号白名单和符号黑名单(在不可混淆的文件中使用的符号),

7.使用选定的漫游器修改白名单符号,导出尝试和导入列表,

8.替换可混淆文件中的符号,

9.清除可选的部分,

10.一次保存所有文件。

MachObfuscator在Mach-O部分之后发生变化:

1.__TEXT, __objc_classname - mangles符号名称

2.__TEXT, __objc_methname - mangles符号名称

3...__TEXT, __objc_methtype- mangles符号名称或可选(使用--erase-methtype参数启用)用0s 填充整个部分

4.__TEXT, __swift3_typeref,__TEXT, __swift4_typeref,__TEXT, __swift5_typeref-用填充整段0小号

5.__TEXT, __swift3_reflstr,__TEXT, __swift4_reflstr, __TEXT, __swift5_reflstr-用填充整段0小号

6.LC_DYLD_INFO_ONLY - mangles导出尝试和绑定列表

7.LC_SYMTAB- 用0s 填充整个部分

8.__TEXT, __swift*是Swift的反射机制使用的部分。Mirror即使在清除这些部分之后,也可以返回不太详细的数据。LC_SYMTAB用于lldb。

MachObfuscator不会影响崩溃符号,因为是在编译期间生成的 -- 即在混淆之前。

相关推荐
z***刺25 分钟前
VMware安装macOS安装教程(附安装包)2025超详细下载安装教程
其他·macos
ReaF_star42 分钟前
【工具】把 eDiary 改造成了“云日记本”:两台 Mac 同步笔记的折腾记录
macos·效率工具·文件同步·icloud drive·ediary·mac 自动化
初雪云1 小时前
iOS 上架入门:证书、描述文件、IPA 上传到底是什么关系?
android·ios·自动化·产品经理·iphone
梦曦i3 小时前
uni-router新推useUniEventChannel,彻底解决页面通信难题
前端·uni-app
宠友信息3 小时前
内容社区源码多端数据协议与 Spring Boot 状态流转实现思路
java·spring boot·websocket·uni-app
狂热开发者4 小时前
用 Typeoff 把会后口述整理成 Markdown 决策记录
人工智能·windows·macos·ios·安卓
ofoxcoding4 小时前
Codex Computer Use 完整指南:AI 自动操控 Mac 与 Windows 桌面实战详解
人工智能·windows·macos·ai
ClassOps4 小时前
MacOS右键助手 Ghostty 打开新窗口
macos·右键助手
小牛不牛的程序员5 小时前
开源一个 macOS 剪贴板「意图识别」工具——不只是存储,更是理解你复制了什么
macos·swift
PedroQue996 小时前
uni-router新推useUniEventChannel,彻底解决页面通信难题
前端·uni-app