HTC Android kernel write protection

HTC 的 ROM kernel 裏面都會有特製的函數使得某些分割區在 kernel (也就是 driver )層的寫入被阻擋。

就算檔案系統掛載模式是 rw 也沒用,因爲 kernel 裏面寫入 mmc 卡的 driver 根本就不支援寫入。

這種寫入保護應該就是大家常稱的 s-on / s-off ,不過我不確定。還有這樣的保護應該是在所有機型的 kernel 當中都有,不過我也只檢查過 One SV 的 kernel。

這樣的寫入保護使得取得 root 的實際用途大大地受限,因爲就算取得 root 之後還是很多地方沒辦法改。而且不像取得 root ,HTC 官方並不提供任何解開寫入保護的方法。

防寫功能由 CONFIG_MMC_MUST_PREVENT_WP_VIOLATION 這個編譯選項啓動。

防寫相關的函式在 drivers/mmc/card/block.c 。

get_tamper_sf() 會去讀 bootloader 給的參數 td.sf ,應該是辨別裝置是否被修改過的變數,至於 bootloader 是如何判別這件事情的就不清楚了。

wp_prevention_partno 變數存的是要保護的 partition ,但只有一個 partition 就有點奇怪了。這個變數由 arch/arm/mach-msm/emmc_partitions.c 的 parse_tag_msm_partition() 設定。

真正阻擋寫入的地方是在 block/blk-core.c 的 generic_make_request_checks() 當中

繞過的方法應該有2種:一是把 mmc0_write_prot_type 設成 0 ,二是把 wp_prevention_partno 設成某個不存在的 partition 。這兩種方法目前都無法驗證是否有效,因用爲這兩種方法把防寫解開之後真的寫入都會有這樣的訊息:


<6>[ 1303.057286] c0 mmc0: Applied soft reset to Controller
<6>[ 1303.057317] c0 mmc0: cid 1501004d38473246420a660a5f1acf64 (M8G2FB)
<6>[ 1303.057347] c0 mmc0: csd d02701320f5903fff6dbffef8a404066
<6>[ 1303.057378] c0 mmc0: fw_ver
<3>[ 1303.058446] c0 mmcblk0: timed out sending SET_BLOCK_COUNT command, card status 0x900
<3>[ 1303.058476] c0 mmcblk0: not retrying timeout
<3>[ 1303.058537] c0 end_request: I/O error, dev mmcblk0, sector 791569
<3>[ 1303.058598] c0 end_request: I/O error, dev mmcblk0, sector 791577
<3>[ 1303.058629] c0 end_request: I/O error, dev mmcblk0, sector 791585
<3>[ 1303.058660] c0 end_request: I/O error, dev mmcblk0, sector 791593
<3>[ 1303.058690] c0 end_request: I/O error, dev mmcblk0, sector 791601
<3>[ 1303.058751] c0 end_request: I/O error, dev mmcblk0, sector 791609
<3>[ 1303.058782] c0 end_request: I/O error, dev mmcblk0, sector 791617
<3>[ 1303.058934] c0 Aborting journal on device mmcblk0p33-8.

似乎是 driver 的問題,目前還沒找到解法,需要更熟悉 Linux kernel 的相關知識……

回到上面兩種解法,想法都是基於 flar2 的 wp_mod.ko ,取得了 root 權限以後再插入特製的 kernel module 來變更 mmc0_write_prot_type 或 wp_prevention_partno 的值。

兩種方法的原始碼在 gist (feng.c 是我隨便命名的,就是風啦),順便附上 Makefile ,至於如何 compile 給 Android 的 kernel module ,我打算寫在另外一篇。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s