目录

前言 1.1

iOSOpenDev概览 1.2

安装iOSOpenDev 1.3

确认安装成功 1.3.1

普通的插件开发流程 1.4

新建iOSOpenDev项目 1.4.1

初始化项目配置 1.4.2

ssh免密登录 1.4.2.1

写hook插件代码 1.4.3

如何新增文件 1.4.3.1

调试插件代码 1.4.4

带界面的插件开发流程 1.5

前提和目标 1.5.1

基本流程 1.5.2

使用效果 1.5.3

常见问题 1.6

初始化环境 1.6.1

编译调试 1.6.2

经验心得 1.7

附录 1.8

参考资料 1.8.1

前言

iOS逆向开发：iOSOpenDev开发插件

最新版本：v1.2.0

更新时间：20231025

简介

介绍iOS逆向中如何用iOSOpenDev开发越狱插件tweak。先是对iOSOpenDev概览；然后介绍如何安装iOSOpenDev，以及安装后确认安装成功；然后是普通的插件的开发流程，包括新建iOSOpenDev的Xcode项目、初始化项目的配置，其中包括ssh免密登录、写hook插件tweak代码，包括如何新增文件、编译代码调试代码等；以及带UI界面的插件开发的流程，包括前提和目标、基本流程、使用效果、常见问题等；以及常见问题和一些经验心得；常见问题包括初始化环境方面的问题和编译调试方面的问题。

源码+浏览+下载

本书的各种源码、在线浏览地址、多种格式文件下载如下：

HonKit源码

crifan/ios_re_iosopendev_tweak: iOS逆向开发：iOSOpenDev开发插件

如何使用此HonKit源码去生成发布为电子书

详见：crifan/honkit_template: demo how to use crifan honkit template and demo

在线浏览

iOS逆向开发：iOSOpenDev开发插件 book.crifan.org

iOS逆向开发：iOSOpenDev开发插件 crifan.github.io

离线下载阅读

iOS逆向开发：iOSOpenDev开发插件 PDF

iOS逆向开发：iOSOpenDev开发插件 ePub

iOS逆向开发：iOSOpenDev开发插件 Mobi

版权和用途说明

此电子书教程的全部内容，如无特别说明，均为本人原创。其中部分内容参考自网络，均已备注了出处。如发现有侵权，请通过邮箱联系我 admin 艾特 crifan.com，我会尽快删除。谢谢合作。

各种技术类教程，仅作为学习和研究使用。请勿用于任何非法用途。如有非法用途，均与本人无关。

鸣谢

感谢我的老婆陈雪的包容理解和悉心照料，才使得我crifan有更多精力去专注技术专研和整理归纳出这些电子书和技术教程，特此鸣谢。

其他

作者的其他电子书

本人crifan还写了其他150+本电子书教程，感兴趣可移步至：

crifan/crifan_ebook_readme: Crifan的电子书的使用说明

关于作者

关于作者更多介绍，详见：

关于CrifanLi李茂 – 在路上

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-10-25 19:58:23

iOSOpenDev概览

iOSOpenDev概览

在iOS逆向期间，往往涉及到去开发越狱插件tweak，其中常见的工具=框架之一就是：iOSOpenDev。

iOSOpenDev

概述：iOS越狱插件tweak开发框架之一

其他竞品

Theos/Logos

MonkeyDev

常用核心功能：支持基于XCode（的模板）去创建Logos的tweak越狱插件

官网

http://iosopendev.com/

下载

http://iosopendev.com/download/

Github

https://github.com/kokoabim/iOSOpenDev

Wiki

https://github.com/kokoabim/iOSOpenDev/wiki

对于Logos（=Theos？）的支持

https://github.com/kokoabim/iOSOpenDev/wiki/Logos-(Theos)-Support

项目转换

https://github.com/kokoabim/iOSOpenDev/wiki/Convert-to-iOSOpenDev-Project

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-10-25 19:55:34

安装iOSOpenDev

安装iOSOpenDev

从官网iOSOpenDev—Download下载到：iOSOpenDev-1.6-2.pkg，双击去安装：

成功安装后，去Xcode中新建iOS项目，即可看到iOSOpenDev的的选项：

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-11-08 16:59:45

确认安装成功

确认安装成功

环境变量

再去确认，是否把iOSOpenDev的相关环境变量，加到启动脚本（此处是zsh，所以是./zshrc）中了：

➜  ~ cat ~/.zshrc | grep iOSOpenDev
export iOSOpenDevPath=/opt/iOSOpenDev
export iOSOpenDevDevice=
export PATH=/opt/iOSOpenDev/bin:$PATH

如果没有：

✘ crifan@licrifandeMacBook-Pro  /opt/iOSOpenDevSetup/bin  cat ~/.zshrc | grep iOSOpenDev

则自己手动去加上：

crifan@licrifandeMacBook-Pro  /opt/iOSOpenDevSetup/bin  vi ~/.zshrc
crifan@licrifandeMacBook-Pro  /opt/iOSOpenDevSetup/bin  cat ~/.zshrc | grep iOSOpenDev
export iOSOpenDevPath=/opt/iOSOpenDev
export iOSOpenDevDevice=
export PATH=/opt/iOSOpenDev/bin:$PATH
crifan@licrifandeMacBook-Pro  /opt/iOSOpenDevSetup/bin  source ~/.zshrc

Xcode中的iOSOpenDev的模板

确认是否有多出的template模板：

➜  ~ ll ~/Library/Developer/Xcode/
total 0
drwxr-xr-x  8 crifan  staff   256B 10 14 11:13 DerivedData
srwxr-xr-x  1 crifan  staff     0B 10 27 08:54 GPUToolsAgent.sock
drwxr-xr-x  3 crifan  staff    96B 10 27 08:49 Templates
drwxr-xr-x  6 crifan  staff   192B 10 26 22:37 UserData
drwxr-xr-x  5 crifan  staff   160B  9 30 22:11 iOS Device Logs
drwxr-xr-x  4 crifan  staff   128B 10 13 13:54 iOS DeviceSupport
➜  ~ ll ~/Library/Developer/Xcode/Templates
total 0
lrwxr-xr-x  1 root  staff    25B 10 27 08:49 iOSOpenDev -> /opt/iOSOpenDev/templates

此处是有的：

多出了软链接：

~/Library/Developer/Xcode/Templates/iOSOpenDev

指向的是：

/opt/iOSOpenDev/templates

以及接着去看看，具体有哪些模板：

