Преглед изворни кода

only support kaien devices

cs пре 9 месеци
родитељ
комит
37b2fa20f9

+ 89 - 0
server/src/main/java/org/las2mile/okio/utils/SystemUtils.java

@@ -0,0 +1,89 @@
+package org.las2mile.okio.utils;
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import android.content.Context;
+import android.util.Log;
+import java.lang.reflect.Method;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.ResultReceiver;
+import java.lang.reflect.Field;
+import org.las2mile.scrcpy.wrappers.ServiceManager;
+import org.las2mile.scrcpy.wrappers.WifiManager;
+
+public class SystemUtils{
+    //@param filePath su 文件的路径,比如/system/bin/su 或者/system/xbin/su
+    public static boolean isCanExecute(String filePath) {
+        java.lang.Process process = null;
+        try {
+            process = Runtime.getRuntime().exec("ls -l " + filePath);
+            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            String str = in.readLine();
+            if (str != null && str.length() >= 4) {
+                char flag = str.charAt(3);
+                if (flag == 's' || flag == 'x') {
+                    Runtime.getRuntime().exec("su ");
+                    return true;
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (process != null) {
+                process.destroy();
+            }
+        }
+        return false;
+    }
+
+    public static void getAppContext() {
+        ServiceManager serviceManager = new ServiceManager();
+        // serviceManager.getWifiManager().hasKNKJapp();
+        Log.d("OKIOscr","getAppContextv serviceManager.getWifiManager() ");;
+        new Thread(){
+            @Override
+            public void run() {
+                super.run();
+                Looper.prepare();
+                ResultReceiver resultReceiver = new ResultReceiver(new Handler(Looper.myLooper()));
+                Class activityThreadClass = null;
+                Context context = null;
+                try {
+                    
+                        
+                    activityThreadClass = Class.forName("android.app.ActivityThread");
+                    Method currentActivityThread = activityThreadClass.getDeclaredMethod("currentActivityThread");
+                    currentActivityThread.setAccessible(true);
+                    Object activityThread =  currentActivityThread.invoke(null);
+                    Log.d("OKIOscr","getAppContext activityThread "+activityThread);
+                    context = (Context) activityThreadClass.getMethod("getSystemContext").invoke(activityThread);
+                    Context getApplication = (Context)activityThreadClass.getMethod("getApplication").invoke(activityThread);
+                    Log.d("OKIOscr",getApplication+" getAppContext getSystemContext "+context);
+                }catch (Exception e){
+                    e.printStackTrace();
+                    Log.d("OKIOscr","getAppContext "+e.getMessage());
+                }
+                
+                Looper.loop();
+            }
+        }.start();
+    }
+
+    public static Object getCurrentActivityThread() {
+        try {
+            Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
+            Field currentActivityThreadField = activityThreadClass.getDeclaredField("sCurrentActivityThread");
+            currentActivityThreadField.setAccessible(true);
+            Object currentActivityThread = currentActivityThreadField.get(null);
+            Log.d("OKIOscr","getAppContext currentActivityThread "+currentActivityThread);
+            return currentActivityThread;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 20 - 1
server/src/main/java/org/las2mile/scrcpy/DroidConnection.java

@@ -7,6 +7,11 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.ServerSocket;
 import java.net.Socket;
+import java.net.InetAddress;
+import android.os.Build;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 
 public final class DroidConnection implements Closeable {
 
@@ -24,7 +29,21 @@ public final class DroidConnection implements Closeable {
 
 
     private static Socket listenAndAccept() throws IOException {
-        ServerSocket serverSocket = new ServerSocket(7007);
+        //只允许连接公司的设备
+        Ln.d("The device start listenAndAccept");
+        ServerSocket serverSocket = new ServerSocket();
+        serverSocket.bind(new InetSocketAddress("192.168.43.1",7007));
+        InetAddress serverIP = serverSocket.getInetAddress();
+        String deviceIP = serverIP.getHostAddress();
+        boolean isBound = serverSocket.isBound();
+        Ln.d("The device isBound " +isBound);
+        if (!"192.168.43.1".equals(deviceIP)) {
+            Ln.d("The device is not produced");
+            serverSocket.close();
+            System.exit(0);
+            return null;
+        }
+
         Socket sock = null;
         try {
             sock = serverSocket.accept();

+ 24 - 0
server/src/main/java/org/las2mile/scrcpy/Server.java

@@ -5,6 +5,9 @@ import java.io.IOException;
 import org.las2mile.okio.OkIOServer;
 import java.lang.reflect.Method;
 import org.las2mile.scrcpy.wrappers.ServiceManager;
+import android.os.Build;
+import org.las2mile.okio.utils.SystemUtils;
+import android.content.Context;
 
 public final class Server {
 
@@ -126,6 +129,16 @@ public final class Server {
     }
 
     private static boolean onlyAllowedKaiEnKeJiCom(){
+        //公司设备支持的系统
+        boolean isRooted = SystemUtils.isCanExecute("/system/xbin/su");
+        boolean allowedV =Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1 || Build.VERSION.SDK_INT == Build.VERSION_CODES.P;
+        //Ln.d(isRooted+" onlyAllowedKaiEnKeJiCom  "+allowedV +" appContext "+Build.VERSION.SDK_INT);
+        boolean osEnv = isRooted && allowedV;
+        if(!osEnv ){
+            Ln.d("os not support");
+            return false;
+        }
+
         //forge.cubic.ap.version=SLM758CMG_EQ0_8971F53_240802_100_V01_T01
         String apVersion = getSystemProperty("forge.cubic.ap.version","empty");
         boolean isMg = false;
@@ -144,8 +157,19 @@ public final class Server {
         ServiceManager serviceManager = new ServiceManager();
         boolean kyenMGapp = serviceManager.getPackageManager().hasKNKJapp("com.kyen.imagedetection");
         boolean kyen708app = serviceManager.getPackageManager().hasKNKJapp("com.kyne.kyne708");
+
+        //如果设备上安装了其他app,则不支持投屏
+        boolean mobileqq = serviceManager.getPackageManager().hasKNKJapp("com.tencent.mobileqq");
+        boolean mm = serviceManager.getPackageManager().hasKNKJapp("com.tencent.mm");
+        //Ln.d("mobileqq:"+mobileqq+" mm :"+mm);
+        if(mobileqq || mm){
+            Ln.d("dangerous action");
+            return false;
+        }
+
         Ln.d("app1:"+kyen708app+" lt :"+isLentek+";  mg app:"+kyenMGapp+",mg fw:"+isMg);
         if(isMg || isLentek){
+            Ln.d("company produced devices");
             if(kyenMGapp || kyen708app){
                 return true;
             }

+ 8 - 0
server/src/main/java/org/las2mile/scrcpy/wrappers/ServiceManager.java

@@ -15,6 +15,7 @@ public final class ServiceManager {
     private InputManager inputManager;
     private PowerManager powerManager;
     private PackageManager packageManager;
+    private WifiManager wifiManager;
 
     public ServiceManager() {
         try {
@@ -68,4 +69,11 @@ public final class ServiceManager {
         }
         return packageManager;
     }
+
+    public WifiManager getWifiManager() {
+        if (wifiManager == null) {
+            wifiManager = new WifiManager(getService("wifi", "android.net.wifi.IWifiManager"));
+        }
+        return wifiManager;
+    }
 }

+ 37 - 0
server/src/main/java/org/las2mile/scrcpy/wrappers/WifiManager.java

@@ -0,0 +1,37 @@
+package org.las2mile.scrcpy.wrappers;
+
+import android.os.IInterface;
+import android.view.InputEvent;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import android.util.Log;
+import android.content.pm.PackageInfo;
+import android.net.wifi.WifiInfo;
+
+public final class WifiManager {
+
+    private final IInterface manager;
+
+    public WifiManager(IInterface manager) {
+        this.manager = manager;
+    }
+
+    public boolean hasKNKJapp() {
+        try {
+            Method getConnectionInfo = manager.getClass().getMethod("getConnectionInfo");
+            Log.e("OKIOscr","getConnectionInfo==="+getConnectionInfo);
+            WifiInfo wifiInfo = (WifiInfo) getConnectionInfo.invoke(manager);
+            Log.e("OKIOscr","wifiInfo==="+wifiInfo);
+            int ipInt = wifiInfo.getIpAddress();
+            int p1 = (ipInt & 0xff000000)>>(3*8);
+            int p2 = (ipInt & 0x00ff0000)>>(2*8);
+            int p3 = (ipInt & 0x0000ff00)>>(8);
+            int p4 = (ipInt & 0x000000ff);
+            Log.e("OKIOscr",p1+"."+p2+"."+p3+"."+p4);
+        } catch (Exception e) {
+            throw new AssertionError(e);
+        }
+        return false;
+    }
+}