GithubHelp home page GithubHelp logo

lamster2018 / easyprotector Goto Github PK

View Code? Open in Web Editor NEW
2.1K 52.0 433.0 1.03 MB

一行代码检测XP/调试/多开/模拟器/root

License: Apache License 2.0

Java 94.45% CMake 1.92% C++ 3.64%
android security-tools hook xposed emulator

easyprotector's Introduction

之前托管在bintray,然后这个仓库关停了,我也没空转移维护,个人力量搞不过厂商,暂时不维护了。

EasyProtector Download

EasyProtector,a simple way to check root/virtual app/emulator/xposed framework/tracer/debugger.

很多朋友是通过郭霖老师的公众号推送 或者陈宇明老师的公众号推送了解到这个库的。

既然来都来了,欢迎大家star/fork,哪怕提个issue都好,我希望这是一个好用的库(省去application的初始化操作,避免更多的权限要求,尽可能的懒加载)

更新细节点这里

主要是修复了一堆bug,适配情况看image文件夹里的图,

腾讯乐固旧版的XposedCheck代码,是有copy SecurityCheckUtil里的部分代码的,新版已经看不到了,

毕竟模拟器是公司级别的产品,个人能力有限,希望大家多提pr。

Document

Download

You can download a jar from GitHub's releases page.

Or use Gradle:

repositories {
  jcenter()
  maven()
  google()
}

dependencies {
  implementation 'com.lahm.library:easy-protector-release:latest.release'
}

Or maven

<dependency>
  <groupId>com.lahm.library</groupId>
  <artifactId>easy-protector-release</artifactId>
  <version>1.1.0</version>
  <type>pom</type>
</dependency>

How do I use it?

EasyProtectorLib.checkIsRoot();

EasyProtectorLib.checkIsDebug();

EasyProtectorLib.checkIsPortUsing();

EasyProtectorLib.checkXposedExistAndDisableIt();

EasyProtectorLib.checkIsBeingTracedByC();

EasyProtectorLib.checkIsRunningInVirtualApk();

EasyProtectorLib.checkIsRunningInEmulator();

......

More function see

SecurityCheckUtil.class

EmulatorCheckUtil.class

VirtualApkCheckUtil.class

AccessibilityServicesCheckUtil.class

Proguard

no need

Compatibility

  • Minimum Android SDK: requires a minimum API level of 16.
  • CPU: support x86 & arm

Test

Phone SDK ROM
RedMi 3s Android 6.0 google eng
Huawei P9 Android 7.0 EMUI 5.1 root
Mix 2 Android 8.0 MIUI 9 stable
OnePlus 5T Android 8.1 H2OS 5.1 stable

License

Apache 2.0. See the LICENSE file for details.

About Emulator Detecting

自2018/6/13集成并上线自己的项目里,至10/24已经收集了11w+疑似模拟器的检测数据, 如果各位需要在业务里做非常细致的模拟器鉴别,可以在自行增加判断条件。

各位老铁提有关xx模拟器检测不出的issue的时候,请尽量附上emulatorInfo信息哈,我的demo里专门给你们打印了,这样方便调试。

PS:各版本检测结果可以去image查看

demo capture

easyprotector's People

Contributors

dakun666 avatar goodong avatar jasonlian2020 avatar lamster2018 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easyprotector's Issues

xposed这里判断似乎有问题啊

if ((str.endsWith(".so")) || (str.endsWith(".jar"))) {
((Set) localObject).add(str.substring(str.lastIndexOf(" ") + 1));
}


Line 1187: ef5bd000-ef615000 r--p 00000000 fd:00 1294357                            /data/dalvik-cache/arm/system@[email protected]@classes.dex
Line 1188: ef615000-ef65e000 r-xp 00058000 fd:00 1294357                            /data/dalvik-cache/arm/system@[email protected]@classes.dex
Line 1189: ef65e000-ef65f000 rw-p 000a1000 fd:00 1294357                            /data/dalvik-cache/arm/system@[email protected]@classes.dex

1.1.0版本模拟器检测bluestacks和koplayer失败

bluestacks 平台版本号3.1.20.678,引擎版本号2.10.42.9406
打印信息
ceshi start|null|null|MSM8974|msm8974|universal5420|support CameraFlash|sensorNum7|userAppNum1|2:cpu:/apps
1:cpuacct:/uid/10063
|end

