root化済みのAndroidがなかったので、非rootの環境でSesameの鍵をぶっこ抜いてみました。
(既出ならすみません)
セサミアプリのバージョンは1.3.9にて確認
前提条件
・Android Studio(adb/jre/jarsigner/keytoolを利用)がインストールしてあること
・USBデバッグが有効にしてあること
・SESAMEの設定が済んでいること
・SESAMEにGoogleで登録した場合はパスワードを設定してあること(メールアドレスでログインします)
準備
・以下よりapktool 2.3.4 (2.4系不可) をダウンロード
https://bitbucket.org/iBotPeaches/apktool/downloads/
・AirDroid等でセサミアプリをぶっこ抜く
アプリの書き換え
以下のコマンドにてセサミアプリのdecompileを行います。
カレントディレクトリにapkファイル名のディレクトリが作成されsmaliファイル等が出力されます。
java -jar apktool_2.3.4.jar d 「apkファイルのパス」
展開されたsmaliファイルを読んでいくとˈ$2$1.smaliに以下のような、それっぽい箇所があることが分かります。
.line 2063
:cond_2
:try_start_0
new-instance v1, Ljavax/crypto/spec/SecretKeySpec;
iget-object v3, p2, Lo/イ;->ॱˎ:[B
const-string v4, "HmacSHA256"
invoke-direct {v1, v3, v4}, Ljavax/crypto/spec/SecretKeySpec;-><init>([BLjava/lang/String;)V
.line 2064
invoke-interface {v1}, Ljava/security/Key;->getAlgorithm()Ljava/lang/String;
move-result-object v3
v3に格納されたbyte arrayの要素全てを"%02X"でフォーマットし結合した後、Log.dに流し込めば良いので、以下のコードを
iget-object v3, p2, Lo/イ;->ॱˎ:[B
と
const-string v4, "HmacSHA256"
の間に挿入します。
new-instance v8, Ljava/lang/StringBuilder;
invoke-direct {v8}, Ljava/lang/StringBuilder;-><init>()V
const/4 v10, 0x0
:cond_start_for
array-length v9, v3
if-ge v10, v9, :cond_end_for
aget-byte v7, v3, v10
const/4 v9, 0x1
new-array v9, v9, [Ljava/lang/Object;
invoke-static {v7}, Ljava/lang/Byte;->valueOf(B)Ljava/lang/Byte;
move-result-object v7
const/4 v4, 0x0
aput-object v7, v9, v4
const-string v4, "%02X"
invoke-static {v4, v9}, Ljava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
move-result-object v7
invoke-virtual {v8, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
add-int/lit8 v10, v10, 0x1
goto :cond_start_for
:cond_end_for
invoke-virtual {v8}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v8
const-string v10, "###sesame password###"
invoke-static {v8, v10}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
smali書き換え後、アプリが展開されたディレクトリにて以下を実行しcompileします。
(Warningが出ますが無視で大丈夫でした)
java -jar apktool_2.3.4.jar b
compileが完了すると、distディレクトリに(未署名の)apkが生成されていますので、keytoolで適当なキーストアファイルを生成し、jarsignerで署名します。(これでインストールできるようになります)
アプリの実行 ・ 鍵取得
- 書き換え前のアプリがインストールされている場合はアンインストールを行い、先程生成したapkをAirDroid/adbなどでインストールします
- 以下のような感じでlogcatを表示させておきます
adb logcat | grep password
- アプリを起動させるとログイン画面が出るので、メールアドレスで/ログインに進み、メールアドレス・パスワードでログインして下さい
- ログインに成功すると、登録されているSesameのコントロール画面になるので、ロック・アンロック操作を行うと以下のようなログが取得できると思います
04-26 23:10:40.146 25423 25574 D FFFFFF...(256bit長の鍵): ###sesame password###
- 上記ログより鍵のメモを取り完了です
@odetarou 様のESP32用Arduinoコード
・ 設定例
// config block start
const std::string userId = "dukemon@shinjuku.tokyo"; //登録したメールアドレス
const std::string password = "FFFFFF..."; //取得した256bit長の鍵
const uint16_t lockMinAngle = 10;
const uint16_t lockMaxAngle = 270;
// 下記はoption。指定したほうがscanがskipできるため早くなる。
const std::string address = "00:11:22:AA:BB:CC"; //BD_Address
const unsigned char manufacturerDataMacData[] = {0x00,0x00,...}; //manufacturerData
// config block end
manufacturerDataMacDataについては、address、manufacturerDataMacDataに以下を設定すると検索して自動で接続してくれ、シリアルコンソールにmanufacturerDataが表示されるのでその値をコピペしました。
(LightBlue等での取得方法がいまいちよく分からなかったので・・・)
const std::string address = "";
const unsigned char manufacturerDataMacData[] = {};
・ 操作
シリアルコンソールで、115200bpsで接続
connectコマンドを送信後すぐに
lockコマンド・unlockコマンドを送信する。