➜  ~ ll /opt/iOSOpenDev/templates
total 48
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 Action Menu Plugin.xctemplate
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 Activator Listener.xctemplate
drwxr-xr-x  12 root  wheel   384B 10 27 08:32 AssistantExtensions Extension.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Base.xctemplate
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 CaptainHook Tweak.xctemplate
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 Cocoa Touch Library.xctemplate
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 Command-line Tool.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Debian Package.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Empty Project.xctemplate
-rw-r--r--   1 root  wheel    18K 10 27 08:49 LICENSE
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 Logos Tweak.xctemplate
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 ManPage.xctemplate
drwxr-xr-x  11 root  wheel   352B 10 27 08:32 NotificationCenter Widget.xctemplate
drwxr-xr-x  12 root  wheel   384B 10 27 08:32 PreferenceLoader Bundle.xctemplate
drwxr-xr-x   7 root  wheel   224B 10 27 08:32 PreferenceLoader.xctemplate
-rw-r--r--   1 root  wheel   352B 10 27 08:49 README.md
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 SBSettings Toggle.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Unit Tests.xctemplate
drwxr-xr-x   7 root  wheel   224B 10 27 08:32 XPC Service.xctemplate

很明显，部分模板，应该就是对应着界面中看到的各个模板：

比如：

Logos Tweak.xctemplate -> Logos Tweak

Command-line Tool.xctemplate -> Command-line Tool

PreferenceLoader Bundle.xctemplate -> PreferenceLoader Bundle

iOSOpenDev中的内容

顺带再去看看，当前iOSOpenDev目录中的内容：

➜  /opt ll
total 0
drwxr-xr-x  9 root  wheel   288B 10 27 08:32 iOSOpenDev
drwxr-xr-x  3 root  wheel    96B 10 27 08:32 iOSOpenDevSetup
drwxr-xr-x  3 root  wheel    96B 10 27 08:32 iOSOpenDevUninstall
➜  /opt cd iOSOpenDev
➜  iOSOpenDev pwd
/opt/iOSOpenDev
➜  iOSOpenDev ll
total 48
-rw-r--r--   1 root  wheel    18K 10 27 08:49 LICENSE
-rw-r--r--   1 root  wheel   352B 10 27 08:49 README.md
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 bin
drwxr-xr-x   2 root  wheel    64B 10 27 08:32 frameworks
drwxr-xr-x   8 root  wheel   256B 10 27 08:32 include
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 lib
drwxr-xr-x  21 root  wheel   672B 10 27 08:32 templates
➜  iOSOpenDev ll bin
total 3000
-rwxr-xr-x  1 root  wheel   428K 10 27 08:49 class-dump
-rwxr-xr-x  1 root  wheel   628K 10 27 08:49 class-dump-z
-rwxr-xr-x  1 root  wheel    59K 10 27 08:49 iosod
-rwxr-xr-x  1 root  wheel   383K 10 27 08:49 ldid
➜  iOSOpenDev ll frameworks
➜  iOSOpenDev ll include
total 48
drwxr-xr-x   3 root  wheel    96B 10 27 08:32 ActionMenu
drwxr-xr-x   3 root  wheel    96B 10 27 08:32 AssistantExtensions
drwxr-xr-x   3 root  wheel    96B 10 27 08:32 CaptainHook
drwxr-xr-x  10 root  wheel   320B 10 27 08:32 libactivator
drwxr-xr-x   3 root  wheel    96B 10 27 08:32 logos
-rw-r--r--   1 root  wheel    21K 10 27 08:49 substrate.h
➜  iOSOpenDev ll lib
total 1216
-rwxr-xr-x  1 root  wheel    77K 10 27 08:49 libactionmenu.dylib
-rwxr-xr-x  1 root  wheel   422K 10 27 08:49 libactivator.dylib
-rwxr-xr-x  1 root  wheel   101K 10 27 08:49 libsubstrate.dylib
➜  iOSOpenDev ll templates
total 48
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 Action Menu Plugin.xctemplate
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 Activator Listener.xctemplate
drwxr-xr-x  12 root  wheel   384B 10 27 08:32 AssistantExtensions Extension.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Base.xctemplate
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 CaptainHook Tweak.xctemplate
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 Cocoa Touch Library.xctemplate
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 Command-line Tool.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Debian Package.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Empty Project.xctemplate
-rw-r--r--   1 root  wheel    18K 10 27 08:49 LICENSE
drwxr-xr-x   6 root  wheel   192B 10 27 08:32 Logos Tweak.xctemplate
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 ManPage.xctemplate
drwxr-xr-x  11 root  wheel   352B 10 27 08:32 NotificationCenter Widget.xctemplate
drwxr-xr-x  12 root  wheel   384B 10 27 08:32 PreferenceLoader Bundle.xctemplate
drwxr-xr-x   7 root  wheel   224B 10 27 08:32 PreferenceLoader.xctemplate
-rw-r--r--   1 root  wheel   352B 10 27 08:49 README.md
drwxr-xr-x   5 root  wheel   160B 10 27 08:32 SBSettings Toggle.xctemplate
drwxr-xr-x   4 root  wheel   128B 10 27 08:32 Unit Tests.xctemplate
drwxr-xr-x   7 root  wheel   224B 10 27 08:32 XPC Service.xctemplate

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-11-08 16:58:58

普通的插件开发流程

普通的插件开发流程

TODO：

【已解决】Mac中用iOSOpenDev开发iOS的theos的Logos的tweak插件

【已解决】给iOSOpenDev的Logos的tweak的XCode项目去做基本配置

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-11-08 17:03:23

新建iOSOpenDev项目

新建iOSOpenDev的Xcode项目

Xcode中新建iOS项目，选择：iOSOpenDev->Logos Tweak：

然后填写项目信息：

比如iOSBypassJailbreak的：

Product Name: iOSBypassJailbreak

Company Bundle: com.crifan

Bundle Identifier: 自动生成出 com.crifan.iOSBypassJailbreak

点击Next继续，即可新建出，看起来和普通Xcode没多大区别的项目：

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-11-08 16:05:21

初始化项目配置

初始化配置iOSOpenDev的Xcode项目

去掉Deploymen Info中的Mac和确保iOS版本一致

此处，先去做第一个配置方面的改动：

TARGETS->General->Deploymen Info：去掉Mac，因为我们开发的是iOS的插件，不需要发布到Mac，且设置好iOS的最低版本