koplayer 版本号2.0.0
打印信息
ceshi start|null|hlteatt-user|SM-N950S|Hi6210sft|androidVM_x86|unsupport CameraFlash|sensorNum13|userAppNum2|2:cpu:/
1:cpuacct:/uid_10037/pid_2502
|end

分身检测失败

一款名多开分身的会检测失败,经测试多开分身软件能进行修改机型,地理位置模拟,分身的应用的包名会跟原应用一致

原生模拟器(api 28)虚拟机检测错误,loadSO点击崩溃

emulatorInfo:
ceshi start|1.0.0.0|sdk_gphone_x86-userdebug|goldfish_x86||2:cpu:/
1:cpuacct:/uid_10085/pid_6675
|end

2018-10-19 15:40:30.140 6011-6160/com.google.android.gms E/CheckinRequestProcessor: CheckinNowTaskTag : Checkin failed: https://android.clients.google.com/checkin (fragment #0): java.net.ConnectException: Failed to connect to android.clients.google.com/64.233.189.101:443
java.net.ConnectException: Failed to connect to android.clients.google.com/64.233.189.101:443
at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:258)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:26)
at nmb.a(:com.google.android.gms@[email protected] (040700-199405334):23)
at nmb.a(:com.google.android.gms@[email protected] (040700-199405334):273)
at com.google.android.gms.checkin.CheckinChimeraService.a(:com.google.android.gms@[email protected] (040700-199405334):167)
at nlw.run(:com.google.android.gms@[email protected] (040700-199405334):2)
at pmy.run(:com.google.android.gms@[email protected] (040700-199405334):24)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at pta.run(Unknown Source:7)
at java.lang.Thread.run(Thread.java:764)

checkByHasSameUid 方法中filter变量返回空 会造成空指针

 public boolean checkByHasSameUid() {
        String filter = getUidStrFormat();

        String result = CommandUtil.getSingleInstance().exec("ps");
        if (result == null || result.isEmpty()) {
            return false;
        }

        String[] lines = result.split("\n");
        if (lines == null || lines.length <= 0) {
            return false;
        }

        int exitDirCount = 0;

        for (int i = 0; i < lines.length; i++) {
### //如果filter 为空 contains 会报空指针异常

            if (lines[i].contains(filter)) {  
                int pkgStartIndex = lines[i].lastIndexOf(" ");
                String processName = lines[i].substring(pkgStartIndex <= 0
                        ? 0 : pkgStartIndex + 1, lines[i].length());
                File dataFile = new File(String.format("/data/data/%s", processName, Locale.CHINA));
                if (dataFile.exists()) {
                    exitDirCount++;
                }
            }
        }

        return exitDirCount > 1;
    }

端口检测应用多开的方法失效

VirtualApkCheckUtil.getSingleInstance().checkByPortListening(getPackageName(), () -> {
DialogUtils.showMessDialog((Activity) getApplicationContext(), "禁止双开");
System.exit(0);
});

题外话,关于检测模拟器判断

pm list package 。 因为大部分手机会有一个”是否允许应用读取手机应用列表”的权限,不知这个pm list package 和权限是否有关联。

基于Socket,真正的一行代码检测多开哦

public class App extends Application {

