Skip to content

Commit

Permalink
Merge branch 'main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
CanerKaraca23 authored Mar 23, 2024
2 parents e72d076 + 9403c8f commit 0be510c
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 30 deletions.
8 changes: 7 additions & 1 deletion website/docs/public/templates/nethunter.root
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,11 @@
"CAP_SETGID",
],
"context":"u:r:su:s0",
"rules":[""]
"rules":[""],
"locales": {
"zh_TW": {
"name": "Kali NetHunter",
"description": "提供Kali NetHunter使用chroot"
}
}
}
2 changes: 1 addition & 1 deletion website/docs/zh_CN/guide/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ LKM 模式不会替换掉设备原有的内核,而是使用可加载内核模

1. 不会替换掉设备原有的内核;如果你对设备原有的内核有特殊需求,或者你希望在使用第三方内核的同时使用 KernelSU,可以使用 LKM 模式;
2. 升级和 OTA 较为方便;升级 KernelSU 时,可以直接在管理器里面安装,无需再手动刷写;系统 OTA 后,可以直接安装到第二个槽位,也无需再手动刷写;
3. 适用于一些特殊场景;比如使用临时 ROOT 权限也可以加载 LKM,由于不需要替换 boot 分区,因此不会触发 avb,不会使设备以外变砖
3. 适用于一些特殊场景;比如使用临时 ROOT 权限也可以加载 LKM,由于不需要替换 boot 分区,因此不会触发 avb,不会使设备意外变砖
4. LKM 可以被临时卸载;如果你临时想取消 root,可以卸载 LKM,这个过程不需要刷写分区,甚至也不用重启设备;如果你想再次 root,只需要重启设备即可;

:::tip 两种模式共存
Expand Down
18 changes: 9 additions & 9 deletions website/docs/zh_TW/guide/app-profile.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# App Profile
# App Profile {#app-profile}

App Profile 是 KernelSU 提供的一種針對各種應用程式自訂其使用配置的機制。

對於授予了root 權限(也即可以使用 `su`)的應用程式來說,App Profile 也可以稱為Root Profile,它可以自訂 `su``uid`, `gid` , `groups` , ` capabilities` 以及 `SELinux context` 規則,從而限制 root 使用者的權限;例如可以針對防火牆應用程式僅授予網路權限,而不授予檔案存取權限,針對凍結類別應用程式僅授予 shell 權限而不是直接給 root ;透過最小化權限原則**把權力關進籠子裡**

對於沒有被授予 root 權限的普通應用,App Profile 可以控制核心以及模組系統對此應用的行為;例如是否需要針對此應用程式卸載模組造成的修改等。核心和模組系統可以透過此配置決定是否要做一些類似「隱藏痕跡」類別的操作。

## Root Profile
## Root Profile {#root-profile}

### UID、GID 和 groups
### UID、GID 和 groups {#uid-gid-and-groups}

Linux 系統中有使用者和群組兩個概念。每個使用者都有一個使用者 ID(UID),一個使用者可以屬於多個群組,每個群組也有群組 ID(GID)。此 ID 用於識別系統的使用者並確定使用者可以存取哪些系統資源。

