MT6739 Android 8.1 取消強制data分區加密,recovery時候掛載data分區

MT6739 Android 8.1 取消強制data分區加密,recovery時候掛載data分區

注意:不取消data分區加密的話,recovery時候無法掛載data分區!

取消data分區默認加密,修改如下:
vendor/mediatek/proprietary/hardware/fstab/mt6739/fstab.in

......
/* Can overwrite FDE setting by defining __MTK_FDE_NO_FORCE and __MTK_FDE_TYPE_FILE in this file */
/* For example, you can un-comment the following line to disable FDE for all projects in this platform. */
#define __MTK_FDE_NO_FORCE	//將這個宏定義打開,將使用“encryptable”
#ifdef __MTK_FDE_NO_FORCE
  #define FLAG_FDE_AUTO encryptable
#else
  #define FLAG_FDE_AUTO forceencrypt
#endif
#ifdef __MTK_FDE_TYPE_FILE
  #define FLAG_FDE_TYPE fileencryption
#else
  #define FLAG_FDE_TYPE
#endif
#ifdef __MTK_FDE_TO_FBE
  #define FLAG_FDE_TYPE forcefdeorfbe
#endif
......
#ifdef __MTK_FDE_TYPE_FILE
DEVPATH(userdata)   /data        ext4   FS_FLAG_DATA FSMGR_FLAG_CHK,resize,FLAG_FDE_TYPE
#else
DEVPATH(userdata)   /data        ext4   FS_FLAG_DATA FSMGR_FLAG_CHK,resize,FLAG_FDE_AUTO=DEVPATH(metadata)
#endif
......

上面的修改,會改變out目錄輸出的,init腳本需要用到的分區mount文件:
out/target/product/k39tv1_bsp/vendor/etc/fstab.mt6739

正常帶加密的,data分區掛載參數如下:

/dev/block/platform/bootdevice/by-name/userdata /data ext4 noatime,nosuid,nodev,noauto_da_alloc,errors=panic wait,check,quota,formattable,resize,forceencrypt=/dev/block/platform/bootdevice/by-name/metadata,

修改之後默認不加密的,data分區掛載參數如下:

/dev/block/platform/bootdevice/by-name/userdata /data ext4 noatime,nosuid,nodev,noauto_da_alloc,errors=panic wait,check,quota,formattable,resize,encryptable=/dev/block/platform/bootdevice/by-name/metadata,

可以看到最後的加密參數“forceencrypt”變成了“encryptable”!

正常recovery恢復出廠設置的時候(這裏只討論“恢復出廠設置”模式,不涉及其他模式,比如“OTA升級”),data分區是不會掛載,直接會被格式化,然後重新建立文件系統,代碼如下:
bootable/recovery/recovery.cpp

// Return true on success.
static bool wipe_data(Device* device) {
    modified_flash = true;
    
    ui->Print("\n-- Wiping data...\n");
    bool success =
        device->PreWipeData() &&
        erase_volume("/data") &&	//這裏格式化data分區
        (has_cache ? erase_volume("/cache") : true) &&
        (has_nvdata ? erase_volume(NVDATA_ROOT) : true) &&
        mt_wipe_data() &&
        device->PostWipeData();
    ui->Print("Data wipe %s.\n", success ? "complete" : "failed");
    return success;
}

可以看到,除了格式化data分區,也去格式化了cache分區,但是實際cache分區在格式化之前是mount的,因爲需要拷貝cache分區下recovery相關的文件到內存,格式化完之後,再重新寫入cache分區,具體邏輯在上面代碼使用的函數“erase_volume()”裏,這個函數在文件:bootable/recovery/recovery.cpp裏。

查看erase_volume()這個函數源碼,重點關注“ensure_path_mounted(volume);”這個函數的使用,這個就是掛載分區的函數,對應的是“ensure_path_unmounted(volume);”卸載分區的函數。

掛載分區函數的實現,這裏就不具體分析了,大致就是通過傳進去的“掛載目錄”參數,比如“/cache”,在分區掛載表裏查找到物理分區,文件系統類型等參數,最後執行系統調用“mount”函數!

我們使用“ensure_path_mounted("/data");”來掛載data分區(需要先取消data分區默認加密),它在分區掛載表裏的記錄大概是這個樣子“/data ext4 /dev/block/platform/bootdevice/by-name/userdata”,但是要注意,需要註釋掉原先格式化data分區的代碼,修改如下:
bootable/recovery/recovery.cpp

// Return true on success.
static bool wipe_data(Device* device) {
    modified_flash = true;

	ui->Print("\n-- mount /data...\n");
	ensure_path_mounted("/data");		//這裏掛載data分區
	ui->Print("-- mkdir /data/test ...\n");
	mkdir("/data/test", 0755);			//這裏在data目錄下創建test目錄,用來驗證掛載成功

    ui->Print("\n-- Wiping data...\n");
    bool success =
        device->PreWipeData() &&
        /*erase_volume("/data") &&*/	//這裏把原先格式化data分區的代碼註釋掉
        (has_cache ? erase_volume("/cache") : true) &&
        (has_nvdata ? erase_volume(NVDATA_ROOT) : true) &&
        mt_wipe_data() &&
        device->PostWipeData();
    ui->Print("Data wipe %s.\n", success ? "complete" : "failed");
    return success;
}

以上所有修改完,編譯測試,data分區的舊文件依然存在,新目錄test被創建!

這種方式,可以在恢復出廠設置的時候,保留/data下需要保留的文件,刪除不需要的文件,但是犧牲了安全性!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章