PONOS Advent Calendar 2020 5日目の記事です。
##はじめに
Androidチート対策の一つとして
開発者向けオプションを使用した対策を紹介します
##この記事の対象者
・アプリ開発者
・Android開発者
##開発者向けオプションが有効かの判定
チート端末では開発者向けオプションが有効になっていることが多いです。
アプリ側で開発者向けオプションが有効か無効か判定してみましょう。
android.provider.Settings.Systemクラスを使用します。
システム環境設定関連の値を取得するなど便利な機能があります。
Settings.Secure.getInt()
メソッド
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED
フィールド
を使用します。
boolean isEnable = Settings.Secure.getInt(this.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED , 0) == 1;
if(isEnable){
//開発者向けオプション 有効時の処理
//例:タイトル画面でロックして、開発者向けオプションをOFFにするように促すポップアップ表示
}else{
//開発者向けオプション 無効時の処理
}
メリット
アプリのセキュリティーレベルを上げることができる。
実装コストが軽い
デメリット
主に開発者など日常的に開発者向けオプション有効にしているユーザーにとっては迷惑
導入する場合
端末操作で開発者向けオプション有効にする方法は
「設定」アプリ内で「ビルド番号」を7回連続してタップ
と一般ユーザーはやらない操作だと思われるが、トレードオフが必要です
####USBデバッグモードの判定
フィールド名だけを変えた同様の方法でadbのチェックも可能です。
USB経由のadbが有効かどうか判定できます。
boolean isAdb = Settings.Secure.getInt(this.getContentResolver(),
Settings.Global.ADB_ENABLED , 0) == 1;
チート対策としては有効ですが
こちらも導入する場合は、トレードオフが必要です。
##まとめ
今回紹介した方法は「小を捨てて大に就く」手法で完璧なものではありません。
他にも有効なチート対策があるので合わせて検討するのがお勧めです。
チート対策
・メモリシャッフル(メモリハック対応)
・root権限チェック
・不正端末名、不正エンジン名のチェック(エミュレーター対策)
・ソースコード難読化
・リソースなどの暗号化
・サーバー側でのバリデーションチェック
・サーバー通信時の内容を暗号化
・SafetyNetの導入
などなど
今回の手法の最大のメリットは実装コストが軽いことなのですぐ実装して
・複数端末テストの結果をみて導入を検討する
・得られた情報をユーザーデータとして保存してデータ分析してから検討する
などのやり方がベターかなと考えております。
明日は、@nissy_gpさんの記事です。
お楽しみに!!