Click here for the English version

日本語版はこちら

謝謝Hiraku幫我翻譯這個...我的中文不好ww,我的日文比較好,所以日文翻譯我可以自己寫。

我寫這個是給已經會用disassembler的開發者。

你應該已經decrypt了跟decompress了一個kernelcache,然後可以用一個disassembler (像IDA Pro, Hopper, etc.).

Kernelcache的keys可以在The iPhone Wiki上找到, 還有kcache tool可以decrypt跟decompress所有的IMG3 kernelcache。

基礎知識

  • 在disassembler找到的所有地址都要減掉 0x80001000
  • 如果搜尋不到 hex 字串,試著從尾部刪除幾個字元後再搜尋,但不要刪除太多以免找到重複的字串

find_OSSerializer_serialize()

  • 搜尋 OSSerializer::serialize

find_OSSymbol_getMetaClass()

  • 搜尋 OSSymbol::getMetaClass

find_calend_gettime()

  • 搜尋 90b501af82b0044601a86946fff7

find_bufattr_cpx()

  • 搜尋 _bufattr_cpx

find_clock_ops()

  • 搜尋 _clock_get_system_value
  • 找尋下方的 ldr r1, [r0, #0x8] 這行
  • 在這行右邊有類似 ; 0x8001f0e5,0x80404424 的位址
  • 點擊第二個地址(這裡範例是 0x80404424
  • 之後看到下一行的地址(這裡範例是 0x80404428

find_copyin()

  • 搜尋 _copyin

find_bx_lr()

  • 搜尋 _bufattr_cpx
  • 找到 bx lr 的地址

find_write_gadget()

  • 搜尋 0c1080e51eff2fe1

find_vm_kernel_addrperm()

  • 搜尋 _buf_kernel_addrperm_addr
  • _buf_kernel_addrperm_addr 中找到 ldr r1, [r1, #0x58]
  • 在該行右側有類似 ; 0x80456848 的地址
  • 將這個地址減掉 0x4,即為所需地址

find_kernel_pmap()

  • 搜尋 _kernel_pmap

find_flush_dcache()

  • 搜尋 hex 字串 0000a0e35e0f07ee

find_invalidate_tlb()

  • 搜尋 hex 字串 0000a0e3170f08ee4bf07ff56ff07ff51eff2f

find_task_for_pid()

  • 搜尋 hex 字串 f0b503af2de9000d84b0014691e8410800210391

find_setreuid()

  • 搜尋 hex 字串 f0b503af2de9000d87b0044602910394d1f800b04d68dff7