Expand Down Expand Up @@ -39,7 +39,7 @@ App Profile 只是控制 root 應用程式使用 `su` 後的權限,它並非
與應用程式透過 `su` 主動切換使用者或群組不同,Root Profile 是在核心中強制實施的,不依賴 root 應用程式的自覺行為,`su` 權限的授予完全取決於使用者而非開發者。
### Capabilities
### Capabilities {#capabilities}
Capabilities 是 Linux 的一種分權機制。
Expand All @@ -55,7 +55,7 @@ KernelSU 的 Root Profile 可以自訂執行 `su` 後 root 程式的 Capabilitie
Linux 系統關於 Capability 的[官方文件](https://man7.org/linux/man-pages/man7/capabilities.7.html),解釋了每一項Capability 所代表的能力,寫的非常詳細,如果你想要自訂Capabilities,請務必先閱讀此文件。
:::
### SELinux
### SELinux {#selinux}
SELinux 是一種強大的強制權限存取控制(MAC)機制。它按照**預設拒絕**的原則運作:任何未經明確允許的行為都會被拒絕。
Expand Down Expand Up @@ -87,7 +87,7 @@ allow app1 * * *
注意:此處的 `allow app1 * * *` 僅僅作為演示方便而使用,實際過程中不應使用這個規則,因為它跟 permissive 區別不大。
### 逃逸
### 逃逸 {#escalation}
如果 Root Profile 的配置不合理,那麼可能會發生逃逸的情況:Root Profile 的限制會意外失效。
Expand All @@ -102,9 +102,9 @@ allow app1 * * *
如果你的確需要給 adb 授予 root 權限(例如你是開發者),那麼不建議你在配置 Root Profile 的時候將 UID 改成 `2000`,用 `1000(system)` 會更好。
:::
## Non Root Profile
## Non Root Profile {#non-root-profile}
### 卸載模組
### 卸載模組 {#umount-modules}
KernelSU 提供了一種 systemless 的方式來修改系統分區,這是透過掛載 overlayfs 來實現的。但有些情況下,App 可能會對這種行為比較敏感;因此,我們可以透過設定「卸載模組」來卸載掛載在這些應用程式上的模組。
Expand All @@ -114,5 +114,5 @@ KernelSU 提供了一種 systemless 的方式來修改系統分區,這是透
2. 關閉「預設卸載模組」的開關,然後針對需要「卸載模組」的應用程式進行單獨的設置,在 App Profile 中開啟「卸載模組」;(相當於「黑名單」)。
:::info
KernelSU 在 5.10 及以上內核上,內核會執行“卸載模組”的操作;但在 5.10 以下的設備上,這個開關僅僅是一個“設定”,KernelSU 本身不會做任何動作,一些模組(如 Zygisksu 會透過這個模組決定是否需要卸載)
KernelSU 在 5.10 及以上內核上,內核無須任何修改就可以卸載模組;但在 5.10 以下的設備上,這個開關僅僅是一個“設定”,KernelSU 本身不會做任何動作,如果你希望在 5.10 以前的內核可以卸載模組,你需要將 `path_unmount` 函數向後移植到 `fs/namespace.c`,您可以在[如何為非 GKI 核心整合 KernelSU](/zh_TW/guide/how-to-integrate-for-non-gki.html)的末尾獲取更多資訊。一些模組(如 ZygiskNext)也會透過這個設定決定是否需要卸載。
:::
2 changes: 1 addition & 1 deletion website/docs/zh_TW/guide/hidden-features.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 隱藏功能
# 隱藏功能 {#hidden-features}

## .ksurc

Expand Down
10 changes: 5 additions & 5 deletions website/docs/zh_TW/guide/how-to-build.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 如何建置 KernelSU?
# 如何建置 KernelSU? {#how-to-build-kernelsu}

首先,您需要閱讀核心建置的 Android 官方文件:

Expand All @@ -9,9 +9,9 @@
此文件適用於 GKI 裝置,如果您是舊版核心,請參閱[如何為非 GKI 裝置整合 KernelSU](how-to-integrate-for-non-gki)
:::

## 建置核心
## 建置核心 {#build-kernel}

### 同步核心原始碼
### 同步核心原始碼 {#sync-the-kernel-source-code}

```sh
repo init -u https://android.googlesource.com/kernel/manifest
Expand All @@ -22,7 +22,7 @@ repo sync

`<kernel_manifest.xml>` 是一個可以唯一確定組建的資訊清單檔案,您可以使用這個資訊清單進行可重新預測的組建。您需要從[標準核心映像 (GKI) 發行組建](https://source.android.com/docs/core/architecture/kernel/gki-release-builds) 下載資訊清單檔案

### 建置
### 建置 {#build}

請先查看[官方文件](https://source.android.com/docs/setup/build/building-kernels)

Expand All @@ -48,7 +48,7 @@ rm common/android/abi_gki_protected_exports_*
```
:::

## 使用 KernelSU 建置核心
## KernelSU 一起建置核心 {#build-kernel-with-kernelsu}

如果您可以成功建置核心,那麼建置 KernelSU 就會非常輕鬆,依自己的需求在核心原始碼根目錄中執行以下任一命令:

Expand Down
55 changes: 55 additions & 0 deletions website/docs/zh_TW/guide/how-to-integrate-for-non-gki.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ CONFIG_KPROBE_EVENTS=y
`KernelSU/kernel/ksu.c` 中的 `ksu_enable_sucompat()``ksu_enable_ksud()` 取消註解,如果正常開機,即 kprobe 已損毀;或者您可以手動嘗試使用 kprobe 功能,如果不正常,手機會直接重新啟動。
:::

:::info 如何為非 GKI 核心啟用卸載模組功能

如果你的內核版本小於 5.10,你應該將 `path_umount` 向後移植至 `fs/namespace.c`。 卸載模組功能依賴於這個函數。 如果你沒有向後移植 `path_umount`,卸載模組功能將無法工作。 你可以在底下查看更多關於 `path_unmount` 的資料。
:::

## 手動修改核心原始碼 {#modify-kernel-source-code}

如果 kprobe 無法正常運作 (可能是上游的錯誤或核心版本過低),那您可以嘗試這種方法:
Expand Down Expand Up @@ -261,4 +266,54 @@ index 45306f9ef247..815091ebfca4 100755
add_input_randomness(type, code, value);
```

### 如何向後移植 path_umount {#how-to-backport-path_unpount}

你可以透過向後移植 `path_umount` 來讓卸載模組功能在小於 5.10 的非 GKI 核心上運作. 你可以參考這個修改:

```diff
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1739,6 +1739,39 @@ static inline bool may_mandlock(void)
}
#endif

