HackintoshでOpenHaystackを使ってみる ESP32でAirtag互換
OpenHaystackはApple Find Myネットワークを使ってAirtagのようにBluetoothで任意の機器を追跡できるようにするプロジェクトです。
https://github.com/seemoo-lab/openhaystack
理論上はBluetoothを搭載したデバイスなら何でも追跡できますが、追跡用のカスタムファームウェアが公開されてるESP32やnRF51(BBC micro:bit)、もしくはラズパイみたいなLinuxが簡単です。
今回はESP32-WROOM-32Dを使いました。
また、OpenHaystackはMacからでないと追跡ができないという厄介な点があります。
実機は持ってないので仮想環境上のHackintoshでやりましたが、OpenHaystack上のマップがブラックアウトして何も見えなくなるバグが発生して使えませんでした。
同じように純正のMapsアプリもブラックアウトしていたので、おそらくGPU周りの仮想化の問題でしょう。
そこで、OpenHaystackの代わりにコマンドラインからその位置情報を引っ張り出せるFindMy(名前そのまま?!)を使ってマップを使わずに位置を取得します。こちらは成功しました。
https://github.com/biemster/FindMy
ちなみに、OpenHaystackのREADMEにはOpenHaystack Mobileなるものが存在すると書かれていますが今は使えないようです。
また、今のところ本物のFind myアプリに登録することもできないみたいです。
https://github.com/seemoo-lab/openhaystack/issues/39
環境
追跡する対象: ESP32-WROOM-32D
Ubuntu 22.04 5.15.0-53-generic
また Docker-OSX を利用した macOS Monterey 12.6.2
FindMy monterey branch 9369284856bbe64a918d7d8abfdbd3214433b513
下準備
まず最初にicloudにログインする必要があるみたいです。
また、Xcodeかコマンドラインツールを入れておいてください。
使用したmacOSはMontereyなので、FindmyのMontereyブランチを使いました。
1 2 | % git clone -b monterey https://github.com/biemster/FindMy % cd FindMy |
必要なライブラリ
1 2 | % pip3 install -U pip % pip3 install cryptography pyobjc requests |
キーを作成します。なぜかpython3だとエラーが出た
1 | % python generate_keys.py |
出来上がった.keysファイルを覗いてみます
1 2 3 4 | % cat xxxxxxx.keys Private key: xxxx Advertisement key: xxxx Hashed adv key: xxxx |
この中のAdvertisement keyを使います。
ESP32-WROOM-32Dのファームウェア焼き
ここをファームウェアと手順が置いてあるので参考にします。
https://github.com/seemoo-lab/openhaystack/tree/main/Firmware/ESP32
Ubuntuで行いました。
まず、公式ドキュメントを参考にESP-IDFをインストールしてください。
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/
ファームウェアを持ってきます。
1 2 | $ git clone https://github.com/seemoo-lab/openhaystack $ cd openhaystack/Firmware/ESP32 |
ビルドして、ESP32デバイスを指定して焼きます。ttyUSB0みたいな名前です。
1 2 | $ idf.py build $ ./flash_esp32.sh -p /dev/ttyUSBXXX さっきのAdvertisementkey |
追跡してみる
macに戻って、少し待ってからFindmyのrequest_reports.pyを叩きます。こっちはpython3じゃないと動きませんでした。
Keychain passwordはmacのパスワードです。
1 2 3 4 5 6 | % python3 request_reports.py Keychain password: 200 OK 1 reports received. 1 reports used. {'lat': XXX.XXXXXXX, 'lon': XXX.XXXXXXX, 'conf': 73, 'status': 0, 'timestamp': 1672904182, 'isodatetime': '2023-01-04T23:36:22', 'key': 'XXXXXXX', 'goog': 'https://maps.google.com/maps?q=XXX.XXXXXXX,XXX.XXXXXXX'} |
緯度と経度が取得できました。google mapのリンクも出てるのでそのままアクセスすればマップでどの位置にあるかわかります。
結構精度高くてびっくりしました。住宅街で周りにそんなapple製品ないと思うのですが誤差10mくらいでした。
本物のAirtagと遜色ないのではないでしょうか。

モバイルバッテリーに繋げて、ロードバイクのサドルバッグに突っ込んでおくことにします。
普通のモバイルバッテリーだとESP32みたいな低電力しか消費しないものを繋げるとオートパワーオフしてしまうのですが、このXTAR PB2Sは低電流出力モードがあるのでおすすめです。正確にはこれは18650/20700/21700のセルが2本入る充電器(モバイルバッテリー機能付き)ですが。
余談ですが、盗まれた自転車などを勝手に自分で取り返したら犯罪らしいですね。警察がまともに取り合ってくれるか怪しいので私なら絶対取り返しますけど。
最近のコメント