クラサーブなICTと共にクラサーブなICTと共にモバイルやアプリ作成を主なテーマに。旅行や料理や育メンも。設定メニュFinderを長押しすると設定メニュが起動できます。本アプリはカメラアプリです。「Decoy」という名称でわかるかも知れませんが、周りにスマホがいっぱいある中で、周りに気づかれずに、状況を画像として記録することができます。アプリを起動する1スマホアプリ起動前の画面例2スマホアプリ起動後の画面例。ファインダ(右上)とシャッターアイコン(左下)およびメイン/フロントカメラ切り替えアイコン(右下)が見える。アプリを起動しても、一見、何事もなかったような画面です。起動時のスマホ画面がほとんどそのまま残ります。見えているアイコンなどにタッチしてもなにも起こりません。「DecoyCamera」の透明な画面が全体を覆っているからです(偽装モードが「半透明」のとき)。極小ファインダーで画像を確認し、シャッターアイコンをタッチして、撮影する撮影に成功すると、保存する画像ファイル名が表示されます。画像ファイル名は撮影時刻をもとに自動生成したものになります。メイン/フロントカメラ切り替えアイコンをタッチすると、メインカメラからフロントカメラに切り替わります。一度タッチするとメインカメラに戻ります。Androidの機種による動作の違いAmazon-Kindle-Fire-7:メインカメラでは撮影できません。フロントカメラに切り替えると撮影できます。シャッター音は鳴りません(FireOS6だから?)。HD-10:メインカメラでは撮影できません。フロントカメラに切り替えると撮影できます。シャッター音が鳴ります(FireOS5だから?)。GalraxyJ6+:フル動作します。シャッター音は鳴りません(海外向けスマホだから?)。R11S:フル動作します。シャッター音が鳴ります(日本向けスマホだから?)。シャッター音は別アプリ「MasterMute」で無効になります。他の作者がリリースしている同等のものでも代用できます。撮影した画像を確認するスマホのファイラー(ファイル管理アプリ)を起動して、内部ストレージ(内部共有ストレージ)の下記フォルダ(ディレクトリ)を確認します。(内部ストレージ)/DCIM/decoyステップ2で保存したファイル名のファイルが確認できるはずです。アプリを終了する「BLEスイッチ」との連携GitHubに公開したAndroidアプリ「BleSwitch」について(使い方)を参照してください。リリース用APKファイルリリース用にビルドした署名付きAPKファイルを本ブログ配下に置いています。androidアプリ「BleSwitch」リリース用APKファイルandroidアプリ「DecoyCamera」リリース用APKファイルandroidアプリ「MasterMute」リリース用APKファイルGitHubの公開コードをローカル開発環境(AndroidStudio3.x)にクローンしてきてビルドしても得られるものですが、そうした環境をお持ちでない方のために用意しました。興味のある方はいろいろ試してみてください。関連する記事・ページGitHubに公開したAndroidアプリ「DecoyCamera」について(概要)GitHubに公開したAndroidアプリ「DecoyCamera」について(使い方)GitHubに公開したAndroidアプリ「DecoyCamera」について(設定メニュ)GitHubに公開したAndroidアプリ「DecoyCamera」について(技術解説)GitHubに公開したAndroidアプリ「BleSwitch」について(概要)GitHubに公開したAndroidアプリ「BleSwitch」について(使い方)GitHubに公開したAndroidアプリ「BleSwitch」について(技術解説)お世話になったリンクandroid-Camera2Basic以上です。本アプリは、カメラアプリです。Camera2APIという最新のAPIを導入しています。現時点では、旧来のCameraAPIと同じ使い方をしています。フェース認識等の先進技術は使っていません。「DecoyCamera」というアプリ名にしていますが、これには理由があります。「Decoy」とは、木製のカモ(人形)のことで、狩猟等で使います。「Decoy」があまりに精巧にできているので、本物の獲物(カモ)が寄ってきてくれるのです。狩猟者が設置した「Decoy」のそばに来た獲物は十分な射程距離に入っているので助かります。日本語では「おとり」になりますね。Investigate)の意味にも使われています。「DecoyCamera」は、「Decoy」にちなんで、たくさんの(カメラ機能付き)スマホに紛れているスマホアプリです。後述しますが、狩猟者の代わりに撮影者が離れた場所から撮影タイミングを狙うこともできます。今年、車載カメラ(ドライブレコーダー)が売れました現代人は、今ではいつでもどこでもスマホに囲まれて生活しています。これまでカメラのない空間はバスルーム位でしたが、そこにスマホを持ったひとがいれば、それも例外ではなくなりつつあります。2019年になって、車につける車載カメラ(ドライブレコーダーともいいます)が大変な売れ行きになっているそうです。日本では滅多にないことですが、非常に稀に「乱暴運転」や「事故」に遭遇します。自身の車が事故を起こしたり、巻き込まれたりすることもあります。いった場合に、車載カメラ(ドライブレコーダー)できちんと状況を記録できていると、とても助かります(逆に自分に不利になることもありますが)テレビ等で「乱暴運転」の非道さが連日報道された結果、その状況を記録して証拠提示もできる非常に役立つものとして車載カメラ(ドライブレコーダー)が注目されました。「DecoyCamera」は、周りに気づかれずに、状況を画像として記録することができます。車載カメラの場合は、エンジン始動からエンジン停止まで、自動で動作して状況を逐一記録していってくれます。スマホの電源を入れてから電源を落とすまで、内蔵カメラを起動して逐一記録することはできませんし、その必要もありません。運転中と比べてそんなに突然に証拠となる画像が必要になる場面はそうそうないからです。不審物や不審者や不信な状況について、あからさまにカメラを向けることなく、その状況を撮影することが「DecoyCamera」でできます。香港のデモに遭遇したら画像処理によりフェース認識技術は現在中国が世界一だとか。基本技術は日本発のようですが、画像取得に使うカメラは街の到るところにあってその数も半端ないとか。香港のデモの参加者は皆一様にマスクをしています。マスクをしていればフェース認識できないか、その能力が発揮できなくなるからでしょうね。日本人が旅行者としてそうしたデモに遭遇したとすると、何が起こるか分かりません。デモのそばにいる人たちを「十把一絡げ」にして拘束するかも知れませんよね。「目には目を、歯には歯を」で、当局の行動を「DecoyCamera」等のスマホアプリを使って逐一証拠として残しておきましょう。中国でフェース認識に使われるカメラの数がどれだけ膨大であっても、世界の人たちが使っているスマホの数に比べれば、もののかずにもなりませんからね。スパイカメラとは一味違う世の中には、探偵などのプロが使うスパイカメラというものがあります。したものはほぼ全てカモフラージュしたカメラです。してとてもカメラには見えないもの。ペン、ACアダプター、壁掛け、腕時計、スーツのボタン、ぬいぐるみの眼球、等々。米国のドラマ「リベンジ」でもそういう小道具が使われていましたね。「DecoyCamera」はそうしたものと一味も二味も違います。スパイカメラはスマホ搭載のカメラに比べて性能が数段落ちます。「DecoyCamera」の場合、最新スマホにインストールするだけです。(なんて言っても、開発環境を持っていないのでiOSには対応していません)スパイカメラは専用品で、証拠取得以外の使い道がありませんスパイカメラは専用品すぎて、使うひとにソーシャルエンジニアリング能力が必要です。逆にいうとプロが使ってこその仕様です。「DecoyCamera」の場合、いつでもどこでもスマホをいじれる時間と場所であれば、だれでも問題なく使いこなせます。日本向けスマホの場合シャッター音が鳴る場合があるので注意してください(*1)スパイカメラはカスタマイズできません。「DecoyCamera」の場合、公開コードを改変すれば無限にカスタマイズ可能です「DecoyCamera」の場合、「BLEスイッチ」と連動して離れた場所からアプリを起動することができます*1:「DecoyCamera」が使っているCamera2APIには単独では音声を鳴らす機能がありません。日本向けスマホの場合などで、自動でシャッター音が鳴る仕組みになっているようです。海外向けスマホにインストールした場合、シャッター音は鳴りません。実は、公開コードにおいても、オプションとしてシャッター音を実装しようとしましたが、うまくいきませんでした。公開コードの改変について本アプリのコードをGitHubにて公開しています。「DecoyCamera」公開コード開発環境はAndroidStudioで言語はJavaです。昔と違ってプログラミングの勉強が非常にやりやすくなっています。それなりに動作するものを使って、いろいろ試してみることが一番勉強になると、管理人は考えています。公開コードを取得してちょっと修正ながら、より素晴らしい、高機能な「Decoy」なカメラにしてみてください。ボタンをリモコンにしてみたiBeaconとは以上です。adminGitHubに公開したAndroidアプリ「BleSwitch」について(技術解説)撮影タイミングは実機テストに使った端末に合わせて調整しています。Android9.x(実機はGalaxyJ6+)ではLOW_LATENCYモードで100ms毎スキャンします。それ以外のバージョンではLOW_ENERGYモードで起動します。2000msでスキャン3000ms休止のくり返しになります。実機ではスキャンできなかったり一回のボタン操作にもかかわらず2回以上信号を受けてスマホアプリを起動してしまうことがありました。GitHubに公開したAndroidアプリ「BleSwitch」について(使い方)ここに、こう書いていますが、少し違っていました。スマホ(受信側)のBLEスキャン間隔はというと、以下にようになっています。低遅延モードLOW_LATENCY:常時スキャン低消費電力モードLOW_ENERGY:400msスキャン後4600ms休止、その繰り返しバランスモードBALANCE:2000msスキャン後3000ms休止、その繰り返し一方、BLEビーコンデバイス(発信側)の送信間隔はどうでしょう。標準ビーコンで100ms、「Bluetoothリモートシャッター」は34msのようです(実測した結果)。それではPochiruEcoはというと、こちらは特殊で標準ビーコンの規格を満たしていないようです。常時発信するデバイスではないのでそれでいいんでしょうね。ボタンが押されると800ms間隔で送信しつづけ、全体で20秒弱で停止します。上に紹介したスキャンモードのうち、低消費電力モードの場合5秒間のうち400msしかスキャンしないので、タイミングによっては、800ms間隔の送信を取りこぼす可能性があるようです。これで「実機ではスキャンできなかったり」の動作が説明できます。「一回のボタン操作にもかかわらず2回以上信号を受けてスマホアプリを起動してしまうこと」これについては、もう少し複雑な事情がありそうです。BLEのAPIライブラリの違いなのか、BLEビーコンデバイスとの相性の違いなのか不明ですが、BLEスキャンでデバイス検出できたあとの動作に微妙な違いが現れました。};の部分の話になります。スキャン検出後、Gattに接続要求して、接続したら切断して、切断したらクローズして、というようなことをやって、BLEビーコンの発信を中断させるようにしています。上記コードには「接続したら切断して、切断したらクローズして」の部分が見えると思います。ところが、実機によっては(もしかするとSDKバージョンによっては、かもですが)これがうまく動作しないものがあります。「Gattに接続要求して、接続したら切断して」の部分で接続時のコールバックがなく、いきなり切断時のコールバックになってしまいます。結局切断してクローズするのですから「どっちでもいいじゃない!」となりそうですが、このとき結構なタイムラグがあり、それがスキャン時の複数回検出に繋がっているのかと考えています。BLEビーコンが発信を中断してくれさえすれば、5秒間隔位でボタンを押してもその都度スマホアプリが起動できますが、中断しないと、「一回のボタン操作にもかかわらず2回以上信号を受けてスマホアプリを起動してしまうこと」になってしまいます。Android9.xの実機ではうまく動作しますが、Android7.xの実機では上記の通りの現象が出ています。このあたりは、BLEビーコンの動作仕様といかに合わせるかの問題になるので、あまり厳密に考えても意味なさそうです。ボタン操作から20秒弱で発信停止するのあれば、最初からGatt接続しないで、20秒まってからスキャン再開すればよさそうです。その間ボタン操作は効かなくなるので、そうしたやりかたで要件を満足させられるのかチェックする必要はありますが。Android9.xの実機(GalaxyJ6+)ではうまく動作しており、ボタン操作の取りこぼしなく、操作後1秒以内にカメラアプリが起動して撮影できることを確認しています。「THETAVプラグインで市販のBLEボタンをリモコンにしてみた」はAndroid7.x???参考にさせていただいたリンクに「THETAVプラグインで市販のBLEボタンをリモコンにしてみた」がありますが、開発環境で取得できるログ(LogCat)を比較してみると、どうも、Android7.1.1搭載の実機と同じ動きをするようです。上のコードでいうと「CONNECTED」にコールバックしないでいきなり「DISCONNECTED」になりますね。参考記事の中でもある程度インターバル(記事中では8秒の設定)を置かないと連続撮影してしまうとか。BLEの機器なのかソフトなのかの微妙な違いが動作に影響するようです。ボタンをリモコンにしてみたiBeaconとは以上です。adminGitHubに公開したAndroidアプリ「BleSwitch」について(概要)ざっくりと言って何するものか?アンドロイド版BLEスイッチという、GitHubに公開しているAndroidアプリ(コード)について、解説します。https://github.com/krasavkana/android-ble-switchこのアプリは、BLEビーコンデバイスをAndroidアプリの操作に使えるようにする橋渡しアプリです。「Bluetoothリモートシャッター」というのが100均で売っています。iPhoneやAndroidデバイスの内蔵カメラを起動しておけば、このデバイスを使って離れた場所からシャッターを操作することができます。くり返しになりますが、本アプリは、【BLEビーコンデバイス】を【Androidアプリの操作】に使えるようにする【橋渡しアプリ】です。デバイスのボタン操作をAndroidアプリのシャッター操作に橋渡しするとなります。100均デバイスとの違いは?これ、実はこの問い自体がちょっと違います。世の中のほとんどすべてのデバイスについて言えますが、デバイス単体で動作するものはありません。デバイスと連携して動作するコード(アプリ、ソフトウエア)が必要です。デバイス+橋渡しアプリで動作する100均デバイスの場合は、デバイスとペアリングしてくれるサービスが【橋渡しアプリ】として機能して100均デバイスのボタン操作をAndroidアプリ(内蔵カメラアプリ)に橋渡ししてくれます。本アプリの対応デバイスは?本アプリの場合、アプリ自体は【橋渡しアプリ】なので、一緒に動作させる【BLEビーコンデバイス】を考える必要があります。コード公開にあたり実機テストをしています。その際次の【BLEビーコンデバイス】を使って動作確認しています。本アプリのこととして動作します。100均デバイス+橋渡しアプリとの違いは?漸く、元の話題に戻ってきました。100均デバイス+橋渡しアプリとの違いは、下記3点です。ペアリング不要Androidデバイス内のアプリを起動するビーコン(BLE)を認識できるペアリング不要ペアリングする場合、デバイスとペアリング認証する必要があり、同時に複数のAndroidアプリを同時に動作させることができません。これはメリットにもなりデメリットにもなります。想定するものに依って変わります。ペアリングしていない場合、スマホアプリからはデバイス個体を見分けることができないため、すぐ近くで同じ種類の100均デバイスが使われるとそれに反応してしまうという困ったことが起きる可能性があります。逆に、ペアリングしている場合、ひとつのデバイスで複数台のスマホアプリを同時に処理させることができません。本アプリの場合、複数台のスマホアプリを同時に起動できます。複数台のスマホ内蔵カメラを同時に起動することができます。シャッターのタイミングは、スマホ内蔵カメラをハンドリングするカメラアプリが担当するので何とも言えませんが、ほぼ同時に処理することができます。同じ被写体に向かって前後左右上下の6台のスマホを用意すれば、同時に6方向からの画像を撮影することが可能になります。映画「マトリックス」のような一瞬を捉えた連続画像ができそうです。#ひとりでスマホを6台用意するのは大変でしょうね。できれば同じもの6台にした方がタイミング合わせのためにもいいですね。「Bluetoothリモートシャッター」の場合にできる操作は、離れた場所からシャッターを切る、でした。これには事前にスマホの内蔵カメラアプリを起動しておくなどの操作が必要です。本アプリの場合、そうした準備は不要で、スマホアプリ自体を起動することができます。公開したコードサンプルでは、拙作のカメラアプリを起動しています。起動されたカメラアプリは起動したらすぐにシャッターを切ります。暗い場所やフォーカスしにくい被写体などはピンぼけになるかも知れませんけどね。本アプリでは、ペアリングは行わず、ビーコンの送信(アドバタイジング)をスキャンします。デバイス名やデバイスアドレス、サービスUUID等のパラメータを指定することにより、周囲にある複数のビーコンから指示を待つべきビーコンを絞ります。デバイス個体を特定するパラメータ指定がなければ、その時初めて遭遇したBLEビーコンに反応することになります。した使い方は想定していませんが、それはそれで使い道があるかも知れません。本アプリの公開コードで使用した【BLEビーコンデバイス】である「Pochiru(Eco)」の場合、標準的なビーコン(iBeaconやEdyStoneなど)の動作仕様とはかなり違った動きをするようです。標準ビーコンは100ms毎に発信するのに比べ、このデバイスは800ms毎の発信であるとか。標準ビーコンは電池が切れるまで何か月でも連続発信するけど、このデバイスはボタンをONして20秒弱しか発信しないだとか。標準ビーコンは電池が入って切れるまで動作するので、元々発信ボタンが必要ないですよね。本アプリでは、こうした標準ビーコンの動作仕様を想定していません。コードを書き換えればそういうものも認識させることができます。認識させることができれば、お店に設置してある標準ビーコンを察知してスマホ等に通知するとか、お年寄りや子供にポータブルな標準ビーコンを携帯してもらっておいて、近づいたり遠ざかったりしたらスマホに通知するとか、ができるようになるでしょう。ボタンをリモコンにしてみたiBeaconとは以上です。4.2.x以下のAndroid端末のAndroid全端末に占める割合は約50%です。50%のAndroid端末の台数は膨大な数になります。数億台?そしてこれら50%の端末に潜在する可能性のある脆弱性(*1)について実験してみました。結果は、手近にあったAndroid端末4台中2台に脆弱性が残っており、「端末に保存されている画像入手は当たり前。アプリに対するパーミッションによっては端末内蔵カメラによるスナップ撮影も可能」という結果になりました。4.2.x(APIは17)以下のOSを搭載するAndroid端末2.WebViewクラスを使用したアプリをインストールして起動3.インタネットへのアクセスを許可これだけで、端末内に保存されている写真や音声やSMSを抜かれる可能性があります。4.カメラ、マイク、連絡先、SMSなどへのアクセスを許可などしていると、場合によっては内蔵カメラで写真を撮られたり、マイクで録音されたり、SMS送信されたりしてしまう可能性があります。上記2のWebViewクラスを使用したアプリが、「悪意のある」アプリの場合本当にやばいと思われます実験内容1.アプリ作成Java言語でWebViewクラスを宣言した50行ほどのコードにインタネットアクセス許可をつけただけのスマホアプリ(vulnWebView.apk)を作成。侵入テスト用Frameworkである「Metasploit」から脆弱性をついたExploitを使用して、Android端末上で上記スマホアプリが実行されるのを待機3.端末上でアプリ実行Android端末に上記スマホアプリをインストールして実行。脆弱性の条件が合って接続できれば、画像や音声等のデータを入手してみるさらに端末内蔵のカメラでスナップ撮影。Linux3(CD-ROM)でインストール後UpdateおよびUpgrade完了。4.11.3-2015062101(msfconsoleのバージョン表示から)・ターゲット端末と同じLANに接続WebViewクラス使用アプリの作成GitHubに実験用のJavaソース(というよりproject)が公開されており、それを使って実験してみました。そのままではうまく動作せず、下記に従いコードを変更しました。変更点1:LoadUrlの呼び出しではPORTを陽に指定する必要があること変更点2:処理途中にRedirectがありその場合にWebViewではなく通常のブラウザが呼ばれてしまいうまく動作しない。それを防ぐコードを追加したこと変更点3:侵入端末への接続情報、すなわちIPアドレス、ポート番号、およびURIをアプリから指定できるようにしてあります。J(os4.1.1):侵入NG(条件のうちvuln_testがFalseで合わないらしい)・SonyTabletS(os4.0.3):侵入NG(ただし条件は合うようだ)・GalaxyS3Progre(os4.1.2):侵入OK。・ArrowsNX_F_01F(os4.2.2):侵入OK。カメラへのアクセス許可があってもスナップ撮影は不可。以下は、GalaxyS3Progreに侵入テストしたときのコンソール画面です。pwd/data/data実験で使ったAPKファイル掲載不要かもしれませんが、自分でも実験したり侵入テストしてみたりしたい方のために、今回作成したWebView使用アプリのAPKファイルを置いておきます。IPアドレス、ポート、サーバのURIを変更できる設計にしましたので、ここで実験したことが再現できると思います。LAN等閉鎖されたところで実験してください。インタネットアクセスのみのVunWebView.apkインタネットアクセスの他カメラ、マイク、カレンダ、連絡先、SMSへのアクセスを許可するVunWebView.apk因みに、GooglePlayに出している(*2)Androidアプリが数点あるのですが、そのうち1点がWebViewクラスを使用しています。心配になったので、LoadUrlメソッドで呼び出しているURIに、ここで使った侵入ホストを指定して実験してみましたが、脆弱性がつけなかったのか侵入できませんでした。理由はaddJavascriptInterfaceメソッドを使っていないからだと思っています。*2:実はつい最近ですが、GooglePlayから削除されていることが判明しました。Googleからデベロッパ宛にPolicy変更等の通知が来るのですが、暫くの間見れないことがあって、その間に期限切れになり、結果「削除」になってしまったようです。他の脆弱性について今回の実験で使用した脆弱性の他にも、さまざまな脆弱性が発見されており、アンチウイルスのメーカ等と侵入者とのいたちごっこが続いています。・重要な情報は端末に残さないか暗号化しておく、などができ得る対策ですが、十分に気をつけましょう。Pay)を試してきました。views当たり屋の今昔物語。Pay)を試してきました。