回答问题
https://www.zhihu.com/question/494101361/answer/2212116525
电脑安卓模拟器为什么有一些APP无法登陆账号
2022年8月26日
09:51
很多app 会检测是否真机运行环境 ,如何发现模拟器运行 ,很多是禁止使用
模拟器运行,所以经常会出现 app 在模拟器里面闪退 .
要想解决这一问题 ,需要解决 真机环境问题 .
那么一般app 如何判断是否模拟器运行呢 ,从技术角度非常容易解决 .
参考一下的代码 :
/**
* 验证当前设备是否为模拟器
*/
public class VerifyDevice {
public static boolean isSuccess = false;
/**
* 模拟器验证结果
*/
public static void verify( ) {
Context context = Application.getInstance();
if (notHasBlueTooth()){
isSuccess = true;
}else if (notHasLightSensorManager(context)){
isSuccess = true;
}else if (ifFeatures()){
isSuccess = true;
}else if (checkIsNotRealPhone()){
isSuccess = true;
}
}
/**
* 判断蓝牙是否有效
*/
private static boolean notHasBlueTooth(){
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null){
return true;
}else{
// 如果蓝牙不一定有效的。获取蓝牙名称,若为 null 则默认为模拟器
String name = bluetoothAdapter.getName();
if (TextUtils.isEmpty(name)){
return true;
}else{
return false;
}
}
}
/**
* 依据是否存在 光传感器 来判断是否为模拟器
* @param context
* @return
*/
private static boolean notHasLightSensorManager(Context context){
SensorManager sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
if (sensor == null){
return true;
}else{
return false;
}
}
/**
* 根据部分特征参数设备信息来判断是否为模拟器
* @return
*/
private static boolean ifFeatures(){
return Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.toLowerCase().contains("vbox")
|| Build.FINGERPRINT.toLowerCase().contains("test-keys")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86")
|| Build.MANUFACTURER.contains("Genymotion")
||(Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google_sdk".equals(Build.PRODUCT);
}
/*
*根据CPU是否为电脑来判断是否为模拟器
*返回:true 为模拟器
*/
private static boolean checkIsNotRealPhone() {
String cpuInfo = readCpuInfo();
if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
return true;
}
return false;
}
/**
* 根据 CPU 是否为电脑来判断是否为模拟器
* @return
*/
private static String readCpuInfo(){
String result = "";
try{
String [] args = {"/system/bin/cat","/proc/cpuinfo"};
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process = processBuilder.start();
StringBuffer stringBuffer = new StringBuffer();
String readLine = "";
BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
while ((readLine = responseReader.readLine())!=null){
stringBuffer.append(readLine);
}
responseReader.close();
result = stringBuffer.toString().toLowerCase();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
对于技术来说 ,判断是否模拟器运行很简单 ,那么如何去避免被app识别模拟器运行呢?
其实如果你会点逆向知识 ,就很容易破解真机环境问题 ,可以看到 ,app 也是通过代码
读取底层的一些东西 ,一些变量 ,一些文件配置等等 .
那么我们是否可以这样理解,修改了这些东西就可以很轻松的过了模拟器检测呢?
答案是肯定的 .
通过工具修改后的 模拟器 ,真实虚拟真机环境 ,遇到这样的模拟器 ,绝大部分的 app 检测方法都失效了.
有兴趣 可以参考下 这个视频 :
https://www.zhihu.com/zvideo/1500070373152051200
比较详细的介绍 操作方法 .
但是对于大型的app ,比如 微信 ,抖音之类的 ,判断就不是这么简单的了。
这些app 还会获取以下的信息 :
1:相关的一些手机硬件信息
比如CPU型号 ,GPU型号 等等 串码结合硬件信息 判断是否一台真实手机 。
2:手机通讯录
通过抓取通讯录 ,因为不同的手机 ,正常的手机,都会有通讯录 ,极少没有的 。
3:通话记录,短信信息 。
通过抓取短信 ,通话记录 。判断是否一台 真实手机 ,一般个人手机是有通话记录和短信
4:IP地址 。
是否住宅IP地址, 以及 根据ip地址定位 ,是否位于风险区域 ,如果位于风控ip区域 ,
是非常 容易被风控的 。举个例子 ,比如 一个ip段 ,同时出现几百台机器 ,做刷单业务。
那么是很容易出问题的。
所以要想 躲避app检测 ,需要 模仿很多信息 ,而不是简单的 修改串码 。
这是一个比较复杂的问题 ,如果你也遇到真机环境问题 ,不懂也可以咨询我 .
解决不了真机环境问题,就无法解决封号问题