Shikata Ga Nai

Private? There is no such things.

Emulator detection in Androidを訳してみた

Hello there, ('ω')ノ

 

Androidでのエミュレータ検出を。

 

記事:

 https://danielllewellyn.medium.com/emulator-detection-in-android-350efba44048

 

Androidでのエミュレータ検出

エミュレータ検出とは、アプリケーションが実際のデバイスではなく

エミュレータで実行されているかどうかを判断する能力のことを指し。

しかし、なぜこれを行いたいのか。

 

なぜ?

リバースエンジニア、ペネトレーションテスター、ハッカーは、

エミュレータ上でアプリを実行することで、アプリケーションが

何をしているのかを簡単に明らかにすることができ。

例として、アプリケーションのプライベートディレクトリ内のファイルを

見るというやや複雑な例が挙げられて。

 

 

そのため、エミュレートされたデバイス上でのアプリの実行を防ぐことで、

ペネトレーションテスターがアプリケーションを観察するのをより

困難にすることができると言えて。

 

どのようにして?

Safeというライブラリを使用してエミュレータの検出と識別を行い。

 

Safe to runはデバイス情報を表示するユーティリティがあり。

 

 Log.v("Device information", deviceInformation().toString())

 

Androidエミュレータでこのアプリケーションを実行すると、次のようになり。

 

DeviceInformation(osCheck=OsCheck(osVersion=30, manufacturer=Google, model=sdk_gphone_x86, board=goldfish_x86, bootloader=unknown, cpuAbi=[x86, armeabi-v7a, armeabi], host=abfarm-us-west1-c-0089, hardware=ranchu, device=generic_x86_arm), installOrigin=InstallOrigin(installOriginPackageName=), signatureVerification=SignatureInformation(signature=))

 

もう一つのエミュレータでダブルチェックすると、このような結果が得られ。

 

DeviceInformation(osCheck=OsCheck(osVersion=30, manufacturer=Google, model=sdk_gphone_x86_arm, board=goldfish_x86, bootloader=unknown, cpuAbi=[x86, armeabi-v7a, armeabi], host=abfarm-us-west1-c-0007, hardware=ranchu, device=generic_x86_arm), installOrigin=InstallOrigin(installOriginPackageName=), signatureVerification=SignatureInformation(signature=))

 

ここからいくつかの要点を抜き出すことができますが、特にこれを

エミュレータのチェックとして組み立てることができはずで。

Safe to runの設定を書いて。

 

SafeToRun.init(
    configure {
        osDetectionCheck(
            conditionalBuilder {
                with(bannedBootloader("unknown"))
                and(bannedDevice("generic_x86_arm"))
                and(bannedBoard("goldfish_x86"))
            }
        ).error()
    }
)
Log.v("SafeToRunResult", SafeToRun.isSafeToRun().toString())


このチェックは、次の失敗をもたらし。

 

MultipleReports(reports=[MultipleReports(reports=[SafeToRunReportFailure(failureReason=os-config-failure, failureMessage=Banned bootloader unknown == unknown)])])

 

Genymotion

もう一つの人気のあるエミュレータはGenyMotionで。

GenyMotionのクラウドに行くと、そこで実験をテストすることができて。

 

DeviceInformation(osCheck=OsCheck(osVersion=28, manufacturer=Genymotion, model=Huawei P30 Pro, board=unknown, bootloader=unknown, cpuAbi=[x86], host=68d6ec695a7c, hardware=vbox86, device=vbox86p), installOrigin=InstallOrigin(installOriginPackageName=), signatureVerification=SignatureInformation(signature=))

 

Genymotionには次のようなルールを作成でき。


osDetectionCheck(conditionalBuilder {
    with(bannedBoard("unknown"))
    and(notManufacturer("Genymotion"))
    and(bannedBootloader("unknown"))
}).error()

Bluestacks

Bluestacksもまた人気のあるエミュレータで。

インストールして実行すると、次の情報が得られて。

これは実際には少し難しいもので、この情報の残りの部分は自分たちが

ブロックしたくない実際のデバイスと非常に似ていて。

しかし、Bluestacks用のこのルールを安全に使用できて。

 

 with(bannedBootloader(OsCheckConstants.UNKNOWN))

 

簡単にするために

バージョン1.0.2以降、Safe to runはこれらのエミュレータ用の2つの

ユーティリティ関数を提供していて。


SafeToRun.init {
   osDetectionCheck(banAvdEmulator()).error()
   osDetectionCheck(banGenymotionEmulator()).error()
   osDetectionCheck(banBluestacksEmulator()).error()
}

結論

これにより、Androidでのエミュレータ検出をどのように行えるかの

アイディアが得られることを期待していて。

Safe to runはデバイス情報の確認方法を多数提供しており、

エミュレータ検出のためのパラメータを微調整することができ。

もちろん、ここでは触れていない多くのエミュレータがありますので、

それらのためのチェックを追加することも考慮して。

 

Best regards, (^^ゞ