PROJECT->Info->Deployment Target->iOS Deployment Target，也要同步设置iOS的最低版本

导入依赖库libsubstrate.dylib

把libsubstrate.dylib(一般在/opt/iOSOpenDev/lib/libsubstrate.dylib)：

导入到项目中的：Targets->YourProjectName->Build Phases->Link Binary With Libraries

设置被hook的app包名或二进制文件名

去把要hook的，被拦截的app的包名，加到被hook的包名的列表中：

YourProjectName->YourProjectName->Package->Libarary->MobileSubstrate->DynamicLibraries->CurrentProjectBundleIdentifier.plist

在Root->Filter->Bundles，会看到Item 0：

Type：String

Value：填入你要hook的app的包名

举例

com.crifan.ShowSystemInfo

另外

如果要新增一行

移动到Item 0所在的行，会看到出现个➕=加号，点击加号，会新增一行

如何hook二进制？

如果需要hook二进制，则是新建Array类型的（和Bundles并列的）Executables子项，再加上对应的二进制文件名

举例：

hook二进制：akd = AuthKit.framework的daemon进程

此时，对应的plist文件内容是：

jailAppleAccount/Package/Library/MobileSubstrate/DynamicLibraries/jailAppleAccount.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Filter</key>
  <dict>
    <key>Executables</key>
    <array>
      <string>akd</string>
      <string>amsaccountsd</string>
      <string>AppleMediaServices</string>
      <string>AppleAccount</string>
      <string>Preferences</string>
    </array>
    <key>Bundles</key>
    <array>
      <string>com.apple.Preferences</string>
    </array>
  </dict>
</dict>
</plist>

设置iPhone的IP

把此处要把iOS调试设备（iPhone）中的IP地址：

此处是：192.168.1.27

去加到配置中去：

iOSOpenDevDevice = 192.168.1.27

附上原默认的更新后的配置：

iOSOpenDevBuildPackageOnAnyBuild = NO
iOSOpenDevCopyOnBuild = NO
iOSOpenDevDevice = 192.168.1.27
iOSOpenDevInstallOnAnyBuild = NO
iOSOpenDevInstallOnProfiling = YES
iOSOpenDevPath = /opt/iOSOpenDev
iOSOpenDevRespringOnInstall = YES
iOSOpenDevUsePackageVersionPList = YES

另外，理论上，去把对应变量加到环境变量：

➜  ~ cat ~/.zshrc | grep iOSOpenDevDevice
export iOSOpenDevDevice=192.168.1.27

效果应该也是一样的。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-07-20 14:48:30

ssh免密登录

ssh免密登录

在Xcode+iOSOpenDev的编译安装最后阶段，涉及到，自动通过ssh访问iPhone设备，把生成的.deb插件的文件下载和安装到iPhone中

此时就需要先准备好环境：确保Mac中可以，ssh的免密登录iPhone

此处ssh免密登录的具体步骤是：

先用ssh登录一次iPhone

命令

ssh root@192.168.1.27

输入密码

OpenSSH的默认密码是：alpine

即可登录到iPhone中

把ssh的key拷贝到iPhone中

命令

ssh-copy-id root@192.168.1.27

输入密码：alpine

即可实现，ssh免密登录：

以后ssh直接可以访问iPhone，而无需输入密码

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-07-20 14:38:39

写hook插件代码

写hook插件代码

iOSOpenDev中的hook插件代码的逻辑是：

.xm：原始的hook插件的代码

写hook插件，是改动.xm文件

而不需要，也不应该改动.mm文件

.mm：从.xm自动（在Build后）自动生成的文件

后续真正编译的文件是.mm文件

可以在Compiled Sources中看到.mm文件（而不是.xm文件）

新建iOSOpenDev的项目中的.xm文件（此处是iOSBypassJailbreak.xm）生成的默认代码，来自模板，一般是：

// Logos by Dustin Howett
// See http://iphonedevwiki.net/index.php/Logos