+static int can_umount(const struct path *path, int flags)
+{
+ struct mount *mnt = real_mount(path->mnt);
+
+ if (flags & ~(MNT_FORCE | MNT_DETACH | MNT_EXPIRE | UMOUNT_NOFOLLOW))
+ return -EINVAL;
+ if (!may_mount())
+ return -EPERM;
+ if (path->dentry != path->mnt->mnt_root)
+ return -EINVAL;
+ if (!check_mnt(mnt))
+ return -EINVAL;
+ if (mnt->mnt.mnt_flags & MNT_LOCKED) /* Check optimistically */
+ return -EINVAL;
+ if (flags & MNT_FORCE && !capable(CAP_SYS_ADMIN))
+ return -EPERM;
+ return 0;
+}
+
+int path_umount(struct path *path, int flags)
+{
+ struct mount *mnt = real_mount(path->mnt);
+ int ret;
+
+ ret = can_umount(path, flags);
+ if (!ret)
+ ret = do_umount(mnt, flags);
+
+ /* we mustn't call path_put() as that would clear mnt_expiry_mark */
+ dput(path->dentry);
+ mntput_no_expire(mnt);
+ return ret;
+}
/*
* Now umount can handle mount points as well as block devices.
* This is important for filesystems which use unnamed block devices.
```


最後,再次建置您的核心,KernelSU 將會如期運作。
99 changes: 92 additions & 7 deletions website/docs/zh_TW/guide/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## 檢查您的裝置是否受支援 {#check-if-supported}

[GitHub Releases](https://github.com/tiann/KernelSU/releases) 下載 KernelSU 管理員應用程式,然後將應用程式安裝至裝置並開啟:
[GitHub Releases](https://github.com/tiann/KernelSU/releases) 下載 KernelSU 管理器應用程式,然後將應用程式安裝至裝置並開啟:

- 如果應用程式顯示「不支援」,則表示您的裝置不支援 KernelSU,您需要自行編譯核心才能繼續使用,,KernelSU 官方也永遠不會為您提供一個可以刷新的 Boot 映像。
- 如果應用程式顯示「未安裝」,那麼 KernelSU 支援您的裝置;可以進行下一步作業。
Expand Down Expand Up @@ -49,9 +49,94 @@ w .x .y -zzz -k -something

如果您發現您的核心版本是 `android12-5.10.101`,然而您 Android 系統的版本為 Android 13 或者其他;請不要覺得奇怪,因為 Android 系統的版本與 Linux 核心的版本號碼並非一致;Linux 核心的版本號碼一般與**裝置出廠時隨附的 Android 系統的版本一致**,如果後續 Android 系統更新,核心版本一般不會發生變化。如果您需要刷新,**請以核心版本為準!!**

## 安裝簡介 {#installation-introduction}
## 安裝簡介 {#introduction}

KernelSU 的安裝方法有以下幾種,各自適用於不同的場景,請視需要選擇:
`0.9.0` 版本以後,在 GKI 裝置中,KernelSU 支援兩種運行模式:

1. `GKI`:使用**通用核心鏡像**(GKI)取代掉裝置原有的核心。
2. `LKM`:使用**可載入核心模組**(LKM)的方式載入到裝置核心中,不會替換掉裝置原有的核心。

這兩種方式適用於不同的場景,你可以根據自己的需求選擇。

### GKI 模式 {#gki-mode}

GKI 模式會替換掉裝置原有的內核,使用 KernelSU 提供的通用內核鏡像。 GKI 模式的優點是:

1. 通用型強,適用於大多數裝置;例如三星開啟了 KNOX 的裝置,LKM 模式無法運作。還有一些冷門的魔改裝置,也只能使用 GKI 模式;
2. 不依賴官方韌體即可使用;不需要等待官方韌體更新,只要 KMI 一致,就可以使用;

### LKM 模式 {#lkm-mode}

LKM 模式不會替換掉裝置原有的內核,而是使用可載入內核模組的方式載入到裝置內核中。 LKM 模式的優點是:

1. 不會取代裝置原有的核心;如果你對裝置原有的核心有特殊需求,或是你希望在使用第三方核心的同時使用 KernelSU,可以使用 LKM 模式;
2. 升級和 OTA 較為方便;升級 KernelSU 時,可以直接在管理器內部安裝,無需再手動刷寫;系統 OTA 後,可以直接安裝到第二個槽位,也無需再手動刷寫;
3. 適用於一些特殊場景;例如使用臨時 ROOT 權限也可以載入 LKM,由於不需要替換 boot 分區,因此不會觸發 avb,不會使裝置意外變磚;
4. LKM 可以被暫時卸載;如果你暫時想取消 root,可以卸載 LKM,這個過程不需要刷寫分區,甚至也不用重啟裝置;如果你想再次 root,只需要重啟裝置即可;

:::tip 兩種模式共存
打開管理器後,你可以在首頁看到裝置目前運行的模式;注意 GKI 模式的優先級高於 LKM ,如你你既使用 GKI 內核替換掉了原有的內核,又使用 LKM 的方式修補了 GKI 內核,那麼 LKM 會被忽略,裝置將永遠以 GKI 的模式運作。
:::

### 選哪個? {#which-one}

如果你的裝置是手機,我們建議您優先考慮 LKM 模式;如果你的裝置是模擬器、WSA 或 Waydroid 等,我們建議您優先考慮 GKI 模式。

## LKM 安裝 {#lkm-installation}

### 取得官方韌體 {#get-the-official-firmware}

使用 LKM 的模式,需要取得官方韌體,然後在官方韌體的基礎上修補;如果你使用的是第三方內核,可以把第三方內核的 boot.img 作為官方韌體。

取得官方韌體的方法有很多,如果你的裝置支援 `fastboot boot`,那麼我們最推薦以及最簡單的方法是使用 `fastboot boot` 臨時啟動 KernelSU 提供的 GKI 內核,然後安裝管理器,最後在管理器中直接安裝;這種方法不需要你手動下載官方韌體,也不需要你手動提取 boot。

如果你的裝置不支援 `fastboot boot`,那麼你可能需要手動去下載官方韌體包,然後從中提取 boot。

與 GKI 模式不同,LKM 模式會修改 `ramdisk`,因此在出廠 Android 13 的裝置上,它需要修補的是 `init_boot` 分區而非 `boot` 分區;而 GKI 模式則永遠是操作 `boot` 分區。

### 使用管理器 {#use-the-manager}

開啟管理器,點選右上角的安裝圖標,會出現若干個選項:

1. 選擇並修補一個文件:如果你手機目前沒有 root 權限,你可以選擇這個選項,然後選擇你的官方韌體,管理器會自動修補它;你只需要刷入這個修補後的文件,即可永久取得 root 權限;
2. 直接安裝:如果你手機已經 root,你可以選擇這個選項,管理器會自動獲取你的裝置資訊,然後自動修補官方韌體,然後刷入;你可以考慮使用`fastboot boot` KernelSU 的 GKI 內核來取得臨時 root 安裝管理器,然後再使用這個選項;這種方式也是 KernelSU 升級最主要的方式;
3. 安裝到另一個分割區:如果你的裝置支援 A/B 分割區,你可以選擇這個選項,管理器會自動修補官方韌體,然後安裝到另一個分割區;這種方式適用於 OTA 後的裝置,你可以在 OTA 後直接安裝到另一個分割區,然後重新啟動裝置即可;

### 使用命令列

如果你不想使用管理器,你也可以使用命令列來安裝 LKM;KernelSU 提供的 `ksud` 工具可以幫助你快速修補官方韌體,然後刷入。

這個工具支援 macOS、Linux 和 Windows,你可以在 [GitHub Release](https://github.com/tiann/KernelSU/releases) 下載對應的版本。

使用方法:`ksud boot-patch` 具體的使用方法你可以查看命令列幫助。

```sh
husky:/ # ksud boot-patch -h
Patch boot or init_boot images to apply KernelSU

Usage: ksud boot-patch [OPTIONS]

Options:
-b, --boot <BOOT> boot image path, if not specified, will try to find the boot image automatically
-k, --kernel <KERNEL> kernel image path to replace
-m, --module <MODULE> LKM module path to replace, if not specified, will use the builtin one
-i, --init <INIT> init to be replaced
-u, --ota will use another slot when boot image is not specified
-f, --flash Flash it to boot partition after patch
-o, --out <OUT> output path, if not specified, will use current directory
--magiskboot <MAGISKBOOT> magiskboot path, if not specified, will use builtin one
--kmi <KMI> KMI version, if specified, will use the specified KMI
-h, --help Print help
```
需要說明的幾個選項:
1. `--magiskboot` 選項可以指定 magiskboot 的路徑,如果不指定,ksud 會在環境變數中尋找;如果你不知道如何取得 magiskboot,可以參考[這裡](#patch-boot-image);
2. `--kmi` 選項可以指定 `KMI` 版本,如果你的裝置核心名字沒有遵循 KMI 規範,你可以透過這個選項來指定;
最常見的使用方法為:
```sh
ksud boot-patch -b <boot.img> --kmi android13-5.10
```
## GKI 安裝
GKI 的安裝方式有以下幾種,各自適用於不同的場景,請依需求選擇:
1. 使用自訂 Recovery (如 TWRP) 安裝
2. 使用核心刷新應用程式 (例如 Franco Kernel Manager) 安裝
Expand Down Expand Up @@ -87,11 +172,11 @@ PS. 這種方法適用於任何狀況下的安裝 (不限於初次安裝或後
PS. 這種方法在更新 KernelSU 時比較方便,無需電腦即可完成 (注意備份!)。
## 使用 KernelSU 提供的 boot.img 安裝 {#install-by-kernelsu-boot-image}
## 使用 KernelSU 提供的 boot.img 安裝 {#install-with-boot-img-provided-by-kernelsu}
這種方法無需您有 TWRP,也無需您的手機有 Root 權限;適用於您初次安裝 KernelSU。
### 找到合適的 boot.img {#found-propery-image}
### 找到合適的 boot.img {#find-proper-boot-img}
KernelSU 為 GKI 裝置提供了標準 boot.img,您需要將 boot.img 刷新至裝置的 Boot 分割區。
Expand All @@ -105,7 +190,7 @@ KernelSU 為 GKI 裝置提供了標準 boot.img,您需要將 boot.img 刷新
3. Pixel 裝置有些特殊,請遵循下方的指示。
:::
### 將 boot.img 刷新至裝置 {#flash-boot-image}
### 將 boot.img 刷新至裝置 {#flash-boot-img-to-device}
使用 `adb` 連接您的裝置,然後執行 `adb reboot bootloader` 進入 fastboot 模式,然後使用此命令刷新 KernelSU:
Expand Down Expand Up @@ -161,7 +246,7 @@ fastboot reboot
7. 使用 `Image` 取代 `kernel`: `mv -f Image kernel`
8. 執行 `./magiskboot repack boot.img` 重新封裝 img,此時您會得到一個 `new-boot.img` 檔案,透過 Fastboot 將這個檔案刷新至裝置即可。
## 其他替代方法 {#other-methods}
## GKI的其他替代方法 {#other-methods}
其實所有這些安裝方法的主旨只有一個,那就是**將原廠核心取代為 KernelSU 提供的核心**;只要能實現這個目的,就可以安裝;比如以下是其他可行的方法:
Expand Down
4 changes: 2 additions & 2 deletions website/docs/zh_TW/guide/module-webui.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 模組 WebUI
# 模組 WebUI {#module-webui}

KernelSU 的模組除了執行啟動腳本和修改系統檔案之外,還支援顯示 UI 介面和與使用者互動。

該模組可以透過任何 Web 技術編寫HTML + CSS + JavaScript頁面。 KernelSU的管理器將透過 WebView 顯示這些頁面。它還提供了一些用於與系統互動的JavaScript API,例如執行shell命令。

## WebUI 根目錄
## WebUI 根目錄 {#webroot-directory}

Web資源應放置在模組根目錄的`webroot`子目錄中,並且其中**必須**有一個名為`index.html`的文件,該檔案是模組頁面入口。

Expand Down
Loading

0 comments on commit 0be510c

Please sign in to comment.