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, (^^ゞ