#error iOSOpenDev post-project creation from template requirements (remove these lines after completed) -- \
   Link to libsubstrate.dylib: \
   (1) go to TARGETS > Build Phases > Link Binary With Libraries and add /opt/iOSOpenDev/lib/libsubstrate.dylib \
   (2) remove these lines from *.xm files (not *.mm files as they're automatically generated from *.xm files)

%hook ClassName

+ (id)sharedInstance
{
   %log;

   return %orig;
}

- (void)messageWithNoReturnAndOneArgument:(id)originalArgument
{
   %log;

   %orig(originalArgument);

   // or, for exmaple, you could use a custom value instead of the original argument: %orig(customValue);
}

- (id)messageWithReturnAndNoArguments
{
   %log;

   id originalReturnOfMessage = %orig;

   // for example, you could modify the original return value before returning it: [SomeOtherClass doSomethingToThisObject:originalReturnOfMessage];

   return originalReturnOfMessage;
}

%end

去删除掉，或注释掉，改为自己的hook的代码。

比如此处仅用于演示的代码：

#import <UIKit/UIKit.h>
//#import <SpringBoard/SpringBoard.h>
// #import <Preferences/Preferences.h>
#import <os/log.h>

%hook UIDevice

- (NSString *)name
{
    os_log(OS_LOG_DEFAULT, "test hook UIDevice name");
    return @"Tweaked_name";
}

- (NSString *)systemName
{
    os_log(OS_LOG_DEFAULT, "test hook UIDevice systemName");
    return @"Tweaked_systemName";
}

- (NSString *)systemVersion
{
    os_log(OS_LOG_DEFAULT, "test hook UIDevice systemVersion");
    return @"Tweaked_systemVersion";
}

- (NSString *)model
{
    os_log(OS_LOG_DEFAULT, "test hook UIDevice model");
    return @"Tweaked_model";
}

%end

附录

iOS中常见的hook网络相关的请求

核心代码：

static char* LastUpdate = "20231025_1524";

#import "HookLogiOS.h"
#import "CrifanLib.h"

/*------------------------------------------------------------------------------
 NSURLRequest
------------------------------------------------------------------------------*/

%hook NSURLRequest

+(instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval{
    iosLogInfo("URL=%{public}@, cachePolicy=%lu, timeoutInterval=%f", URL, (unsigned long)cachePolicy, timeoutInterval);
    return %orig;
}

+(instancetype)requestWithURL:(NSURL *)URL{
    iosLogInfo("URL=%{public}@", URL);
    return %orig;
}

%end

/*------------------------------------------------------------------------------
 NSHTTPURLResponse
------------------------------------------------------------------------------*/

%hook NSHTTPURLResponse

-(NSHTTPURLResponse*)initWithURL:(NSURL *)url statusCode:(NSInteger)statusCode HTTPVersion:(NSString *)HTTPVersion headerFields:(NSDictionary<NSString *,NSString *> *)headerFields{
    NSHTTPURLResponse* newUrlResp =  %orig;
    iosLogInfo("url=%{public}@,statusCode=%ld,HTTPVersion=%@,headerFields=%{public}@ -> newUrlResp=%{public}@", url, statusCode, HTTPVersion, headerFields, newUrlResp);
    return newUrlResp;
}

-(NSDictionary *)allHeaderFields{
    NSURL* curUrl = [self URL];
    NSDictionary* allHeader = %orig;

    //    iosLogInfo("curUrl=%{public}@ : allHeader=%{public}@", curUrl, allHeader);
    NSString* respUrlHeaderStr = [NSString stringWithFormat:@"NSHTTPURLResponse:allHeaderFields curUrl=%@ : allHeader=%@", curUrl, allHeader];
    logPossibleLargeStr(respUrlHeaderStr);

    return allHeader;
}

-(NSInteger)statusCode{
    NSURL* curUrl = [self URL];
    NSInteger respStatusCode = %orig;
    iosLogInfo("respStatusCode=%ld : curUrl=%{public}@", respStatusCode, curUrl);
    return respStatusCode;
}

%end

/*==============================================================================
 ctor
==============================================================================*/

%ctor {
    iosLogInfo("%s: %s", LastUpdate, "HookWhatsApp ctor");
}

注：

调用的iosLogInfo等函数，详见：

https://github.com/crifan/crifanLib/blob/master/c/CrifanLib.h

https://github.com/crifan/crifanLib/blob/master/iOS/HookLogiOS.h

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-10-25 19:46:45

如何新增文件

如何新增(.xm和.mm)文件

有时候，需要去新增文件：.xm和.mm

具体步骤是：

新建.xm文件

选中要新增文件所属的位置 -> 右键 -> Add File-> iOS -> Other->Empty->输入文件名：yourFilename.xm ->Create

编译 -> 会生成对应.mm文件

Product->Build

会从yourFilename.xm生成yourFilename.mm

把.mm文件加到Compile Sources中

右键-> Add Files to {yourProjectName} -> 选择（刚新生成的）yourFilename.mm

项目文件列表中，即可新增对应文件yourFilename.mm

项目的待编译的文件中，也包含了对应的.mm文件

Targets->Build Phase->Compile Sources 中有了刚加入的.mm文件

如果文件，点击加号=➕，去新增导入进来

这样后续编译代码时，才能真正编译到对应hook代码

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-07-20 14:50:35

调试插件代码

调试插件代码

接下来就是典型的插件开发流程了：

写代码 = 写hook代码= 写tweak插件代码 = 改动.xm文件

编译代码 -》 确保语法没错，可以正常编译

Xcode->Product->Build

调试和运行 -》 把hook插件代码编译所生成的插件(.deb文件)安装到iOS设备(iPhone)中，测试插件效果

Product->Build For->Profiling

确认插件安装成功

iPhone中看到自己的插件

Cydia->已安装->最近 能看到自己的插件：

点击插件，可以看到插件基本信息

点击插件的文件，可以看到文件列表

确认插件的确正常工作

打开被测试的=被hook的app，看到此处测试代码：更改信息信息，显示是我们hook代码中的值，表示hook成功

查看对应log日志

Xcode->Window->Devices and Simulators->Devices->选中Connected中自己的iPhone设备->Open Console->打开Console=控制台，显示出对应iPhone的log日志

其中就有你的插件的log日志

如果没有，则自己去右上角，搜索对应关键字，即可搜到

此处贴出，后续更新了代码后的相关log

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-07-20 14:39:40

带界面的插件开发流程

带界面的插件开发流程

TODO：

【未解决】用XCode开发iOS的app用于配置改机软件参数

【已解决】越狱iPhone中安装deb包后iOS的反越狱插件没生效

【已解决】把iOS的app和iOS的tweak插件打包成独立的deb安装包

【记录】越狱iPhone中安装iOS的app和tweak合并出的deb安装包

【已解决】越狱iOS如何用Theos开发带GUI图形界面的插件

【记录】重新给iOSOpenDev的tweak加app打包deb看看app是否有权限写入Preferences目录

【已解决】iOS的writeToURL报错：NSCocoaErrorDomain Code 513 You don’t have permission to save the file in the folder Preferences

【已解决】iOSOpenDev的tweak中读取app保存出的配置文件参数

【已解决】iOSOpenDev的XCode编译报错：An empty identity is not valid when signing a binary for the product type Application

【已解决】对比研究FakeWeChatLoc和自己的XCode项目的目录结构区别

【已解决】给iOS的XCode项目中新增iOSOpenDev的Project Navigator的目录和文件

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-01-06 22:40:32

前提和目标

前提和目标

前提

已实现：基于XCode用iOSOpenDev的Logos Tweak去创建出tweak插件

已实现：用XCode开发出普通的带UI界面的iOS的app

比如：实现了机型选择的功能

目标

和tweak和app合并成单个deb安装包=单个tweak插件（安装出来后，带UI界面的tweak插件）

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-01-06 22:36:06

基本流程

基本流程

TODO：

【已解决】XCode 13.1中Build Settings中Code Signing Identity没有Don’t Sign Code选项

【已解决】XCode中编译设置参数中如何新增User-Defined自定义参数

【已解决】XCode项目中新增iOSOpenDev的Package目录到Target目录中

把Xcode中iOS的app项目转换成iOSOpenDev的项目

把普通的XCode项目，去改造成iOSOpenDev的项目：

核心步骤：

只需参考官网教程：

Convert to iOSOpenDev Project · kokoabim/iOSOpenDev Wiki (github.com)

只是有几个细节，需要更新和补充：

最新XCode（13.1）中：Code Signing Identity没有Don’t Sign Code选项

解决办法：给PROJECT->Build Settings->User-Defined->增加参数：

CODE_SIGNING_ALLOWED=NO

详见：

【已解决】XCode 13.1中Build Settings中Code Signing Identity没有Don’t Sign Code选项

新版XCode中找不到新建User-Defined参数的入口

解决办法：选择PROJECT（和 或 TARGETS中的某个target）->Build Settings-》最顶部（和Basic、Customized、All、Combined所在的同）一行的最右边有个加号➕-》Add User-Defined Setting

详见：

【已解决】XCode中编译设置参数中如何新增User-Defined自定义参数

给Target的目录中新建Package

要点：选中自己项目的Target目录-》右键-》New Group

即可新建组=Group=子目录

详见：

【已解决】XCode项目中新增iOSOpenDev的Package目录到Target目录中

app和tweak之间的通信

对于iOSOpenDev的app，想要和tweak插件之间通信，主要是互相共享配置参数，此处是通过：配置文件

具体做法是：

app端

MuJiaBaiHuoApp的ViewController.m

写入配置：

- (void) saveConfig:(NSDictionary *) curCfgDict {
    NSLog (@"curCfgDict=%@", curCfgDict);
    NSString *curCfgFile = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"MUJIABAIHUO_CONFIG_FILE"];
    NSLog (@"curCfgFile=%@", curCfgFile);
    NSString *curCfgFileUrl = [NSString stringWithFormat:@"file://%@", curCfgFile];
    NSLog (@"curCfgFileUrl=%@", curCfgFileUrl);
    NSURL *curCfgUrl = [NSURL URLWithString:curCfgFileUrl];
    NSLog (@"curCfgUrl=%@", curCfgUrl);
    NSError *writeErr = NULL;
    BOOL isWriteOk = [curCfgDict writeToURL:curCfgUrl error:&writeErr];
    NSLog(@"isWriteOk=%d", isWriteOk);
    if (isWriteOk == NO){
        NSLog(@"writeErr=%@", writeErr);
    }
}

到对应的配置文件：

/var/mobile/Library/Preferences/MuJiaBaiHuo.plist

注：

MUJIABAIHUO_CONFIG_FILE是加的User-Defined的参数

且：同时加 MUJIABAIHUO_CONFIG_FILE=$(MUJIABAIHUO_CONFIG_FILE) 到info.plist，才生效

tweak端

MuJiaBaiHuoTweak的MuJiaBaiHuoTweak.xm

const NSString *CONFIG_FILE = @"/var/mobile/Library/Preferences/MuJiaBaiHuo.plist";

- (NSString *)model
{
    os_log(OS_LOG_DEFAULT, "MuJiaBaiHuoTweak hook UIDevice model");
    NSString* hookedModel = @"Tweaked_model";
    NSDictionary *curCfgDict = [[NSDictionary alloc] initWithContentsOfFile:(NSString *)CONFIG_FILE];
    os_log(OS_LOG_DEFAULT, "MuJiaBaiHuoTweak curCfgDict=%{public}@", curCfgDict);
    if (curCfgDict) {
        NSString* phoneIdStr = [curCfgDict objectForKey:@"phoneId"];
        os_log(OS_LOG_DEFAULT, "MuJiaBaiHuoTweak phoneIdStr=%{public}@", phoneIdStr);
        hookedModel = phoneIdStr;
        os_log(OS_LOG_DEFAULT, "MuJiaBaiHuoTweak hookedModel=%{public}@", hookedModel);
    }

    os_log(OS_LOG_DEFAULT, "MuJiaBaiHuoTweak return hookedModel=%{public}@", hookedModel);
    return hookedModel;
}

即可：

从配置文件中

/var/mobile/Library/Preferences/MuJiaBaiHuo.plist

读取出之前保存的NSDictionary，获取到参数phoneId的值。

把tweak和app合并成单个deb文件

此处把：

tweak：的Package包中的Library文件夹

去掉DEBIAN目录

中的control

无需tweak的control

app：的Package的目录中的所有内容

Applications

DEBIAN

control

需要app的control文件

合并到一起后的效果：

对应的目录结构：

➜  MuJiaBaiHuoDeb tree deb/Package
deb/Package
├── Applications
│   └── MuJiaBaiHuoApp.app
│       ├── Base.lproj
│       │   ├── LaunchScreen.storyboardc
│       │   │   ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
│       │   │   ├── Info.plist
│       │   │   └── UIViewController-01J-lp-oVM.nib
│       │   └── Main.storyboardc
│       │       ├── BYZ-38-t0r-view-8bC-Xf-vdC.nib
│       │       ├── ChooseTypeVcId.nib
│       │       ├── Info.plist
│       │       ├── UIViewController-BYZ-38-t0r.nib
│       │       └── fBk-hL-0DN-view-AjQ-Og-Kvs.nib
│       ├── Info.plist
│       ├── MuJiaBaiHuoApp
│       ├── PkgInfo
│       └── README.md
├── DEBIAN
│   └── control
└── Library
    └── MobileSubstrate
        └── DynamicLibraries
            ├── MuJiaBaiHuoTweak.dylib
            └── MuJiaBaiHuoTweak.plist

9 directories, 15 files

Finder中的效果：

Applications

DEBIAN

Library

关于目录中的各个文件的详细解释：

Package：要打包的根目录

Applications

MuJiaBaiHuoApp.app

拷贝自：iOS的app的XCode项目下的LatestBuild

LatestBuild中保存了每次最新编译之后的版本

DEBIAN

control

用的是：iOS的app的Package/DEBIAN/control，不是iOS的tweak的Package/DEBIAN/control

Library

MobileSubstrate

DynamicLibraries

MuJiaBaiHuoTweak.dylib

拷贝自：iOS的tweak的XCode项目下的LatestBuild

LatestBuild中保存了每次最新编译之后的版本

MuJiaBaiHuoTweak.plist

拷贝自iOS的tweak中的Library/MobileSubstrate/DynamicLibraries

然后写个shell脚本：

buildPackage.sh

#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} \;
dpkg-deb -Zgzip -b Package MuJiaBaiHuo.deb

注：其实核心就一句：dpkg-deb -Zgzip -b Package MuJiaBaiHuo.deb

去加上可执行权限：

chmod +x ./buildPackage.sh

运行脚本去打包出deb

./buildPackage.sh

log输出举例

➜  20220302 pwd
/Users/crifan/dev/DevRoot/zry/MuJiaBaiHuo/MuJiaBaiHuoDeb/20220302
➜  20220302 ../buildPackage.sh
dpkg-deb: 正在 'MuJiaBaiHuo.deb' 中构建软件包 'com.crifan.mujiabaihuoapp'。

即可得到deb插件安装包：MuJiaBaiHuo.deb

注：

如何安装

通过Filza或命令行dpkg（命令是dpkg -i filename.deb）去安装deb文件，即可安装到iPhone中。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-01-06 23:01:29

使用效果

使用效果

插件安装后的效果

Cydia中可以看到安装后的插件：

其中详情中，点击文件系统内容，可以看到包含的详细内容：

其中就有Applications和Library

插件的使用效果

iOS的app部分：

桌面上的Logo=iOS的app的图标：

点击启动后，显示主界面：

点击 选择机型，出现：机型列表

去选择一个：iPhone 6(iPhone7,2)

然后回去打开，被hook的普通的iOS的app：ShowSysInfo

可以检测当前机型，是我们所hook选择的机型：

-》说明上述的：tweak插件，iOS的app（用于配合插件做配置），是生效的。

注：

对应保存到了配置文件中的内容是：

phoneId=iPhone7,2

-》至此，跑通了：

带UI界面的tweak插件=单个deb文件，集成了包含了

app

实现用户UI界面

选择配置，保存配置到配置文件 /var/mobile/Library/Preferences/MuJiaBaiHuo.plist

tweak

实现hook功能

返回的值，根据配置文件中保存的值决定

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-07-19 15:34:12

常见问题

常见问题

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-10-25 19:30:01

初始化环境

初始化环境方面的问题

安装器遇到了一个错误，导致安装失败

安装到最后，报错：安装失败 安装器遇到了一个错误，导致安装失败

解决办法：

其实此时iOSOpenDev的主体文件已安装到了默认的位置/opt中，接着去用工具初始化即可解决问题：

cd /opt/iOSOpenDevSetup/bin
sudo ./iod-setup base
sudo ./iod-setup sdk -sdk iphoneos

PrivateFramework directory not found XCode iPhoneOS15.0.sdk

iod-setup sdk -sdk iphoneos时报错：

➜  bin sudo ./iod-setup sdk -sdk iphoneos
Setting up iPhoneOS 15.0 SDK...
Modifying SDK settings...
Symlinking to private frameworks header files...
PrivateFramework directory not found: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.0.sdk/System/Library/PrivateFrameworks

原因：

此处是比较新的XCode 13和对应的iOS 15

->而最新版XCode和iOS早已将私有库PrivateFrameworks移走了

->即iPhoneOSxx.xx.sdk/System/Library/下面没有PrivateFrameworks了

解决办法：

自己之后是否用到私有库PrivateFrameworks

否

直接新建一个空目录即可

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.0.sdk/System/Library
sudo mkdir PrivateFrameworks

是

除了新建目录外，还要把相关iPhoneOS版本的私有库的内容放过去

先要找到相关iPhoneOS的PrivateFrameworks

举例

iPhoneOS 9.2的sdk，可以从这里下载到：

zhangkn/knPrivateFrameworks: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/System/Library/PrivateFrameworks (github.com)

File not found XCode Specifications iPhoneOSPackageTypes.xcspec

iod-setup sdk -sdk iphoneos报错：

➜  bin sudo ./iod-setup sdk -sdk iphoneos
Password:
Setting up iPhoneOS 15.0 SDK...
Modifying SDK settings...
Symlinking to private frameworks header files...
Adding specifications to platform...
File not found: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/iPhoneOSPackageTypes.xcspec

原因：

找不到specifications

解决办法：

下载别人给的：

4个iPhoneOS的spec文件

4个iPhoneSimulator的spec文件

分别放到对应位置，即可。

下载来源：

来源1：

iosopendev专用Specifications.zip

来源2：

越狱开发:用iosOpenDev配置越狱开发环境 编写第一个hello world_我的杯洗具的博客-CSDN博客

下载后，可以看到Specifications中有8个spec。

分别新建Specifications目录：

sudo mkdir /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
sudo mkdir /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications

再去

移动文件

把

4个iPhoneOS的文件

iPhoneOSPackageTypes.xcspec

iPhoneOSPackageTypes.xcspec.iOSOpenDev

iPhoneOSProductTypes.xcspec

iPhoneOSProductTypes.xcspec.iOSOpenDev

放到：

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications

把：

4个iPhoneSimulator的文件

iPhone Simulator PackageTypes.xcspec

iPhone Simulator PackageTypes.xcspec.iOSOpenDev

iPhone Simulator ProductTypes.xcspec

iPhone Simulator ProductTypes.xcspec.iOSOpenDev

放到：

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications

放好后是：

➜  Xcode ll /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
total 48
-rwxr-xr-x@ 1 crifan  wheel   3.2K 12 24  2015 iPhoneOSPackageTypes.xcspec
-rwxr-xr-x@ 1 crifan  wheel   5.4K 12 24  2015 iPhoneOSPackageTypes.xcspec.iOSOpenDev
-rwxr-xr-x@ 1 crifan  wheel   4.0K 12 24  2015 iPhoneOSProductTypes.xcspec
-rwxr-xr-x@ 1 crifan  wheel   6.4K 12 24  2015 iPhoneOSProductTypes.xcspec.iOSOpenDev
➜  Xcode ll /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications
total 48
-rwxr-xr-x@ 1 crifan  wheel   3.4K 12 24  2015 iPhone Simulator PackageTypes.xcspec
-rwxr-xr-x@ 1 crifan  wheel   6.9K 12 24  2015 iPhone Simulator PackageTypes.xcspec.iOSOpenDev
-rwxr-xr-x@ 1 crifan  wheel   3.4K 12 24  2015 iPhone Simulator ProductTypes.xcspec
-rwxr-xr-x@ 1 crifan  wheel   6.1K 12 24  2015 iPhone Simulator ProductTypes.xcspec.iOSOpenDev

另外，新建usr的bin目录：

sudo mkdir /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin

即可。

Host key verification failed

现象：

Xcode编译期间报错：

Preparing to run Xcode Build Phase...
Signing /Users/crifan/Library/Developer/Xcode/DerivedData/iOSBypassJailbreak-bfqgivvncccwmeaykhtbtvgylkkq/Build/Products/Release-iphoneos/iOSBypassJailbreak.dylib with ldid... Done.
Copying /Users/crifan/Library/Developer/Xcode/DerivedData/iOSBypassJailbreak-bfqgivvncccwmeaykhtbtvgylkkq/Build/Products/Release-iphoneos/iOSBypassJailbreak.dylib to package directory at /Users/crifan/dev/dev_root/crifan/iOSBypassJailbreak/iOSBypassJailbreak/Package/Library/MobileSubstrate/DynamicLibraries...
Preparing to build package...
Setting control file /Users/crifan/dev/dev_root/crifan/iOSBypassJailbreak/iOSBypassJailbreak/Package/DEBIAN/control Version field to 1.0-1 using /Users/crifan/dev/dev_root/crifan/iOSBypassJailbreak/iOSBypassJailbreak/PackageVersion.plist... Done.
Building package ... Done.
Creating zip /Users/crifan/dev/dev_root/crifan/iOSBypassJailbreak/Packages/com.crifan.iOSBypassJailbreak_1.0-1_iphoneos-arm.zip... Done.
Host key verification failed.
Failed to create directory /var/root/iOSOpenDevPackages on device 192.168.1.27
Command PhaseScriptExecution failed with a nonzero exit code

原因：没有ssh免密登录

解决办法：设置好ssh免密登录

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-10-25 19:29:50

编译调试

编译调试方面的问题

An empty identity is not valid when signing a binary for the product type 'Dynamic Library'

现象

M2 Max Mac + Xcode 14.3.1中，新建iOSOpenDev项目，去Build编译，报错：

An empty identity is not valid when signing a binary for the product type 'Dynamic Library'

拷贝出的详细错误信息：

Build target HookWhatsApp of project HookWhatsApp with configuration Debug
error: An empty identity is not valid when signing a binary for the product type 'Dynamic Library'. (in target 'HookWhatsApp' from project 'HookWhatsApp')
warning: Traditional headermap style is no longer supported; please migrate to using separate headermaps and set 'ALWAYS_SEARCH_USER_PATHS' to NO. (in target 'HookWhatsApp' from project 'HookWhatsApp')
warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'HookWhatsApp' from project 'HookWhatsApp')
warning: Run script build phase 'Run Script' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'HookWhatsApp' from project 'HookWhatsApp')