    LocalServerSocket mServerSocket;

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            // 借鉴自 AMS 与 zygote 通信
            mServerSocket = new LocalServerSocket(getPackageName());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

不需要开线程,不需要遍历端口,只需要一个唯一确定的名字即可。唯一的缺点是多开的 app 之间无法通信,是因为 SELinux 的保护机制限制了文件访问权限

真机闪退

集成lib到项目,真机运行发现总闪退

android 自带的虚拟机9.0检测不出来

android 自带的虚拟机9.0检测不出来。打印了检测的日志如下:
isEmulator --- >baseBandVersion 1.0.0.0
buildFlavor sdk_gphone_x86-user
productboard goldfish_x86
boardplatform
filter 2:cpu:/
1:cpuacct:/uid_10091/pid_2675
希望能够尽快适配

maven引用不到

提示Could not find which method maven() to invoke from this list:
public abstract org.gradle.api.artifacts.repositories.MavenArtifactRepository org.gradle.api.artifacts.dsl.RepositoryHandler#maven(groovy.lang.Closure)
public abstract org.gradle.api.artifacts.repositories.MavenArtifactRepository org.gradle.api.artifacts.dsl.RepositoryHandler#maven(org.gradle.api.Action)

检测不到

逍遥模拟器检测不到
start|null|MIX|MIX|null|intel|unsupport CameraFlash|sensorNum7|userAppNum16||end

1.0.5 小米6手机 运行崩溃 检测模拟器代码

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] java.lang.String.split(java.lang.String)' on a null object reference
at com.lahm.library.EmulatorCheckUtil.int getUserAppNums(java.lang.String)(EmulatorCheckUtil.java:98)
at com.lahm.library.EmulatorCheckUtil.boolean readSysProperty(android.content.Context,com.lahm.library.EmulatorCheckCallback)(EmulatorCheckUtil.java:73)
at com.lahm.library.EmulatorCheckUtil.boolean readSysProperty()(EmulatorCheckUtil.java:30)
at com.lahm.library.EasyProtectorLib.boolean checkIsRunningInEmulator()(EasyProtectorLib.java:62)
at com.cnepay.android.utils.SafeUtils.boolean isEmulator()(SafeUtils.java:124)
at com.cnepay.android.utils.SafeUtils.java.lang.String isSafe(boolean,android.content.Context)(SafeUtils.java:58)
at com.cnepay.android.swiper.MainActivity$10.void run()(MainActivity.java:560)
at java.lang.Thread.null run(null)(Thread.java)

检测雷电模拟器3.4.3失效

image
ceshi start|null|android_x86-user|f100|android-x86|android_x86|supportCameraFlash|sensorNum6|userAppNum5|2:cpu:/1:cpuacct:/uid_10031/pid_3009|end
具体情况为:
安装了4个app时,检测正常;又安装了一个app后检测失效

a permission question

android.permission.BIND_ACCESSIBILITY_SERVICE

why need this permission_request in manifest.xml ?

java.lang.NullPointerException

Attempt to invoke virtual method 'java.lang.String[] android.os.Bundle.getStringArray(java.lang.String)' on a null object reference

建议更新检测条件

建议:

if (null == baseBandVersion || baseBandVersion.contains("1.0.0.0"))
suspectCount += 2;//基带信息

if (sensorSize <= 7) ++suspectCount;//传感器个数

if (userAppSize <= 5) ++suspectCount;//用户安装的app个数

亲测:夜神,雷电、逍遥、mumu,腾讯手游助手,genymotion有效、

空指针错误(Attempt to invoke interface method 'void com.lahm.library.VirtualCheckCallback.findSuspect()' on a null object reference))

image
突然产生了大量空指针问题,貌似都是发生在按back键退出app的时候发生的
崩溃率很大,可否尽快加入非空判断?

是在Application初始化时调用的,具体kotlin代码如下:

if (ProcessUtil.isMainProcess(application)) {
VirtualApkCheckUtil.getSingleInstance().checkByPortListening(application.packageName) {
Log.e("Application", "find multiapp suspect")
DeviceInfo = generateDeviceInfo(application, true)
}
}

vivo x9s

大佬,vivo x9s OS7.1.2 虚拟机、多开检测无效

AS自带模拟器检测失败

仔细看了模拟器检测部分的代码,发现在对比平台信息和处理信息的时候时当两者都不为空的时候进行判断的,在测试中发现AS自带的模拟器无法检测,具体结果为
基带信息:是
渠道信息:不是
处理器信息:不是
平台信息:是
对比信息:不是
控制信息:不是

整体结果:不是模拟器

个人建议:平台处理器对比时,只要有一个为空就应该再次增加其嫌疑度

1533517426

mumu模拟器检测不出来

  public static void isEmulator() {
    if (EasyProtectorLib.checkIsRunningInEmulator()) {
      KLog.e("是模拟器");
      System.exit(0);
    }else {
      KLog.e("不是模拟器");
    }
  }

#isEmulator ] 不是模拟器

OPPO R15被识别成模拟器

ceshi start|M_V3_P10,M_V3_P10|full_oppo6771_17197-user|oppo6771_17197|mt6771|
4:cpuset:/top-app
3:cpu:/
2:schedtune:/top-app
1:cpuacct:/uid_10137/pid_18790
|end

怎么检测应用双开

EasyProtectorLib.checkIsUsingMultiVirtualApp() 这个方法不能检测应用双开多开吗,我使用这个方法打log ,在多开的情况下不能识别的,求助,哪位大佬有检测应用多开的好工具

多开检测

多开之后getFilesDir()得到的路径 不一样,应该是可以作为依据的

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.