아 에뮬 디텍터 우회 멘붕 오네요 진짜..
쿠쿠닭스
2
5660
2020.03.26 15:30
package lib.bluegames.com.clubaudition.devicechecker;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import androidx.core.content.ContextCompat;
import com.unity3d.player.UnityPlayer;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@TargetApi(14)
public final class DeviceChecker {
private static final String[] ANDY_FILES = {"fstab.andy", "ueventd.andy.rc"};
private static final String[] DEVICE_IDS = {"000000000000000", "e21833235b6eef10", "012345678912345"};
private static final String[] GENY_FILES = {"/dev/socket/genyd", "/dev/socket/baseband_genyd"};
private static final String[] IMSI_IDS = {"310260000000000"};
private static final String IP = "10.0.2.15";
private static final String LOG_TAG = "BlueLIB";
private static final int MIN_PROPERTIES_THRESHOLD = 5;
private static final String[] NOX_FILES = {"fstab.nox", "init.nox.rc", "ueventd.nox.rc"};
private static final String[] PHONE_NUMBERS = {"15555215554", "15555215556", "15555215558", "15555215560", "15555215562", "15555215564", "15555215566", "15555215568", "15555215570", "15555215572", "15555215574", "15555215576", "15555215578", "15555215580", "15555215582", "15555215584"};
private static final String[] PIPES = {"/dev/socket/qemud", "/dev/qemu_pipe"};
private static final Property[] PROPERTIES = {new Property("init.svc.qemud", null), new Property("init.svc.qemu-props", null), new Property("qemu.hw.mainkeys", null), new Property("qemu.sf.fake_camera", null), new Property("qemu.sf.lcd_density", null), new Property("ro.bootloader", "unknown"), new Property("ro.bootmode", "unknown"), new Property("ro.hardware", "goldfish"), new Property("ro.kernel.android.qemud", null), new Property("ro.kernel.qemu.gles", null), new Property("ro.kernel.qemu", "1"), new Property("ro.product.device", "generic"), new Property("ro.product.model", "sdk"), new Property("ro.product.name", "sdk"), new Property("ro.serialno", null)};
private static final String[] QEMU_DRIVERS = {"goldfish"};
private static final String[] X86_FILES = {"ueventd.android_x86.rc", "x86.prop", "ueventd.ttVM_x86.rc", "init.ttVM_x86.rc", "fstab.ttVM_x86", "fstab.vbox86", "init.vbox86.rc", "ueventd.vbox86.rc"};
private static DeviceChecker instance;
@SuppressLint({"StaticFieldLeak"})
private static DeviceChecker mEmulatorDetector;
private boolean isCheckPackage = true;
private boolean isDebug = false;
private boolean isTelephony = false;
private final Context mContext = UnityPlayer.currentActivity.getApplicationContext();
private List<String> mListPackageName = new ArrayList();
private String mObjectName;
private DeviceChecker() {
this.mListPackageName.add("com.google.android.launcher.layouts.genymotion");
this.mListPackageName.add("com.bluestacks");
this.mListPackageName.add("com.bignox.app");
}
/* access modifiers changed from: private */
public void OnCallBackForUnityMsg(String str, String str2) {
UnityPlayer.UnitySendMessage(this.mObjectName, str, str2);
}
private boolean checkAdvanced() {
return checkTelephony() || checkFiles(GENY_FILES, "Geny") || checkFiles(ANDY_FILES, "Andy") || checkFiles(NOX_FILES, "Nox") || checkQEmuDrivers() || checkFiles(PIPES, "Pipes") || checkIp() || (checkQEmuProps() && checkFiles(X86_FILES, "X86"));
}
private boolean checkBasic() {
boolean z = false;
boolean z2 = Build.FINGERPRINT.startsWith("generic") || Build.MODEL.contains("google_sdk") || Build.MODEL.toLowerCase().contains("droid4x") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion") || Build.HARDWARE.equals("goldfish") || Build.HARDWARE.equals("vbox86") || Build.PRODUCT.equals("sdk") || Build.PRODUCT.equals("google_sdk") || Build.PRODUCT.equals("sdk_x86") || Build.PRODUCT.equals("vbox86p") || Build.BOARD.toLowerCase().contains("nox") || Build.BOOTLOADER.toLowerCase().contains("nox") || Build.HARDWARE.toLowerCase().contains("nox") || Build.PRODUCT.toLowerCase().contains("nox") || Build.SERIAL.toLowerCase().contains("nox");
if (z2) {
return true;
}
if (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) {
z = true;
}
boolean z3 = z | z2;
if (z3) {
return true;
}
boolean equals = z3 | "google_sdk".equals(Build.PRODUCT);
if (equals) {
return true;
}
Vibrator vibrator = (Vibrator) this.mContext.getSystemService("vibrator");
boolean hasVibrator = vibrator.hasVibrator();
StringBuilder sb = new StringBuilder();
sb.append("Support Vibrator : ");
sb.append(vibrator.hasVibrator());
log(sb.toString());
return (!hasVibrator) | equals;
}
private boolean checkDeviceId() {
if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
String deviceId = ((TelephonyManager) this.mContext.getSystemService("phone")).getDeviceId();
for (String equalsIgnoreCase : DEVICE_IDS) {
if (equalsIgnoreCase.equalsIgnoreCase(deviceId)) {
log("Check device id is detected");
return true;
}
}
}
return false;
}
private boolean checkFiles(String[] strArr, String str) {
for (String file : strArr) {
if (new File(file).exists()) {
StringBuilder sb = new StringBuilder();
sb.append("Check ");
sb.append(str);
sb.append(" is detected");
log(sb.toString());
return true;
}
}
return false;
}
private boolean checkImsi() {
if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
String subscriberId = ((TelephonyManager) this.mContext.getSystemService("phone")).getSubscriberId();
for (String equalsIgnoreCase : IMSI_IDS) {
if (equalsIgnoreCase.equalsIgnoreCase(subscriberId)) {
log("Check imsi is detected");
return true;
}
}
}
return false;
}
private boolean checkIp() {
if (ContextCompat.checkSelfPermission(this.mContext, "android.permission.INTERNET") == 0) {
StringBuilder sb = new StringBuilder();
try {
ProcessBuilder processBuilder = new ProcessBuilder(new String[]{"/system/bin/netcfg"});
processBuilder.directory(new File("/system/bin/"));
processBuilder.redirectErrorStream(true);
InputStream inputStream = processBuilder.start().getInputStream();
byte[] bArr = new byte[1024];
while (inputStream.read(bArr) != -1) {
sb.append(new String(bArr));
}
inputStream.close();
} catch (Exception e) {
}
String sb2 = sb.toString();
StringBuilder sb3 = new StringBuilder();
sb3.append("netcfg data -> ");
sb3.append(sb2);
log(sb3.toString());
if (!TextUtils.isEmpty(sb2)) {
String[] split = sb2.split("\n");
int length = split.length;
for (int i = 0; i < length; i++) {
String str = split[i];
if ((str.contains("wlan0") || str.contains("tunl0") || str.contains("eth0")) && str.contains(IP)) {
log("Check IP is detected");
return true;
}
}
}
}
return false;
}
private boolean checkOperatorNameAndroid() {
if (!((TelephonyManager) this.mContext.getSystemService("phone")).getNetworkOperatorName().equalsIgnoreCase("android")) {
return false;
}
log("Check operator name android is detected");
return true;
}
private boolean checkPackageName() {
if (this.isCheckPackage && !this.mListPackageName.isEmpty()) {
PackageManager packageManager = this.mContext.getPackageManager();
for (String launchIntentForPackage : this.mListPackageName) {
Intent launchIntentForPackage2 = packageManager.getLaunchIntentForPackage(launchIntentForPackage);
if (launchIntentForPackage2 != null && !packageManager.queryIntentActivities(launchIntentForPackage2, 65536).isEmpty()) {
return true;
}
}
Intent intent = new Intent("android.intent.action.MAIN", null);
intent.addCategory("android.intent.category.LAUNCHER");
for (ResolveInfo resolveInfo : packageManager.queryIntentActivities(intent, 0)) {
String str = resolveInfo.activityInfo.packageName;
if (str.startsWith("com.bluestacks.")) {
return true;
}
if (str.startsWith("com.vphone.")) {
return true;
}
if (str.startsWith("com.bignox.")) {
return true;
}
if (str.equals("com.google.android.launcher.layouts.genymotion")) {
return true;
}
}
}
return false;
}
private boolean checkPhoneNumber() {
if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
String line1Number = ((TelephonyManager) this.mContext.getSystemService("phone")).getLine1Number();
for (String equalsIgnoreCase : PHONE_NUMBERS) {
if (equalsIgnoreCase.equalsIgnoreCase(line1Number)) {
log(" check phone number is detected");
return true;
}
}
}
return false;
}
private boolean checkQEmuDrivers() {
File[] fileArr = {new File("/proc/tty/drivers"), new File("/proc/cpuinfo")};
int length = fileArr.length;
for (int i = 0; i < length; i++) {
File file = fileArr[i];
if (file.exists() && file.canRead()) {
byte[] bArr = new byte[1024];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(bArr);
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
String str = new String(bArr);
for (String contains : QEMU_DRIVERS) {
if (str.contains(contains)) {
log("Check QEmuDrivers is detected");
return true;
}
}
continue;
}
}
return false;
}
private boolean checkQEmuProps() {
Property[] propertyArr = PROPERTIES;
int length = propertyArr.length;
int i = 0;
for (int i2 = 0; i2 < length; i2++) {
Property property = propertyArr[i2];
String prop = getProp(this.mContext, property.name);
if (property.seek_value == null && prop != null) {
i++;
}
if (property.seek_value != null && prop.contains(property.seek_value)) {
i++;
}
}
if (i < MIN_PROPERTIES_THRESHOLD) {
return false;
}
log("Check QEmuProps is detected");
return true;
}
/* access modifiers changed from: private */
public boolean checkRoot() {
try {
Runtime.getRuntime().exec("su");
return true;
} catch (Exception e) {
return false;
}
}
private boolean checkTelephony() {
if (ContextCompat.checkSelfPermission(this.mContext, "android.permission.READ_PHONE_STATE") != 0 || !this.isTelephony || !isSupportTelePhony()) {
return false;
}
return checkPhoneNumber() || checkDeviceId() || checkImsi() || checkOperatorNameAndroid();
}
/* access modifiers changed from: private */
public boolean detect() {
log(getDeviceInfo());
boolean checkBasic = checkBasic();
StringBuilder sb = new StringBuilder();
sb.append("Check basic ");
sb.append(checkBasic);
log(sb.toString());
if (!checkBasic) {
checkBasic = checkAdvanced();
StringBuilder sb2 = new StringBuilder();
sb2.append("Check Advanced ");
sb2.append(checkBasic);
log(sb2.toString());
}
if (checkBasic) {
return checkBasic;
}
boolean checkPackageName = checkPackageName();
StringBuilder sb3 = new StringBuilder();
sb3.append("Check Package Name ");
sb3.append(checkPackageName);
log(sb3.toString());
return checkPackageName;
}
public static String getDeviceInfo() {
StringBuilder sb = new StringBuilder();
sb.append("Build.PRODUCT: ");
sb.append(Build.PRODUCT);
sb.append("\nBuild.MANUFACTURER: ");
sb.append(Build.MANUFACTURER);
sb.append("\nBuild.BRAND: ");
sb.append(Build.BRAND);
sb.append("\nBuild.DEVICE: ");
sb.append(Build.DEVICE);
sb.append("\nBuild.MODEL: ");
sb.append(Build.MODEL);
sb.append("\nBuild.HARDWARE: ");
sb.append(Build.HARDWARE);
sb.append("\nBuild.FINGERPRINT: ");
sb.append(Build.FINGERPRINT);
return sb.toString();
}
public static DeviceChecker getInstance() {
DeviceChecker deviceChecker = instance;
return deviceChecker == null ? new DeviceChecker() : deviceChecker;
}
private String getProp(Context context, String str) {
try {
Class loadClass = context.getClassLoader().loadClass("android.os.SystemProperties");
return (String) loadClass.getMethod("get", new Class[]{String.class}).invoke(loadClass, new Object[]{str});
} catch (Exception e) {
return null;
}
}
private boolean isSupportTelePhony() {
boolean hasSystemFeature = this.mContext.getPackageManager().hasSystemFeature("android.hardware.telephony");
StringBuilder sb = new StringBuilder();
sb.append("Supported TelePhony: ");
sb.append(hasSystemFeature);
log(sb.toString());
return hasSystemFeature;
}
/* access modifiers changed from: private */
public void log(String str) {
if (this.isDebug) {
Log.d(LOG_TAG, str);
}
}
public void CheckRooting(String str) {
UnityPlayer.currentActivity.runOnUiThread(new 2(this, str));
}
public void CheckRunningApp(String str) {
UnityPlayer.currentActivity.runOnUiThread(new 3(this, str));
}
public void DetectDevice(String str) {
UnityPlayer.currentActivity.runOnUiThread(new 1(this, str));
}
public String GetRunningApp() {
StringBuilder sb = new StringBuilder("");
try {
RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception e) {
}
for (RunningAppProcessInfo runningAppProcessInfo : ((ActivityManager) this.mContext.getSystemService("activity")).getRunningAppProcesses()) {
StringBuilder sb2 = new StringBuilder();
sb2.append(runningAppProcessInfo.processName);
sb2.append("|");
sb.append(new String(sb2.toString()));
}
return sb.toString();
}
public void Init(String str, String str2, String str3, String str4) {
this.mObjectName = str4;
this.isDebug = str.equals("y");
this.isTelephony = str2.equals("y");
this.isCheckPackage = str3.equals("y");
}
public List<String> getPackageNameList() {
return this.mListPackageName;
}
}
처음엔 해당 정보에 나오는 값만 build.prop에서 바꾸면 될 줄 알았는데 안되네요.
반대로 true만 찾아도 다 변경해도 안되네요.
메모리 변조나 그런게 아니라 단지 디텍터 우회만 연구 중인데
제가 생각 했던 방법은 검색 해보니 대부분 이미 누군가 썻다가 막혔거나 불가능한 방식이네요
제발 도움 좀 부탁 드립니다 ㅠㅠ
3일째 죽을 거 같네요
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import androidx.core.content.ContextCompat;
import com.unity3d.player.UnityPlayer;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@TargetApi(14)
public final class DeviceChecker {
private static final String[] ANDY_FILES = {"fstab.andy", "ueventd.andy.rc"};
private static final String[] DEVICE_IDS = {"000000000000000", "e21833235b6eef10", "012345678912345"};
private static final String[] GENY_FILES = {"/dev/socket/genyd", "/dev/socket/baseband_genyd"};
private static final String[] IMSI_IDS = {"310260000000000"};
private static final String IP = "10.0.2.15";
private static final String LOG_TAG = "BlueLIB";
private static final int MIN_PROPERTIES_THRESHOLD = 5;
private static final String[] NOX_FILES = {"fstab.nox", "init.nox.rc", "ueventd.nox.rc"};
private static final String[] PHONE_NUMBERS = {"15555215554", "15555215556", "15555215558", "15555215560", "15555215562", "15555215564", "15555215566", "15555215568", "15555215570", "15555215572", "15555215574", "15555215576", "15555215578", "15555215580", "15555215582", "15555215584"};
private static final String[] PIPES = {"/dev/socket/qemud", "/dev/qemu_pipe"};
private static final Property[] PROPERTIES = {new Property("init.svc.qemud", null), new Property("init.svc.qemu-props", null), new Property("qemu.hw.mainkeys", null), new Property("qemu.sf.fake_camera", null), new Property("qemu.sf.lcd_density", null), new Property("ro.bootloader", "unknown"), new Property("ro.bootmode", "unknown"), new Property("ro.hardware", "goldfish"), new Property("ro.kernel.android.qemud", null), new Property("ro.kernel.qemu.gles", null), new Property("ro.kernel.qemu", "1"), new Property("ro.product.device", "generic"), new Property("ro.product.model", "sdk"), new Property("ro.product.name", "sdk"), new Property("ro.serialno", null)};
private static final String[] QEMU_DRIVERS = {"goldfish"};
private static final String[] X86_FILES = {"ueventd.android_x86.rc", "x86.prop", "ueventd.ttVM_x86.rc", "init.ttVM_x86.rc", "fstab.ttVM_x86", "fstab.vbox86", "init.vbox86.rc", "ueventd.vbox86.rc"};
private static DeviceChecker instance;
@SuppressLint({"StaticFieldLeak"})
private static DeviceChecker mEmulatorDetector;
private boolean isCheckPackage = true;
private boolean isDebug = false;
private boolean isTelephony = false;
private final Context mContext = UnityPlayer.currentActivity.getApplicationContext();
private List<String> mListPackageName = new ArrayList();
private String mObjectName;
private DeviceChecker() {
this.mListPackageName.add("com.google.android.launcher.layouts.genymotion");
this.mListPackageName.add("com.bluestacks");
this.mListPackageName.add("com.bignox.app");
}
/* access modifiers changed from: private */
public void OnCallBackForUnityMsg(String str, String str2) {
UnityPlayer.UnitySendMessage(this.mObjectName, str, str2);
}
private boolean checkAdvanced() {
return checkTelephony() || checkFiles(GENY_FILES, "Geny") || checkFiles(ANDY_FILES, "Andy") || checkFiles(NOX_FILES, "Nox") || checkQEmuDrivers() || checkFiles(PIPES, "Pipes") || checkIp() || (checkQEmuProps() && checkFiles(X86_FILES, "X86"));
}
private boolean checkBasic() {
boolean z = false;
boolean z2 = Build.FINGERPRINT.startsWith("generic") || Build.MODEL.contains("google_sdk") || Build.MODEL.toLowerCase().contains("droid4x") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion") || Build.HARDWARE.equals("goldfish") || Build.HARDWARE.equals("vbox86") || Build.PRODUCT.equals("sdk") || Build.PRODUCT.equals("google_sdk") || Build.PRODUCT.equals("sdk_x86") || Build.PRODUCT.equals("vbox86p") || Build.BOARD.toLowerCase().contains("nox") || Build.BOOTLOADER.toLowerCase().contains("nox") || Build.HARDWARE.toLowerCase().contains("nox") || Build.PRODUCT.toLowerCase().contains("nox") || Build.SERIAL.toLowerCase().contains("nox");
if (z2) {
return true;
}
if (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) {
z = true;
}
boolean z3 = z | z2;
if (z3) {
return true;
}
boolean equals = z3 | "google_sdk".equals(Build.PRODUCT);
if (equals) {
return true;
}
Vibrator vibrator = (Vibrator) this.mContext.getSystemService("vibrator");
boolean hasVibrator = vibrator.hasVibrator();
StringBuilder sb = new StringBuilder();
sb.append("Support Vibrator : ");
sb.append(vibrator.hasVibrator());
log(sb.toString());
return (!hasVibrator) | equals;
}
private boolean checkDeviceId() {
if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
String deviceId = ((TelephonyManager) this.mContext.getSystemService("phone")).getDeviceId();
for (String equalsIgnoreCase : DEVICE_IDS) {
if (equalsIgnoreCase.equalsIgnoreCase(deviceId)) {
log("Check device id is detected");
return true;
}
}
}
return false;
}
private boolean checkFiles(String[] strArr, String str) {
for (String file : strArr) {
if (new File(file).exists()) {
StringBuilder sb = new StringBuilder();
sb.append("Check ");
sb.append(str);
sb.append(" is detected");
log(sb.toString());
return true;
}
}
return false;
}
private boolean checkImsi() {
if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
String subscriberId = ((TelephonyManager) this.mContext.getSystemService("phone")).getSubscriberId();
for (String equalsIgnoreCase : IMSI_IDS) {
if (equalsIgnoreCase.equalsIgnoreCase(subscriberId)) {
log("Check imsi is detected");
return true;
}
}
}
return false;
}
private boolean checkIp() {
if (ContextCompat.checkSelfPermission(this.mContext, "android.permission.INTERNET") == 0) {
StringBuilder sb = new StringBuilder();
try {
ProcessBuilder processBuilder = new ProcessBuilder(new String[]{"/system/bin/netcfg"});
processBuilder.directory(new File("/system/bin/"));
processBuilder.redirectErrorStream(true);
InputStream inputStream = processBuilder.start().getInputStream();
byte[] bArr = new byte[1024];
while (inputStream.read(bArr) != -1) {
sb.append(new String(bArr));
}
inputStream.close();
} catch (Exception e) {
}
String sb2 = sb.toString();
StringBuilder sb3 = new StringBuilder();
sb3.append("netcfg data -> ");
sb3.append(sb2);
log(sb3.toString());
if (!TextUtils.isEmpty(sb2)) {
String[] split = sb2.split("\n");
int length = split.length;
for (int i = 0; i < length; i++) {
String str = split[i];
if ((str.contains("wlan0") || str.contains("tunl0") || str.contains("eth0")) && str.contains(IP)) {
log("Check IP is detected");
return true;
}
}
}
}
return false;
}
private boolean checkOperatorNameAndroid() {
if (!((TelephonyManager) this.mContext.getSystemService("phone")).getNetworkOperatorName().equalsIgnoreCase("android")) {
return false;
}
log("Check operator name android is detected");
return true;
}
private boolean checkPackageName() {
if (this.isCheckPackage && !this.mListPackageName.isEmpty()) {
PackageManager packageManager = this.mContext.getPackageManager();
for (String launchIntentForPackage : this.mListPackageName) {
Intent launchIntentForPackage2 = packageManager.getLaunchIntentForPackage(launchIntentForPackage);
if (launchIntentForPackage2 != null && !packageManager.queryIntentActivities(launchIntentForPackage2, 65536).isEmpty()) {
return true;
}
}
Intent intent = new Intent("android.intent.action.MAIN", null);
intent.addCategory("android.intent.category.LAUNCHER");
for (ResolveInfo resolveInfo : packageManager.queryIntentActivities(intent, 0)) {
String str = resolveInfo.activityInfo.packageName;
if (str.startsWith("com.bluestacks.")) {
return true;
}
if (str.startsWith("com.vphone.")) {
return true;
}
if (str.startsWith("com.bignox.")) {
return true;
}
if (str.equals("com.google.android.launcher.layouts.genymotion")) {
return true;
}
}
}
return false;
}
private boolean checkPhoneNumber() {
if (ContextCompat.checkSelfPermission(UnityPlayer.currentActivity, "android.permission.READ_PHONE_STATE") == 0) {
String line1Number = ((TelephonyManager) this.mContext.getSystemService("phone")).getLine1Number();
for (String equalsIgnoreCase : PHONE_NUMBERS) {
if (equalsIgnoreCase.equalsIgnoreCase(line1Number)) {
log(" check phone number is detected");
return true;
}
}
}
return false;
}
private boolean checkQEmuDrivers() {
File[] fileArr = {new File("/proc/tty/drivers"), new File("/proc/cpuinfo")};
int length = fileArr.length;
for (int i = 0; i < length; i++) {
File file = fileArr[i];
if (file.exists() && file.canRead()) {
byte[] bArr = new byte[1024];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(bArr);
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
String str = new String(bArr);
for (String contains : QEMU_DRIVERS) {
if (str.contains(contains)) {
log("Check QEmuDrivers is detected");
return true;
}
}
continue;
}
}
return false;
}
private boolean checkQEmuProps() {
Property[] propertyArr = PROPERTIES;
int length = propertyArr.length;
int i = 0;
for (int i2 = 0; i2 < length; i2++) {
Property property = propertyArr[i2];
String prop = getProp(this.mContext, property.name);
if (property.seek_value == null && prop != null) {
i++;
}
if (property.seek_value != null && prop.contains(property.seek_value)) {
i++;
}
}
if (i < MIN_PROPERTIES_THRESHOLD) {
return false;
}
log("Check QEmuProps is detected");
return true;
}
/* access modifiers changed from: private */
public boolean checkRoot() {
try {
Runtime.getRuntime().exec("su");
return true;
} catch (Exception e) {
return false;
}
}
private boolean checkTelephony() {
if (ContextCompat.checkSelfPermission(this.mContext, "android.permission.READ_PHONE_STATE") != 0 || !this.isTelephony || !isSupportTelePhony()) {
return false;
}
return checkPhoneNumber() || checkDeviceId() || checkImsi() || checkOperatorNameAndroid();
}
/* access modifiers changed from: private */
public boolean detect() {
log(getDeviceInfo());
boolean checkBasic = checkBasic();
StringBuilder sb = new StringBuilder();
sb.append("Check basic ");
sb.append(checkBasic);
log(sb.toString());
if (!checkBasic) {
checkBasic = checkAdvanced();
StringBuilder sb2 = new StringBuilder();
sb2.append("Check Advanced ");
sb2.append(checkBasic);
log(sb2.toString());
}
if (checkBasic) {
return checkBasic;
}
boolean checkPackageName = checkPackageName();
StringBuilder sb3 = new StringBuilder();
sb3.append("Check Package Name ");
sb3.append(checkPackageName);
log(sb3.toString());
return checkPackageName;
}
public static String getDeviceInfo() {
StringBuilder sb = new StringBuilder();
sb.append("Build.PRODUCT: ");
sb.append(Build.PRODUCT);
sb.append("\nBuild.MANUFACTURER: ");
sb.append(Build.MANUFACTURER);
sb.append("\nBuild.BRAND: ");
sb.append(Build.BRAND);
sb.append("\nBuild.DEVICE: ");
sb.append(Build.DEVICE);
sb.append("\nBuild.MODEL: ");
sb.append(Build.MODEL);
sb.append("\nBuild.HARDWARE: ");
sb.append(Build.HARDWARE);
sb.append("\nBuild.FINGERPRINT: ");
sb.append(Build.FINGERPRINT);
return sb.toString();
}
public static DeviceChecker getInstance() {
DeviceChecker deviceChecker = instance;
return deviceChecker == null ? new DeviceChecker() : deviceChecker;
}
private String getProp(Context context, String str) {
try {
Class loadClass = context.getClassLoader().loadClass("android.os.SystemProperties");
return (String) loadClass.getMethod("get", new Class[]{String.class}).invoke(loadClass, new Object[]{str});
} catch (Exception e) {
return null;
}
}
private boolean isSupportTelePhony() {
boolean hasSystemFeature = this.mContext.getPackageManager().hasSystemFeature("android.hardware.telephony");
StringBuilder sb = new StringBuilder();
sb.append("Supported TelePhony: ");
sb.append(hasSystemFeature);
log(sb.toString());
return hasSystemFeature;
}
/* access modifiers changed from: private */
public void log(String str) {
if (this.isDebug) {
Log.d(LOG_TAG, str);
}
}
public void CheckRooting(String str) {
UnityPlayer.currentActivity.runOnUiThread(new 2(this, str));
}
public void CheckRunningApp(String str) {
UnityPlayer.currentActivity.runOnUiThread(new 3(this, str));
}
public void DetectDevice(String str) {
UnityPlayer.currentActivity.runOnUiThread(new 1(this, str));
}
public String GetRunningApp() {
StringBuilder sb = new StringBuilder("");
try {
RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception e) {
}
for (RunningAppProcessInfo runningAppProcessInfo : ((ActivityManager) this.mContext.getSystemService("activity")).getRunningAppProcesses()) {
StringBuilder sb2 = new StringBuilder();
sb2.append(runningAppProcessInfo.processName);
sb2.append("|");
sb.append(new String(sb2.toString()));
}
return sb.toString();
}
public void Init(String str, String str2, String str3, String str4) {
this.mObjectName = str4;
this.isDebug = str.equals("y");
this.isTelephony = str2.equals("y");
this.isCheckPackage = str3.equals("y");
}
public List<String> getPackageNameList() {
return this.mListPackageName;
}
}
처음엔 해당 정보에 나오는 값만 build.prop에서 바꾸면 될 줄 알았는데 안되네요.
반대로 true만 찾아도 다 변경해도 안되네요.
메모리 변조나 그런게 아니라 단지 디텍터 우회만 연구 중인데
제가 생각 했던 방법은 검색 해보니 대부분 이미 누군가 썻다가 막혔거나 불가능한 방식이네요
제발 도움 좀 부탁 드립니다 ㅠㅠ
3일째 죽을 거 같네요