An empty identity is not valid when signing a binary for the product type 'Dynamic Library'.

原因：不是很清楚

只是大概知道，属于Xcode的自动管理codesign签名方面的问题

解决办法：禁用自动签名

具体步骤：Xcode->Project->{YourProjectName}->Build Settings->User-Defined->

(点击左上角的加号=➕->Add User-Defined Setting)

新增选项:CODE_SIGNING_ALLOWED=NO

额外说明

如果还不行，多试几次Clean：

Xcode->Product->Clean Build Folders

Xcode->Product->Clean All Issues

control的Version版本号的改动会丢失

现象：

项目中的.plist中的Version的值，默认是1.0-1

当想要去改动版本号，比如改为2023.07.19.2126，结果重新编译后，改动后的Version值丢失，又恢复到之前的默认值1.0-1了

解决办法

TARGETS->Build Settings->User-Defined->iOSOpenDevUsePackageVersionPList从（默认的）YES改为NO

.xm被识别为Audio音频文件

问题：iOSOpenDev的Xcode中，默认的.xm被识别成音频文件，无法显示对应的源代码

具体现象

xm的文件的图标是小喇叭

且右边显示的是：音乐的图标

右边文件类型Type显示是：Default - XM audio file

图

解决办法：

先去：改变.xm的文件类型

