Web開発
あなたの「アプリ」はウェブページでよかったはず(なので修正しました)
Your 'App' Could Have Been a Webpage (so I fixed it for you) (danq.me)
要約
著者は、子供の演劇学校のイベント情報にアクセスするために「Travelbound」というアプリのインストールを求められたことに不満を感じています。このアプリは、テキスト、画像、PDFリンクのみを提供しており、トラッキングや広告といったウェブページよりも劣る機能しか持っていません。そこで著者は、アプリのネットワークトラフィックを傍受し、そのデータを基に、より軽量で機能的なウェブページを再構築しました。
全文翻訳
これはなぜ「アプリ」なのですか?
この夏、子供たちの演劇学校がディズニーランドでショーを行います。私たちは皆とても興奮していますが、少なくとも私の興奮は、旅程、旅行手配、宿泊施設の詳細にアクセスするために「Travelbound」アプリをインストールするように言われたときに少し抑えられました。そんなノイズはもうたくさんだ。
これはウェブページであるべきでした。
なぜ、(より小さく、より速く、より普遍的にアクセス可能な)文書であるはずのものを伝えるためだけに、(また一つ)ひどいアプリをインストールさせたいのですか?
私は全く誇張していません。
このアプリは文字通りテキスト、画像、PDFファイルへのリンクであり、Web経由で配信されます。
この「アプリ」がウェブページにはない、たった2つのことしかしていないように見えます。そして、それらは両方ともアンチ機能です。
1. 開発者に、Googleアカウントに関連付けられたトラッキングデータを報告します。
2. 同じ代理店が主催する他の旅行の広告(彼らは「インスピレーション」と呼んでいます)を表示します。
それの全てを、くそくらえ。
ウェブページは、はるかに優れていたでしょう。
このアプリとは異なり、ウェブページは...
1 コピー&ペースト可能
印刷可能
保存可能
ブックマーク可能
検索可能
ほぼすべてのデバイスで使用可能
(潜在的に)よりアクセスしやすい
私は十分にイライラしています...
このアプリを「修正」します。
ビールをホールド。
アプリのトラフィックを傍受する
最後にAndroidアプリをネットワークトラフィックからリバースエンジニアリングしてからしばらく経ちましたので、最善の方法を再確認する必要がありました。
私が最終的にやったことは次のとおりです。
Android Studioの仮想デバイスマネージャーで新しい仮想デバイスを作成しました。
adb shellが機能することを確認し、rootAVDを使用してルート化しました。
./rootAVD.sh system-images/android-33/google_apis_playstore/x86_64/ramdisk.img.2
コールドブートを実行し、Magiskを実行し、要求するすべてのアプリにsuアクセスを自動的に付与するように設定を調整しました。
3
あなたのトラフィックはすべて私のものです。
この時点で、WiresharkやTCPdumpを実行するのと同じです。
HTTP Toolkitを実行し、AVDトラフィックをインターセプトするように指示しました。
(偽の)VPNプロバイダーをインストールし、電話のトラフィックをプロキシ経由でルーティングしました。
4
PlayストアからTravelboundアプリをインストールしました。
HTTP Toolkitを、Travelboundアプリのみをプロキシするように設定しました(ノイズを減らし、信号を増やします)。
数分の実験で、アプリがユーザー名とパスワードを連結し、次の形式のURLで使用していることを発見しました。
https://travelbound.api.vamoos.com/api/itineraries/{username}-{password}
これはJSONの山を返します。これを少し解釈すると、アプリが「表示する」すべてのコンテンツを表していることがわかります。例えば、次のようなものがあります。
旅程の各区間を含む配列。
表示する「インスピレーション」広告(広告)の配列。
他のセクションで参照されているすべてのファイル(画像など)を含む、相互参照された配列など。
彼らは明らかにすでにHTMLコードを生成しています...なので、再び尋ねます。なぜこれはウェブページではないのですか?
少し実験したところ、S3の画像URLの有効期限が比較的短く設定されていることがわかりました。そのため、コンテンツが変更されていなくても、JSONは定期的に再取得する必要があります。
6
それをより良いものに変える
これで、より良いものを作るために必要なすべてが揃いました。
私はCronスケジュールで実行されるRubyスクリプトを書き、最新のJSONを取得してHTMLページを構築しました。
私は「インスピレーション」(データスキーマでは「overlayRows」)を完全にスキップし、次のみをリストすることを選択しました。
旅程の項目と、インスピレーションや旅程で参照されていないすべてのファイル(参照されていないPDFダウンロードリンクを収集する怠惰な方法)。
その後、パスワードで保護されたページをホストしました。
それは、最初にツアーグループに与えられたものと同じパスワードです。
後でスキーマの要素が見つかった場合にチェックできるように、使用した生のJSONを<details>要素に含めました。
私のウェブページは、情報から「借りている」アプリほど「見栄え」は良くありません。
しかし、それはサイズの数分の一であり、ウェブの標準的な機能をすべて無料で利用できます。
「アプリ」を好む人もいますが、それは...まあ、結構だと思います。
しかし、特にこのアプリのように、配信されるコンテンツがすでにHTMLで記述されており、HTTP経由で配信されている場合、それらはウェブページであるべきですよね?
「アプリ文化」でどうしてこうなったのか理解できません!
ソフトウェア企業は、単にウェブに直接公開するよりも、より少ない人々に、より少ない機能で7つのHTMLコンテンツを配信するために、自分たちの生活をより困難に(そしてより高価に:大手アプリストアへの展開は無料ではありません!)することに満足しています。
「アプリ」が絶対的に適切な媒体であるタスクは(いくつか)あります。
Travelboundはその一つではありません。
しかし、少なくとも私(そして私が共有した他のグループメンバー)は、このコンテンツにどのようにアクセスするかを選択できるようになりました。
トラッキングと広告を備えた43MBのアプリ(追加コンテンツのダウンロードが完了すると124MBに膨れ上がります)...または、より多くの機能を提供し、より多くのデバイスで動作する0.05MBのウェブページ(オプションで追加の35MBの画像付き)のいずれかです。
どちらを使用するかはわかっています!
脚注
1
そしてこれらは、誰もが支持できる機能にすぎません。
最終的にアプリの代わりに使用するために作成したウェブページには、トラッキングコードを削除し、広告を表示しないなど、ユーザーフレンドリー/開発者には敵対的な機能もいくつかあります。
2
証明書ピニングを使用するアプリケーションに、中間者プロキシサーバーを信頼させるために、デバイスをルート化する必要があります。これがないと、一部のアプリケーション(私がリバースエンジニアリングしたかったものを含む)は、自己署名TLS証明書を無効と認識し、通信を拒否します。
3
Magiskでこの設定を変更しないと、HTTP Toolkitはsuアクセスを要求しますが、応答を待たずに、私が許可する前に特権なしで実行されることに気づきました。
4
Androidのセキュリティ上の考慮事項により、インストールされたルートCA証明書を手動でインストールする必要がありましたが、指示は「うまくいきました」。
5
ユーザー名とパスワードはツアーグループ全体で共有されます。彼らは、資格情報の一部が漏洩した場合の計画を持っていないと推測しますか?あるいは、彼らが保持しているすべてのデータは低感度であるため、漏洩しても問題ないと考えているのかもしれません...その場合、私の元のポイントに戻ります。なぜそもそもウェブページではなかったのですか?
6
あるいは、画像はローカルにキャッシュする必要があります。これは、アプリが最も肥大化した方法で行っていることのように思えます。
7
そして、多くの場合、アクセシビリティが悪化します。
このアプリのアクセシビリティは監査していませんが、単純でシンプルなウェブバージョンよりもアクセシビリティ技術を使用して使用するのが難しいことを示唆する点があります。
× × × ×