[学習] Advanced Apple Debugging & Reverse Engineering
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の環境を用意するところから始めることにする。
の「Catalina」を 「Big Sur」に読み替えて手順を進める。
から、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上の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が動くようになった。
インストーラーを削除する
参考
余談
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.
ターミナルのXcode stderrタブで、tty
コマンドを打って入力を受け付けるようにした。
第二章 Help & Apropos
-
help
コマンド -
apropos
コマンドで、case-insensitiveな検索
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
になります。
共有フォルダの機能はゲストOSがmacOS10.15 Catalinaの場合はサポートされていないらしい。
(lldb) breakpoint set -n "-[UIViewController viewDidLoad]" -C "po $arg1" -G1
-C "po $arg1"
: UIViewControllerのインスタンスを出力
-G1
: ブレークポイントで止まらず実行を再開する
NSObject
由来のオブジェクトの情報をpo
コマンドでを出力する際は、debugDescription
> description
の順に参照される。
print
関数の場合は、debugDescription
の定義の有無に関わらずdescription
プロパティが参照される。
Reference