Xcode右边的文件属性->Type，从Default - XM audio file改为Objective-C++ Source（或Objective-C Source）

再去改变.xm的文件的打开方式

Xcode左边文件列表->右键.xm文件->Open As->Source Code

即可正常显示.xm为ObjC的代码，并且带语法高亮了，且文件图标是.m的图标

安装插件后桌面上看不到iOS的app图标

现象：带UI界面的tweak或app，（通过Filza）安装到iPhone中后，桌面上看不到iOS的app的图标

原因：iPhone的UI界面没有刷新=icon图标没有刷新

解决办法：

如果是通过Filza安装deb的话

Filza的安装完成界面的点击右上角：动作 -> 选择：UIcache

图

稍等片刻-》桌面上即可出现iOS的app的logo图标了

注：此时点击 注销=Respring=重启SpringBoard，虽然理论上可行，但实际是无效的，无法让桌面出现app图标的

如果不是，则可以单独命令行去运行：uicache

mach-o file, but is an incompatible architecture have 'arm64', need 'arm64e'

现象

iOSOpenDev的Xcode编译出了插件dylib插件，但是启动加载时报错：

'/private/preboot/xxx/procursus/Library/MobileSubstrate/DynamicLibraries/jailAppleAccount.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need 'arm64e'))

原因：此处目标设备iPhone11的CPU是A12，其架构是arm64e的，而插件代码编译出的架构是针对arm64的，不兼容，所以报错

