Frida官方手冊 - 在iOS上使用Frida

freakish發表於2017-10-20

在iOS上使用Frida

  • 在iOS裝置上,Frida支援兩種使用模式,具體使用哪種模式要看你的iOS裝置是否已經越獄。

使用場景

  1. 已越獄機器
  2. 未越獄機器

已越獄機器

  • 在越獄的環境下,是使用者許可權最大的場景,在這樣的環境下你可以很輕鬆的呼叫系統服務和基礎元件。
  • 在這篇教程中,我們來看下如何在iOS裝置上進行函式追蹤。

設定iOS裝置

  • 啟動 Cydia 然後透過 Manage -> Sources -> Edit -> Add 這個操作步驟把 https://build.frida.re 這個程式碼倉庫加入進去。然後你就可以在 Cydia 裡面找到 Frida 的安裝包了,然後你就可以把你的iOS裝置插入電腦,並可以開始使用 Frida 了,但是現在還沒有必要馬上插到電腦上。

快速的冒煙測試

  • 現在在你的主控端電腦上(Windows、macOS)執行如下命令,確保Frida可以正常工作:
  • 如果你還沒有把你的iOS裝置插入到電腦裡面(或者插到電腦但是沒有被正常識別),那應該會像下面這樣提示:
  • 如果iOS裝置已經正常連線了,那應該會看到裝置上的程式列表了,大致如下:
  • 如果到了這一步沒有問題,那就可以很開心的繼續往下走了。

跟蹤Twitter中的加密函式

  • OK,現在我們來開始搞點好玩的。在你的裝置上啟動Twitter,然後讓它持續的保持在前臺,並確保你的機器不會進入睡眠狀態。現在在你的主控端的機器上執行如下命令:
  • 目前, 很多App的加密、解密、雜湊演算法基本上都是使用 CCryptorCreate 和相關的一組加密函式。
  • 現在,開始嘗試在App裡面觸發一些網路操作,然後就應該能看到一些輸出了,比如我的輸出是下面這樣的:
  • 現在,你還可以實時的修改JavaScript指令碼,然後繼續在App裡面深挖各種功能。

沒有越獄的iOS裝置

  • 為了讓一個App能使用Frida,必須想辦法讓它載入一個 .dylib,就是一個 Gadget 模組。
  • 在這篇教程裡面我們需要配置一下 xcode 的編譯配置來讓你的App可以整合Frida。當然也可以使用相關的工具來修改一個已經編譯好的App, 比如 insert_dylib 這樣的工具。
定製你的xCode工程
  • 給iOS裝置下載最新的 FridaGadget.dylib 庫,然後給這個庫簽名:
  • 在xCode裡面開啟你的工程,然後把 Frameworks 資料夾拖動到 AppDelegate 旁邊,注意一定要拖動整個資料夾,而不是檔案,xCode會提示你 Choose options for adding these files:, 然後選擇 Copy items if needed 選項,並且勾選 Create folder references,然後點選 完成。然後選中專案,切換到 Build Phases 頁面,展開 Frameworks 資料夾,然後把 FridaGadget.dylib拖進 Link Binary With Libraries 一節,並確保 Frameworks 資料夾被加入了 Copy Bundle Resours 一節。
快速的冒煙測試
  • 在xCode裡面啟動App,然後就應該能看到下面的輸出:
  • 現在你會發現App處於掛起狀態,這是因為整合進來的Frida起作用了,Frida正在等待你來執行任何你感興趣的API 或者你可以選擇直接讓程式繼續執行。
  • 現在Frida正在等待我們操作,並且整合到App內部的Gadgetfrida-server提供的是一樣的介面,現在我們嘗試列舉一下程式列表試試:
  • 不同於 frida-server,我們只能列舉到一個程式,就是這個App本身。
  • 我們還可以使用下面的命令來看下可以執行哪些App:
  • 到目前為止還不錯, 現在如果我們呼叫 attach() 函式,目標App就會結束等待狀態,繼續執行。但是如果我們一開始使用 spawn([“re.frida.Gadget”]) 啟動App的話,我們這個時候再 attach() 的話,這個時候目標App也不會直接執行的, 除非我們主動呼叫resume(),也就是說使用前一種方式我們的程式碼執行時機晚一點,後一種方式可以在更早的時機執行我們的程式碼。
跟蹤libc函式
  • 現在假如你使用xCode啟動的程式,現在App處於掛起狀態,現在我們嘗試開始和Frida互動吧,看下面的例子:
  • 現在你可以實時的編輯JavaScript指令碼了,然後繼續在iOS的App裡面深挖。
使用模擬器
  • 現在在模擬器中進行測試,就要把上面的命令列中的 -U 替換成 -R,這樣一來底層的內部呼叫也從 get_usb_device() 變成 get_remote_device()
打造自己的工具
  • 像是 Frida,Frida-trace 等這些工具確實很有用,但是有時候你會發現你還是需要定製自己更加個性化的功能,那就最好去讀一下 FunctionsMessages 這兩章,比如當你使用到 frida.attach() 的時候,其實底層呼叫的就是 frida.get_usb_device().attach()

相關文章