標籤:

【OSG】iOS9開始引入的內核完整性保護(KPP)功能是如何實現的

與iOS9一起推出的內核完整性保護又稱為「KPP」,這對於arm64越獄帶來了新的問題。 有效地觀察到,在修補內核代碼(通常在較舊的越獄中)之後,設備會一段時間後會靜默地恐慌。 很明顯,有些東西會檢查內核代碼。 這個東西在內核之外,很快就顯現出一種在工作中的管理程序。

到目前為止,我仍然感到驚訝的是,沒有人對KPP進行了一個寫作 - 至少沒有人知道。 所以,我將嘗試解釋hypervision如何工作。 具體的實施細節可能會在稍後的時間提供,只要我有時間。現在,不用多說,我們走

第1部分(設置)

KPP位於一個Mach-O可執行文件,緊隨壓縮內核塊之後,在kernelcache img4內。 iBoot刻錄出KPP圖像,將其載入到0x4100000000,並在EL3中運行

EL3

_start(monitor_boot_args *mba)

這結構體有如下幾項

struct monitor_boot_args {n uint64_t version;n uint64_t virtBase;n uint64_t physBase;n uint64_t memSize;n struct kernel_boot_args *kernArgs;n uint64_t kernEntry;n uint64_t kernPhysBase;n uint64_t kernPhysSlide;n uint64_t kernVirtSlide;n};n

KPP使用調用_start(NULL)的蹦床來覆蓋自己的Mach-O頭,0x4100000000,並安裝了兩個異常處理程序sync_handler和irq_handler。 回想一下AArch64異常表:

VBAR_ELN異常類型描述+0x000SynchronousCurrent EL with SP0+0x080IRQ/vIRQ+0x100FIQ/vFIQ+0x180SError/vSError+0x200SynchronousCurrent EL with SPx+0x280IRQ/vIRQ+0x300FIQ/vFIQ+0x380SError/vSError+0x400SynchronousLower EL using AArch64+0x480IRQ/vIRQ+0x500FIQ/vFIQ+0x580SError/vSError+0x600SynchronousLower EL using AArch32+0x680IRQ/vIRQ+0x700FIQ/vFIQ+0x780SError/vSError

ExceptionVector具有兩個處理程序的位置

接下來,它解析內核及其kexts(來自__PRELINK_INFO)

  • save __TEXT, __DATA segments to map list
  • save __TEXT, __DATA::__const zones to hash list

最後,如果啟用 – which – it(以及其他)以下寄存器

查看完整版:【OSG】iOS9開始引入的內核完整性保護(KPP)功能是如何實現的-『iOS安全』-看雪安全論壇

推薦閱讀:

為什麼很多 iOS app 都有秒退現象?有什麼好方法避免它?
現在的安卓手機到底有沒有iPhone的流暢度?
有什麼iOS進階的書推薦嗎?
如何評價在GitHub 上 3000 fork庫的代碼水平?

TAG:iOS |