解决办法：

Xcode中去把架构改为（包含=支持）arm64e

具体步骤：

Xcode->TARGETS->YourProjectName->Build Settings->Architectures->Architectures

从默认的：$(ARCHS_STANDARD)==arm64, armv7

改为：Other的arm64 arm64e

如此，即可确认所编译出来的代码（插件），支持arm64e了。

注：

如果额外引用到库文件，则也要确保库文件是支持此处的arm64e的

比如此处遇到libsubstrate.dylib，就是：

默认（iOSOpenDev自带的）不支持arm64e，最后是另外找支持arm64e的

比如

XinaA15越狱后的iPhone11中有

/private/preboot/3B92D6F7C3FE6444A715B312E418498574E442DAB2F6D9E18B58B762F71D1455B7E2E1C2DD3912B1B4E6D10C6B9150C8/procursus/usr/lib/libsubstrate.dylib

大小：218KB

(就是我们要的)FAT格式的，支持2种架构：arm64和arm64e

去拷贝替换掉原先的：Mac中的/opt/iOSOpenDev/lib/libsubstrate.dylib

才顺利编译和链接，才能确保插件正常工作

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-10-25 19:41:39

经验心得

心得

TODO：

【未解决】XCode调试警告：was compiled with optimization stepping may behave oddly variables may not be available

【未解决】iOSOpenDev的XCode的tweak插件编译尝试去掉优化加上调试信息

【已解决】iOSOpenDev的XCode调试iPhone6报错：Unable to install The application could not be verified

【已解决】XCode中删除掉User-Defined的自定义参数

【已解决】XCode中删除用户自定义配置User-Defined中的 CODE_SIGNING_ALLOWED=NO

【已解决】iOSOpenDev的XCode的iOS的tweak插件中实现ObjC的通用全局函数

【已解决】iOSOpenDev的XCode的iOS插件运行报错：ImageLoaderMachO doModInitFunctions和_logosLocalInit

【已解决】iOS代码报错：objc Class is implemented in both app and dylib One of the two will be used Which one is undefined

