Architecture Review

三個 NeoZygisk 實作對比分析

本文對比三個基於 ptrace 實現的 Zygisk 注入模組。所有專案均為 GitHub 公開倉庫,包含上游主分支、功能增強分支與實驗性重構分支。

基本信息

專案 JingMatrix/NeoZygisk HSSkyBoy/NyaZygisk maxsteeel/NeoZygisk-fork
來源 Fork 自 Zygisk-Next 衍生自 JingMatrix Fork 自 HSSkyBoy
版本 v2.3 改名為 NyaZygisk, v2.3 v2.4-460
主要語言 C++ 74.2%, Rust 19.6% C++ 75.7%, Rust 18.5% 94.1% C++, 0% Rust
目標 穩定版本 功能增強 激進優化
DenyList 特性 直接卸載 Zygote 掛載點 + 命名空間 (Namespace) 切換 承襲上游並整合弱 Bootloader 隱藏與 ProcessFlags 共享快取 採用 ReZygisk 同款自訂 Linker、純 C++ 背景守護程序 (Daemon)

架構差異

JingMatrix (基礎上游)

  • Daemon: Rust 實作
  • Loader/Injector: C++ 實作
  • 初始化: 使用 TMP_PATH 環境變量程式化設置臨時路徑
  • ProcessFlags: 純 IPC 機制,無緩存設計,優先保證數據一致性與穩定性
  • 風格: 標準 Rust STL 規範實現,注重可讀性和長期穩定性
Enhanced

NyaZygisk (功能增強)

  • Daemon & Loader: 完整繼承上游 Rust/C++ 架構,保證 100% API 兼容性
  • 緩存優化: 新增 Shared Memory 共享內存緩存機制,基於 memfd 創建共享內存區並完成 mmap 映射,利用哈希表實現 UID->flags 映射緩存
  • 弱 BL 隱藏: PLT hook 攔截 unshareproperty_get,優先在 Zygote 階段卸載 root 掛載點。
  • 屬性欺騙: 啟動時自動讀取 spoof.prop,覆寫 ro.boot.* 等關鍵系統屬性以免被指紋化。

maxsteeel (實驗重構)

  • Daemon: 完全重構為純 C++ 實現,移除所有 Rust 依賴。
  • 初始化: 廢棄 TMP_PATH 環境變量方案,改為硬編碼路徑實現,簡化初始化流程
  • 激進優化: 完全移除 C++ STL 依賴,替換為自定義輕量級數據結構,消除額外開銷
  • 內存與解析: 重構 ELF 加載與解析邏輯,修復上游潛在內存洩漏問題
  • 權限修復: 統一設置 memfd 權限為 0555 避免權限異常。

關鍵程式碼差異示例

zygiskd.rs 初始化差異

JingMatrix
static TMP_PATH: OnceLock<String> = OnceLock::new();
// 無 shared memory
HSSkyBoy
static TMP_PATH: OnceLock<String> = OnceLock::new();
static SHARED_MEMORY: OnceLock<SharedShm> = OnceLock::new();

fn initialize_globals() -> Result<()> {
    // ... TMP_PATH 初始化
    initialize_shared_memory()?; // 新增
    Ok(())
}
* 註: maxsteeel 分支已將 Daemon 改為純 C++,無 zygiskd.rs。

總結與推薦

NeoZygisk

優點: 社群活躍度高、程式碼規範、極為穩定。

缺點: 純 IPC 通訊在高頻查詢時有額外開銷,且兩者均依賴 Rust 工具鏈。

👉 推薦: 一般使用者、生產環境、穩定性優先。

NyaZygisk

優點: 性能優化顯著,保留 Rust 的型別安全特性。

缺點: 引入了共享內存與屬性欺騙等新特性,架構更複雜。

👉 推薦: 一般使用者、生產環境、高效能優先。

NeoZygisk-Fork

優點: 極致效能、無 Rust 依賴、體積最精簡。

缺點: 程式碼可讀性較低,維護難度高,社群支援少。

👉 推薦: 極致性能追求者、開發研究。

如果您追求「穩定好用」,選 NeoZygisk 如果您需要「隱藏性與性能平衡」,選 NyaZygisk 如果您有「極致精簡癖」,可以嘗試 NeoZygisk-Fork
由 NKBe 撰寫,Gemini 3.1 Pro 設計與編碼