Open8

[学習] Advanced Apple Debugging & Reverse Engineering

saharasahara

1. Getting Stated

動作環境:macOS11.6.1 Big Sur, Virtual Box Version 6.1.28 r147628 (Qt5.6.3)

安全にSIPを行う、Virtual Box上で

いきなりSIPを求められたので、Virtual BoxでmacOSの環境を用意するところから始めることにする。

https://qiita.com/minnsou/items/54491c01ac95a245b010

の「Catalina」を 「Big Sur」に読み替えて手順を進める。

https://www.virtualbox.org/wiki/Downloads

から、Virtural Box本体、Extension Packを順にダウンロードし、インストールする。

並行して、Mac App Store経由でmacOS Big Sur インストーラーのダウンロード。

…結局うまくいかず、Catalinaで同様に試すも、仮想マシンの起動に失敗する。

仮想マシン"macOS_Catalina"のセッションを開けませんでした。

The virtual machine 'macOS_Catalina' has terminated unexpectedly during startup with exit code 1 (0x1).

終了コード : NS_ERROR_FAILURE (0x80004005)
コンポーネント: MachineWrap
インターフェース: IMachine {85632c68-b5bb-4316-a900-5eb28d3413df}

Virtual Box本体をアンインストーラーでアンインストールしてインストールし直し、ホストOS側のMac本体を再起動した上で、起動をやり直したら何とかCatalinaの起動に成功した。

Virtual Box Window

Virtual Box上のmacOS VMでRecovery modeで起動する

SIPを無効にするには、一旦リカバリーモードで起動する必要がある。

しかし、Virtual Box上のmacOSを再起動して、アップルマークが出るまで⌘ + Rを押し続けても、リカバリーモードで起動することができなかった。

リカバリーモードで起動する手立てを探すうちに、その名も「
macos-virtualbox-vm」なるレポジトリのissueコメントで紹介されていた方法が有効だった。

macOS VM 内のターミナルで、次のコマンドを実行する:

sudo nvram recovery-boot-mode=unused && sudo shutdown -r now

すると、VMが再起動してリカバリーモードで起動する:

クリップボード・ファイルをホストOSとゲストOSで共有する

Virtual Boxで設定したいVMを選択し、 設定 > 一般 > 高度 とすると、[クリップボードの共有]と[ドラッグ&ドロップ]という設定項目があるので、無効(デフォルト)・ホストOSからゲストOS・ゲストOSからホストOS・双方向のなかから一つ選択する。

ゲストOS上にXcodeをダウンロードするのも、ホストOSからやったほうが絶対速かった…

その他、やって気づいたこと

  • メモリは16GiBでは動作が遅くなるので、32GiBに設定したら安定してVMが動くようになった。

インストーラーを削除する

https://apple.stackexchange.com/a/346275

参考

https://github.com/geerlingguy/macos-virtualbox-vm

余談

macOS Montrayから、Virtualization frameworkを使って、macOSとLinuxのVMをmacOSがホストできるようになったらしい。要調査。

Virtualization | Apple Developer Documentation

The Virtualization framework provides high-level APIs for creating and managing virtual machines (VM) on Apple silicon and Intel-based Mac computers. Use this framework to boot and run macOS or Linux-based operating systems in custom environments that you define.

saharasahara

ターミナルのXcode stderrタブで、ttyコマンドを打って入力を受け付けるようにした。

saharasahara

Chaper3 Attaching with LLDB

プロセスをアタッチするyet another way

process -f <executable path>でアタッチ先の実行ファイルを指定し、process launchでプロセスを起動する方法をとったときのみ、stderrへの出力が自動的にterminal.appに出力されるようになる。他のアタッチ方法では、手動で割り当てないといけない。

process launch したときに stdoutの出力先を変更する方法

process launch -o file.txtとすると、stdoutの出力先がstdoutになります。

process launchしたときにstdinの入力元を変更する方法

process launch -i foo.txtとすると、stdinの入力元がfoo.txtになります。

saharasahara

共有フォルダの機能はゲストOSがmacOS10.15 Catalinaの場合はサポートされていないらしい。

saharasahara

(lldb) breakpoint set -n "-[UIViewController viewDidLoad]" -C "po $arg1" -G1

-C "po $arg1" : UIViewControllerのインスタンスを出力
-G1 : ブレークポイントで止まらず実行を再開する

saharasahara

NSObject由来のオブジェクトの情報をpoコマンドでを出力する際は、debugDescription > description の順に参照される。

print関数の場合は、debugDescriptionの定義の有無に関わらずdescriptionプロパティが参照される。