【已解决】iOSOpenDev的XCode项目编译报错：iPhone Developer no identity found

【已解决】调试iOSOpenDev的XCode的iOS的app

【已解决】研究iOSOpenDev的XCode项目编译过程以确保如何链接自定义.c文件的.o文件

【已解决】iOSOpenDev的XCode项目偶尔编译非常慢卡死

【已解决】iOSOpenDev的XCode中新增.c和.h文件并正常编译

【已解决】如何把XCode的iOS的app项目转换成iOSOpenDev的项目

【已解决】对比研究FakeWeChatLoc和自己的XCode项目的目录结构区别

【已解决】iOSOpenDev的XCode调试iPhone7报错：Unable to install A system application with the given bundle identifier is already installed on the device and cannot be replaced

【记录】更新iOSOpenDev的Logos插件的code signing签名配置

【已解决】XCode中iOSOpenDev开发插件代码报错：No matching function for call to strcpy

【已解决】XCode中iOSOpenDev的Tweak项目中Build Settings中User-Defined中添加和引用变量THEOS

【记录】研究XCode中clang编译mm文件的过程和编译参数

【记录】深究为何此处XCode编译strcpy会报错No matching function for call to

【未解决】把之前theos的tweak改机剩余功能移植到iOSOpenDev的XCode中

.xm文件和.mm文件

TODO：

【已解决】Xcode中xm源码中无法看到和添加断点

【已解决】iOSOpenDev的XCode中.xm文件包含.c中函数找不到报错：Undefined symbols for architecture arm64 referenced from

【已解决】XCode的iOSOpenDev项目报错：Failed Logos Processor Could not open xm

【已解决】iOSOpenDev的XCode中xm代码%hookf编译报错：Expected unqualified-id

【已解决】iOSOpenDev的XCode中如何把Tweak的xm代码拆分成多个文件模块

【未解决】iOSOpenDev的iosod的bug修复：Logos的预处理不支持group子目录中的xm文件

.xm文件

.xm文件，默认会被Xcode识别为音频文件

需要去改变文件类型为Objective C（或Objective C++）文件，再去显示为源代码

代码高亮

【已解决】iOSOpenDev的XCode中新增xm文件设置为Logos语法高亮但无效

【已解决】让XCode的iOSOpenDev中Logos的xm文件支持语法高亮

iOSOpenDev内部逻辑和过程

TODO：

【未解决】研究iOSOpenDev的XCode项目编译过程以确保如何链接自定义.c文件的.o文件

【已解决】XCode编译iOSOpenDev的Logo Tweak项目报错： Command PhaseScriptExecution failed with a nonzero exit code Failed to locate Logos Processor

【未解决】XCode中编译iOSOpenDev的Logos的Tweak时shell从sh换为zsh

【已解决】给iOS的XCode项目中新增iOSOpenDev的Project Navigator的目录和文件

【已解决】XCode项目中新增iOSOpenDev的Package目录到Target目录中

【已解决】XCode中如何把libsubstrate.dylib动态库导入到Link Binary With Libraries

如何卸载带UI的插件app

通过Cydia去卸载已安装的（带UI界面的）插件tweak即可

步骤：

Cydia->已安装->最近->找到插件->进入详情页

点击右上角的卸载：

即可卸载掉插件。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-07-20 14:41:43

附录

附录

下面列出相关参考资料。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-11-08 10:39:15

参考资料

参考资料

【整理】iOS越狱插件开发工具：iOSOpenDev

【已解决】把iOS的app和iOS的tweak插件打包成独立的deb安装包

【已解决】把iOSOpenDev的tweak加app的deb文件安装到已越狱的iPhone中

【已解决】如何把普通iOS的app的XCode项目和iOSOpenDev的Logos插件tweak集成到一起

【已解决】如何把XCode的iOS的app项目转换成iOSOpenDev的项目

【已解决】给iOSOpenDev的app和tweak用配置文件互相通信

【已解决】已越狱iPhone中卸载tweak加app的deb插件

【记录】确认iPhone中安装后的tweak加app是否正常使用

【已解决】把iOSOpenDev的tweak插件和app合并打包成deb文件

【已解决】把iOSOpenDev的tweak加app的deb文件安装到已越狱的iPhone中

【已解决】iOSOpenDev的XCode去Build For Profiling安装后iPhone桌面上找不到iOS的app的图标

【已解决】用Filza安装tweak加app的deb后iPhone桌面中仍没出现iOS的app的logo图标

【已解决】ssh登录iPhone失败：Host key verification failed

【已解决】Mac中安装iOSOpenDev

【已解决】Mac中安装iOSOpenDev报错：安装器遇到了一个错误，导致安装失败

【已解决】Mac中初始化iOSOpenDev环境并新建插件项目

【已解决】iOSOpenDev设置SDK报错：File not found XCode Specifications iPhoneOSPackageTypes.xcspec

【已解决】iOSOpenDev设置SDK报错：PrivateFramework directory not found XCode iPhoneOS15.0.sdk

【已解决】用iOSOpenDev去开发带GUI图形界面的iOS的app和tweak插件集成在一起的插件deb包

【已解决】iOS逆向：如何去hook一个进程而不是带包名的iOS的app

【已解决】XCode中iOSOpenDev中修改control的Version版本号无效会被重置

【未解决】iOS逆向akd：新建iOSOpenDev的Xcode插件项目

【已解决】iOSOpenDev的插件dylib注入iPhone11失败：mach-o file but is an incompatible architecture have arm64 need arm64e

【已解决】寻找支持arm64e的libsubstrate.dylib

【已解决】Xcode项目中引用新的libsubstrate.dylib无效：始终链接是旧的库文件

【已解决】Mac M2 Max中iOSOpenDev编译报错：An empty identity is not valid when signing a binary for the product type Dynamic Library

iosOpenDev-install 失败官方wiki无法解决看这里（尝试有效） - PoloKey - 博客园 (cnblogs.com)

zhangkn/knPrivateFrameworks: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/System/Library/PrivateFrameworks (github.com)

iosopendev专用Specifications.zip

越狱开发:用iosOpenDev配置越狱开发环境 编写第一个hello world_我的杯洗具的博客-CSDN博客

jackrex/FakeWeChatLoc: 手把手教你制作一款iOS越狱App (github.com)

ios - An empty identity is not valid when signing a binary for the product type 'Application' in xcode version 10.2 - Stack Overflow

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2023-10-25 19:49:32