ish-app/ish

GitHub: ish-app/ish

iSH 是一个通过用户态 x86 模拟在 iOS 上运行 Linux shell 的开源项目,无需越狱即可获得完整的 Alpine Linux 终端环境。

Stars: 19436 | Forks: 1280

# [iSH](https://ish.app) [![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/4b81f9263c180631.svg)](https://github.com/ish-app/ish/actions) [![goto 计数](https://img.shields.io/github/search/ish-app/ish/goto.svg)](https://github.com/ish-app/ish/search?q=goto) [![fuck 计数](https://img.shields.io/github/search/ish-app/ish/fuck.svg)](https://github.com/ish-app/ish/search?q=fuck) [![shit 计数](https://img.shields.io/github/search/ish-app/ish/shit.svg)](https://github.com/ish-app/ish/search?q=shit)

一个旨在通过用户模式 x86 模拟和系统调用转换,在 iOS 上运行 Linux shell 的项目。 关于项目的当前状态,请查看 issues 标签页和提交日志。 - [App Store 页面](https://apps.apple.com/us/app/ish-shell/id1436902243) - [TestFlight 测试版](https://testflight.apple.com/join/97i7KM8O) - [Discord 服务器](https://discord.gg/HFAXj44) - [帮助与教程 Wiki](https://github.com/ish-app/ish/wiki) - [README中文](https://github.com/ish-app/ish/blob/master/README_ZH.md) (如若未能保持最新,请提交PR以更新) # 开发 本项目包含一个 git submodule,请确保在克隆时使用 `--recurse-submodules`,或者在克隆后运行 `git submodule update --init`。 你需要以下依赖来构建项目: - Python 3 + Meson (`pip3 install meson`) - Ninja - Clang 和 LLD (在 Mac 上使用 `brew install llvm`,在 Linux 上使用 `sudo apt install clang lld` 或 `sudo pacman -S clang lld` 等) - sqlite3 (这非常常见,可能已经在 Linux 上安装,Mac 上则肯定已安装。如果没有,请执行类似 `sudo apt install libsqlite3-dev` 的命令) - libarchive (`brew install libarchive`, `sudo port install libarchive`, `sudo apt install libarchive-dev`) TODO: 捆绑此依赖 ## 构建 iOS 版 在 Xcode 中打开项目,打开 iSH.xcconfig,并将 `ROOT_BUNDLE_IDENTIFIER` 更改为唯一的值。你还需要在项目(不是 target!)的构建设置中更新开发团队 ID。然后点击 Run。有些脚本会自动处理其他所有事情。如果你遇到任何问题,请提交一个 issue,我会尽力提供帮助。 ## 构建用于测试的命令行工具 要设置环境,请 cd 到项目目录并运行 `meson build` 以在 `build` 中创建构建目录。然后 cd 到构建目录并运行 `ninja`。 要设置一个独立的 Alpine Linux 文件系统,请从 [Alpine 网站](https://alpinelinux.org/downloads/) 下载 i386 的 Alpine minirootfs 压缩包,并运行 `./tools/fakefsify`,将 minirootfs 压缩包作为第一个参数,输出目录名称作为第二个参数。然后你可以使用 `./ish -f alpine /bin/sh` 在 Alpine 文件系统中运行程序,假设输出目录名为 `alpine`。如果你的构建目录中不存在 `tools/fakefsify`,可能是因为它无法在你系统上找到 libarchive(有关安装方法,请参见上文。) 你可以用 `tools/ptraceomatic` 替换 `ish`,以便在真实进程中运行程序,并单步执行以比较每一步的寄存器。我用它来进行调试。需要 64 位 Linux 4.11 或更高版本。 ## 日志 iSH 有几个可以在构建时启用的日志通道。默认情况下,它们都是禁用的。要启用它们: - 在 Xcode 中:将 iSH.xcconfig 中的 `ISH_LOG` 设置为以空格分隔的日志通道列表。 - 使用 Meson(用于测试的命令行工具):运行 `meson configure -Dlog="<以空格分隔的日志通道列表>"`。 可用通道: - `strace`:最有用的通道,记录几乎所有系统调用的参数和返回值。 - `instr`:记录模拟器执行的每一条指令。这会显著降低运行速度。 - `verbose`:不属于其他类别的调试日志。 - 搜索 `DEFAULT_CHANNEL` 以查看自本文档更新以来是否添加了更多日志通道。 # 关于解释器的说明 作为 iSH 的一部分,我写的最有趣的东西可能就是解释器了。它不完全是一个 JIT,因为它不针对机器代码。相反,它生成一个指向函数(称为 gadgets)的指针数组,每个 gadget 都以对下一个函数的尾调用结束;就像某些 Forth 解释器使用的线程代码技术一样。与使用更简单的 switch 调度的模拟相比,结果大约有 3-5 倍的加速。 不幸的是,我决定几乎所有的 gadget 都用汇编语言编写。就性能而言,这可能是一个好的决定(虽然我永远无法确定),但就可读性、可维护性和我的理智而言,这是一个糟糕的决定。我不得不忍受来自编译器/汇编器/链接器的废话简直是疯了。就像里面有一个恶魔,确保我的代码足够畸形,如果不是,它就会编造愚蠢的理由说明为什么不应该编译。为了在编写这段代码时保持理智,我不得不忽略代码结构和命名方面的最佳实践。你会发现宏和变量的名字非常具有“描述性”,比如 `ss`、`s` 和 `a`。汇编宏嵌套得令人难以置信。更糟糕的是,几乎没有注释。 所以警告一下:长期接触此代码可能会导致理智丧失、关于 GAS 宏和链接器错误的噩梦,或任何其他致残副作用。此代码被加州政府已知会导致癌症、出生缺陷和生殖危害。
标签:Alpine Linux, Clang, CVE验证, DNS 反向解析, Emulation, iOS应用, Linux Shell, Meson, Ninja, Open Source, Usermode, x86模拟器, Xcode开发, 交叉编译, 命令行界面, 安全研究平台, 客户端加密, 客户端加密, 本地代码执行, 沙箱逃逸研究, 目录枚举, 移动安全, 移动端开发工具, 系统调用翻译, 终端模拟器, 自动回退, 越狱替代, 逆向工具, 预握手