首页 / 资讯中心 / 文章详情

MonkeyDev 使用指南:基于 Xcode 的 CaptainHook/Logos 插件开发与免越狱 App 注入调试

MonkeyDev 使用指南:基于 Xcode 的 CaptainHook/Logos 插件开发与免越狱 App 注入调试 ★ FEATURED ARTICLE
开发工具移动开发【免费下载链接】MonkeyDevCaptainHook Tweak、Logos Tweak and Command-line Tool、Patch iOS Apps, Without Jailbreak.项目地址https://gitcode.com/gh_mirrors/mo/MonkeyDev点击查看免费下载导读MonkeyDev 是 iOSOpenDev 的升级版本让你在 Xcode 中直接开发 CaptainHook Tweak、Logos Tweak 与 Command-line Tool并把拖入的砸壳 App 自动完成 class-dump、restore-symbol、Reveal、Cycript、dylib 注入、重签名与安装全程无需越狱。读完本文你将掌握 MonkeyDev 的四大核心工作流、打包脚本中的关键环境变量与注入链路以及底层 CaptainHook 宏体系与 Substrate/Substitute 的 hook 原理。1. MonkeyDev 是什么iOSOpenDev 的升级与项目定位MonkeyDev 在 README.md 中自我定位为A modified version of iOSOpenDeviOSOpenDev 的修改增强版README 中文介绍将其概括为原有 iOSOpenDev 的升级非越狱插件开发集成神器。它的核心卖点可以用 README 中的特性清单概括easy to install安装简单一条命令即可完成环境部署support the latest version of theos兼容最新版本 theos避免旧版 iOSOpenDev 长期缺乏维护带来的兼容性问题support CaptainHook Tweak、Logos Tweak、Command-line Tool支持三种 Xcode 工程形态覆盖 Objective-C 宏驱动 hook、theos 风格 Logos 语法、以及纯命令行工具support insert dylib、class-dump、restore-symbol、reveal、cycriptpatch and debug iOS Apps, without jailbreak支持 dylib 注入、class-dump、restore-symbol、Reveal 界面调试、Cycript 运行时交互以及 App 打补丁与调试整个过程无需越狱。从仓库目录结构可以直观看到这些能力的落地形态目录/文件作用结合源码推断Tools/pack.shiOS 打包/注入/重签名主脚本在 Xcode Build Phase 中调用Tools/mpack.shmacOS 应用.app/Contents/MacOS结构的打包注入脚本include/CaptainHook/CaptainHook.h完整的 CaptainHook 头文件759 行宏定义Tweak 开发核心include/substrate.h 与 MFrameworks/substrate.hCydia Substrate / libsubstitute 兼容头文件MFrameworks/libsubstitute.dylibSubstitute 运行时动态库Substrate 的开源替代实现Frameworks/默认注入目标 App 的框架集RevealServer.framework、libcycript.*、libsubstrate.dylibResource/TargetApp.app未拖入目标 App 时使用的内置演示应用2. 四大核心能力详解README 中文部分把 MonkeyDev 的能力总结为四条这是整篇文章的主干下面逐条结合源码展开。2.1 使用 Xcode 开发 CaptainHook Tweak越狱设备上开发插件原文可以使用 Xcode 开发 CaptainHook Tweak、Logos Tweak 和 Command-line Tool在越狱机器开发插件这是原来 iOSOpenDev 功能的迁移和改进。CaptainHook 是一套以宏为驱动的 Objective-C 方法 hook 框架仓库内置的 include/CaptainHook/CaptainHook.h 就是其完整实现。它的设计思路是通过CHDeclareClass声明目标类用CHMethod/CHOptimizedMethod定义替换实现用CHHook完成注册用CHSuper调用原始实现全程无需手写 objc runtime 样板代码。一个典型的 CaptainHook Tweak 长这样#import CaptainHook/CaptainHook.h #import UIKit/UIKit.h // 声明要 hook 的类若目标类无法链接用 CHLoadLateClass 延迟加载 CHDeclareClass(UIViewController); // 声明式方法自动生成 constructor 并完成注册无需手动 CHHook CHDeclareMethod1(void, UIViewController, viewWillAppear, BOOL, animated) { CHLog(-[UIViewController viewWillAppear:%d], animated); CHSuper0(UIViewController, viewWillAppear); // 调用原实现 } // 传统两段式写法CHOptimizedMethod CHConstructor CHHook CHOptimizedMethod1(new, void, UIViewController, viewDidAppear, BOOL, animated) { CHLogSource(viewDidAppear, self %, self); CHSuper1(UIViewController, viewDidAppear, animated); } CHConstructor { CHLoadLateClass(UIViewController); CHHook1(UIViewController, viewDidAppear); }CHConstructor宏展开为static __attribute__((constructor))构造函数见 CaptainHook.h保证 hook 注册代码在 dylib 加载时立即执行。头文件还提供了一整套日志与调试设施CHLog(args...)以CHAppName为前缀输出日志CHLogSource(args...)附带__LINE__行号与__FUNCTION__函数名CHDebugLog/CHDebugLogSource仅在定义CHDebug宏时输出否则编译为空操作见 CaptainHook.hCHProfileScope()在定义CHEnableProfiling时基于mach_absolute_time统计代码段执行耗时见 CaptainHook.h。关于 hook 底层头文件给出了两条路径见 CaptainHook.h定义CHUseSubstrate时方法替换走MSHookMessageEx需要 Substrate/Substitute 运行时否则使用头文件内置的class_addMethodmethod_setImplementation运行时方案不依赖外部库即可完成方法级 hook。2.2 使用 Xcode 开发 Logos Tweak 与 Command-line Tool除 CaptainHook 外MonkeyDev 工程模板同样支持Logos Tweak与Command-line ToolLogos是 theos 生态中广泛使用的 hook 语法使用%hook、%orig、%new等指令描述方法替换编译期被预处理为底层 runtime 调用。在 MonkeyDev 中新建 Logos Tweak 工程后语法层面的能力与 theos 保持一致README 强调 support the latest version of theos仓库中随工程注入的 MFrameworks/libsubstitute.dylib 则为编译产物提供 hook 运行时支撑。Command-line Tool对应 iOSOpenDev 时代的命令行工具模板适合编写独立的注入辅助程序或调试脚本产物同样以 dylib/可执行文件形式随流程分发。这两类模板与 CaptainHook 共用同一套打包链路见下文第 3 节区别仅在工程模板的源码形态。2.3 拖入砸壳 App自动完成注入、重签名与安装免越狱原文只需拖入一个砸壳应用自动集成 class-dump、restore-symbol、Reveal、Cycript 和注入的动态库并重签名安装到非越狱机器。这是 MonkeyDev 最核心的免越狱工作流完整流水线为拖入砸壳应用把xxx.app或xxx.ipa拖进工程的TargetApp目录自动 class-dump由monkeyparser verify触发导出目标 App 的类结构由环境变量MONKEYDEV_CLASS_DUMP控制自动 restore-symbol恢复被 strip 掉的符号便于调试定位由MONKEYDEV_RESTORE_SYMBOL控制注入动态库把工程编译出的lib{TARGET_NAME}Dylib.dylib注入到可执行文件的 Load Commands集成 Reveal / Cycript把Frameworks/目录下的RevealServer.framework、libcycript.*一并拷贝进目标 App 的Frameworks/供界面调试与运行时交互重签名安装使用 Xcode 工程的签名身份重新签名然后安装到非越狱设备。其中步骤 4、5 的实现可以直接在 Tools/pack.sh 中看到当MONKEYDEV_INSERT_DYLIB YES时脚本把lib{TARGET_NAME}Dylib.dylib和整个FRAMEWORKS_TO_INJECT_PATH即仓库 Frameworks/ 目录拷贝到目标 App 的Frameworks/下Release 构建会额外移除RevealServer.framework与libcycript*避免调试组件进入正式产物。注入本身由monkeyparser完成见 pack.sh# 向可执行文件写入 LC_LOAD_DYLIB 加载命令 $MONKEYPARSER install -c load -p executable_path/Frameworks/lib${TARGET_NAME}Dylib.dylib -t ${BUILD_APP_PATH}/${APP_BINARY} # 解除二进制限制允许附加调试 $MONKEYPARSER unrestrict -t ${BUILD_APP_PATH}/${APP_BINARY}如果工程里没有拖入任何 App脚本会自动使用仓库自带的演示应用 Resource/TargetApp.appCFBundleIdentifier为com.alonemonkey.TargetApp最低系统要求 iOS 8.0内置 LaunchScreen 与 Main storyboard保证空工程也能立刻跑通注入流程。2.4 调试自己编写的动态库与第三方 App原文支持调试自己编写的动态库和第三方 App调试能力依赖两步一是注入时执行的unrestrict解除 App 的调试限制见上文命令二是重签名阶段pack.sh 的codesign分支会调用$MONKEYPARSER codesign -i ${EXPANDED_CODE_SIGN_IDENTITY} -t ${BUILD_APP_PATH}-i使用 Xcode 工程当前的签名身份-t指向打包产物目录。这样开发者可以在 Xcode 中直接对注入后的 App 设置断点既调试自己的 dylib也能跟踪第三方 App 的运行时行为。2.5 通过 CocoaPods 集成 SDK 与非越狱插件非越狱插件商店原文支持通过 CocoaPods 第三方应用集成 SDK 以及非越狱插件简单来说就是通过 CocoaPods 搭建了一个非越狱插件商店。MonkeyDev 借助 CocoaPods 私有仓库MonkeyDevSpecs分发非越狱插件插件作者把编译好的插件封装为 pod使用者在自己的工程Podfile中声明依赖并执行pod install即可把第三方插件作为 pod 集成进来。仓库内的打包脚本对此有直接支撑——pack.sh 会检测并 source CocoaPods 生成的脚本if [[ -f ${SRCROOT}/Pods/Target Support Files/Pods-${TARGET_NAME}Dylib/Pods-${TARGET_NAME}Dylib-frameworks.sh ]]; then source ${SRCROOT}/Pods/Target Support Files/Pods-${TARGET_NAME}Dylib/Pods-${TARGET_NAME}Dylib-frameworks.sh fi # 同时处理 resources.sh 资源脚本Pods-{Target}Dylib-frameworks.sh/resources.sh由 CocoaPods 生成负责把 pod 中的 framework 与资源拷入宿主 App。也就是说插件 pod 的 framework/资源最终与工程自己编译的lib{TARGET_NAME}Dylib.dylib一起被注入到目标 App 中——这正是非越狱插件商店的技术底座。若只想集成 SDK 而不注入插件把构建配置MONKEYDEV_INSERT_DYLIB置为NO即可关闭注入链路。3. 打包与注入流程源码剖析3.1 iOS 打包脚本 Tools/pack.shTools/pack.sh 是 iOS 注入流程的总调度整体分六个阶段环境初始化固定MONKEYDEV_PATH/opt/MonkeyDev定位monkeyparser、createIPA.command、演示应用、待注入框架集输入归一化自动发现TargetApp下的.app或.ipa若都没有且MONKEYDEV_TARGET_APP指定了 Bundle ID则调用${MONKEYDEV_PATH}/bin/dump.py从越狱设备拉取砸壳 IPA见 pack.shIPA 会解压出Payload/*.appcheckApp 校验见 pack.sh删除PlugIns、Watch扩展移除UISupportedDevices限制再执行monkeyparser verify该命令同时承接 class-dump 与 restore-symbol由环境变量控制拷贝与注入把目标 App 拷入构建目录拷贝插件 dylib 与Frameworks/调试组件写入LC_LOAD_DYLIB执行unrestrictInfo.plist 处理用PRODUCT_BUNDLE_IDENTIFIER覆盖 Bundle ID或保留原 ID替换CFBundleIconFiles图标为{TARGET_NAME}/icon.png并同步多语言InfoPlist.strings中的CFBundleDisplayName见 pack.shCocoaPods 联动source pod 的 frameworks/resources 脚本见上文 2.5。3.2 macOS 打包脚本 Tools/mpack.shTools/mpack.sh 面向 macOS 应用.app/Contents/MacOS目录结构流程更精简但同样展示了三个关键工具命令# 恢复符号输出 *_with_symbol 后替换原二进制 $monkeyparser restoresymbol -t $APP_BINARY_PATH -o $APP_BINARY_PATH_with_symbol # 去签名 $monkeyparser strip -t $APP_BINARY_PATH -o $APP_BINARY_PATH.unsigned # 注入 dylibmacOS 场景直接放在 Contents/MacOS 下 $monkeyparser install -c load -p executable_path/lib$TARGET_NAME.dylib -t $APP_BINARY_PATH脚本用.symbol、.unsigned、.insert三个标记文件保证每个步骤只执行一次避免重复处理注入用的替代 Substrate 库来自 MFrameworks/libsubstitute.dylib。4. 底层 Hook 机制CaptainHook 与 Substrate/Substitute4.1 CaptainHook 宏体系速览include/CaptainHook/CaptainHook.h 按功能可分为六大块理解它们就能自由组合出任意 Tweak功能块宏说明类声明与加载CHDeclareClass/CHLoadClass/CHLoadLateClass缓存类、元类与父类L55-L67可链接的类用CHLoadClass无法链接的用CHLoadLateClass经objc_getClass延迟加载方法定义CHMethod0~CHMethod9、CHClassMethod0~9定义替换方法0~9 个参数自动声明_super原实现指针L407-L450优化变体CHOptimizedMethod0~9new/super/self三种new目标不存在该方法时直接class_addMethodsuper额外生成 super 调用闭包self不生成 super 指针注册CHHook0~9、CHClassHook0~9调用对应_register()完成方法交换L497-L520声明式CHDeclareMethod0~9、CHDeclareClassMethod0~9自动附带__attribute__((constructor))并调用CHLoadLateClass 注册声明即生效L522-L574原方法调用CHSuper0~9调用被替换前的原始实现L576-L600此外头文件还提供了运行时扩展能力CHRegisterClass可动态创建子类对无法链接的类尤其有用CHAddIvar/CHIvar读写实例变量CHProperty/CHPropertyRetain/CHPropertyCopy/CHPropertyAssign/CHPrimitiveProperty基于objc_setAssociatedObject为任意对象动态附加属性L602-L707。4.2 Substrate 与 SubstituteTweak 的最终生效依赖 hook 运行时。仓库提供了两套头文件include/substrate.h 是经典Cydia Substrate头文件暴露MSHookFunction函数级 hook、MSHookMessageEx方法级 hook、MSGetImageByName、MSFindSymbol、MSHookProcess等 APIMFrameworks/substrate.h 则是为libsubstitute准备的兼容 shim文件头注释说明它基于 Substrate 的某个 git revision 修改删除了MSHookMessage、MSHookProcess等接口并为所有非内联函数设置了自定义汇编名如MSHookFunction→SubHookFunction使其可作为二进制级兼容层替代 libsubstrate。配套的运行时库是 MFrameworks/libsubstitute.dylib 与 Frameworks/libsubstrate.dylib前者用于替代场景后者随默认注入框架集进入目标 App。CaptainHook 在定义了CHUseSubstrate时正是通过MSHookMessageEx完成方法交换见 CaptainHook.h。5. 构建配置速查pack.sh 环境变量一览下表汇总了 Tools/pack.sh 中定义的全部构建开关它们均可通过 Xcode Build Setting 或环境变量覆盖环境变量默认值作用MONKEYDEV_INSERT_DYLIBYES是否把lib{TARGET_NAME}Dylib.dylib注入目标 AppNO时仅集成框架如纯 SDK 场景MONKEYDEV_TARGET_APPOptional指定越狱设备上 App 的 Bundle ID当工程未拖入.app/.ipa时通过dump.py从设备自动砸壳拉取保持Optional则使用内置演示应用MONKEYDEV_ADD_SUBSTRATEYES是否把libsubstrate.dylib一并注入置NO则从注入框架集中移除MONKEYDEV_DEFAULT_BUNDLEIDNONO用工程的PRODUCT_BUNDLE_IDENTIFIER覆盖原 Bundle IDYES保留目标 App 原始 Bundle IDMONKEYDEV_CLASS_DUMP未定义传给monkeyparser verify控制是否执行 class-dump 导出类结构MONKEYDEV_RESTORE_SYMBOL未定义传给monkeyparser verify控制是否执行 restore-symbol 恢复符号此外脚本还会在工程根目录生成LatestBuild软链接并拷入createIPA.command方便一键把注入后的产物打包为 IPA。6. 安装前提与使用注意事项README 强调 MonkeyDev easy to install 且兼容最新版 theos但具体安装步骤以项目 Wiki 文档为准README 多次提示使用请阅读 Wiki 文档。从工作流可以推断使用 MonkeyDev 通常需要macOS Xcode 环境工程签名使用个人 Apple ID 即可满足非越狱设备安装需求开发越狱插件CaptainHook/Logos Tweak时需要一台越狱设备用于调试与安装插件免越狱注入场景下需要准备已砸壳的.app或.ipa可拖入工程或借助dump.py从越狱设备自动拉取注入/重签名工具链依赖安装后位于/opt/MonkeyDev的monkeyparser、createIPA.command、dump.py等组件。最后需要特别提示 README 中的免责声明软件仅供技术交流禁止用于商业及非法用途如产生法律纠纷与本人无关。逆向与注入技术请在合规授权的前提下使用仅用于学习、安全研究或自有应用的功能增强。总结MonkeyDev 的价值在于把越狱插件开发与免越狱注入安装两条链路统一进 Xcode 工作流一边是 CaptainHook/Logos 宏级 hook 的低门槛开发体验另一边是拖入砸壳 App 后由monkeyparser Tools/pack.sh 自动完成的 class-dump、restore-symbol、dylib 注入、Reveal/Cycript 集成与重签名安装。配合 CocoaPods 私有仓库分发插件它事实上构建了一个面向非越狱设备的插件分发与调试生态。赞分享开发工具移动开发【免费下载链接】MonkeyDevCaptainHook Tweak、Logos Tweak and Command-line Tool、Patch iOS Apps, Without Jailbreak.项目地址https://gitcode.com/gh_mirrors/mo/MonkeyDev点击查看免费下载相关推荐MonkeyDev动态库注入非越狱iOS应用逆向开发的终极指南MonkeyDev动态库注入非越狱iOS应用逆向开发的终极指南 MonkeyDev是一款强大的iOS逆向工程工具专门用于非越狱环境下进行动态库注入、应用调试开发工具移动开发终极非越狱应用调试指南MonkeyDev让你的逆向开发效率翻倍终极非越狱应用调试指南MonkeyDev让你的逆向开发效率翻倍 MonkeyDev是一款专为iOS逆向开发打造的集成工具它支持CaptainHook Twe开发工具移动开发【亲测免费】 探索iOS开发新境界MonkeyDev - 非越狱插件开发的利器探索iOS开发新境界MonkeyDev 非越狱插件开发的利器 1. 项目介绍 MonkeyDev是一款基于iOSOpenDev深度改造的工具它将非越狱环境下开发工具移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站