HackintoshでOpenHaystackを使ってみる ESP32でAirtag互換


追記

365円でFind my アプリに登録可能な完全Airtag互換トラッカーが買えるみたいなので、iPhoneユーザーならOpenHaystackよりこっちのほうが安上がりですね


追記2

リバースエンジニアリングがうまくいったらしく、追跡にMacOSが不要になったようです🥳 もちろんiPhoneも不要

https://github.com/biemster/FindMy

Readmeを参考にしつつ以下のようにすると位置情報を取得できました。
足りないライブラリは適宜入れてください。(Cryptoモジュールがないときはpycryptodomeを入れると動いた)

初回はApple ID, パス, 2FAキーが求められます。認証でおかしくなったらauth.jsonを消してもう一回やると直りました。


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ブランチを使いました。

必要なライブラリ

キーを作成します。なぜかpython3だとエラーが出た

出来上がった.keysファイルを覗いてみます

この中の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/

ファームウェアを持ってきます。

ビルドして、ESP32デバイスを指定して焼きます。ttyUSB0みたいな名前です。

追跡してみる

macに戻って、少し待ってからFindMyのrequest_reports.pyを叩きます。こっちはpython3じゃないと動きませんでした。
Keychain passwordはmacのパスワードです。

緯度と経度が取得できました。google mapのリンクも出てるのでそのままアクセスすればマップでどの位置にあるかわかります。

結構精度高くてびっくりしました。住宅街で周りにそんなapple製品ないと思うのですが誤差10mくらいでした。
本物のAirtagと遜色ないのではないでしょうか。

ちなみに、ESP32-DevKitCは余計なものが無駄に電気を食うので、バッテリー駆動には厳しいです。頑張れば省電力化できるらしいですが。

https://kohacraft.com/archives/202104231107.html

そもそもこの用途ではESP32では過剰スペックなので、ボタン電池駆動とかはなかなか厳しいものがありそう。


追記3 もう一個作った

FindMyレポジトリにはLenze_ST17H66Telink_TLSR825X用のファームウェアが置いてありました。

こいつらはアリエクで売られているGPSトラッカー(大嘘)に内蔵されているチップらしいです。購入してみました。

分解すると、ST17H66Bが搭載されていました。

https://github.com/biemster/FindMy/issues/14
https://github.com/biemster/FindMy/tree/main/Lenze_ST17H66

この手順通りにやってみます。

USBシリアル変換(CH340)を使ってファームウェアを焼きます。
外部から3.3Vを用意してこないと電流が足りず失敗するらしい。乾電池2本でやったらいけました(3Vでいいのかな?)

基板のP10をTX, P9をRX, GNDをGNDに繋いで(まだ3.3Vは繋がない)、コマンドを実行

少し待ってから電源を繋げます。ブザーからカリカリ音?がし始めて、大体1分ちょっとぐらいで焼けました。

sent checksum
Response is: b’#OK>>:’ で終了していたら多分成功。

このファームウェアではブザー音が鳴らなくなるっぽいです。最初壊したかと思いました。

無事に追跡できることを確認😍

ただし感度が少し悪いですね。基板むき出し状態だとそれなりですが、ケースに戻すと悪くなります;;

2024年10月時点では、この手のトラッカーのチップは大体ST17H66Tにマイナーチェンジされたらしく、そいつらはOTPチップなのでもうファームウェアを焼けないらしいです。残念

ちなみに、純正Airtagとは違い、ストーカー防止の機能はなく近くのiPhoneに通知が行くこともないですが、AirGuardなるアプリを使えばこのトラッカーを怪しいAppleトラッキングデバイスとして検出することができました。

2番目が今作ったトラッカーで、他の3つは365円の正規?中華トラッカーです。

ちなみに、全て同じ場所に置いてこれなのでやはり感度が悪い


追記4

FindMyのrequest_reports.pyで得た位置情報をマップにプロット(HTMLに出力)するプログラムをGPT-4oに書いてもらいました。パスは適宜変えてください。
移動経路のアニメーションと、ピンをクリックすると確度と日時が見られるようにしてます。また、最後のピンは赤色で表示します。

Webサーバーを立てて/var/www/htmlに保存するようにしました。

crontabで10分おきぐらいにこれが走るようにします。
プロットした位置情報を確認する前に、手動でCGIで叩いて実行するようにしました。頻繁にリクエストしてBANされても嫌だし、リアルタイムで見えたほうがいいので。

参考に、request_reports.pyのパラメーターは次のようになっていました。(request_reports.pyから抜粋)
特定のキーを指定したり、直近n時間のレポートを表示できそうですね。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です