如何从Android活动控制ADBD?

时间:2016-09-20 09:05:35

标签: android shell input adb

通过控制ADBD(ADB服务器守护程序进程),我的意思是:配置,停止和启动/ sbin / adbd进程而不使用ADB本身。

前言这个问题:

在一些罕见的Android设备上,不存在触摸屏(智能眼镜等)。但显然,许多应用程序都需要它,因此必须通过软件模拟输入。

最短的解决方案是使用输入命令,但是为了从活动中使用它,需要特殊权限INJECT_EVENTS。

通过使应用程序成为系统应用程序,或者使用ROM源中存在的固件密钥对应用程序进行签名,可以授予此权限。 我的目标设备只需要固件密钥,我将无法获得它。

此时我能想到的单一黑客,就是为了获利,ADB可以使用输入命令而不需要任何东西。

实际上,我可以通过USB手动尝试通过ADB来确认这个黑客可以工作:

1 /打开ADB shell: PC命令:adb shell

2 /配置ABDB打开TCP模式: 在adb shell里面:

    setprop service.adb.tcp.port 5555;  // Configure
    stop adbd;                          // Restart
    start adbd;
    adb connect localhost:5555;         // Start a client ADB, to the local ADBD server process

3 /来自活动代码:

    Runtime.getRuntime().exec(new String[] { "sh", "-c", "adb shell \"input tap 100 200;\";" });

总结一下:Activity可以通过运行rooted命令来生成没有权限的输入事件,该命令启动通过TCP端口在其自己的adbd进程上连接的adb shell。

问题是:它需要手动ADBD配置,ADBD重启,并使设备上的ADB客户端连接到它。

不太好的解决方案:我可以设置持久性ADBD配置以避免重新配置+重启,但这意味着一个巨大的安全漏洞,因为LAN上的任何人都可以在设备上拥有root权限。

通过ADB shell的命令是:setprop persist.adb.tcp.port 5555;

我希望他们的工作的Android活动代码是:

Runtime.getRuntime().exec("setprop service.adb.tcp.port 5555");
Runtime.getRuntime().exec("stop adbd");
Runtime.getRuntime().exec("start adbd");
Thread.sleep(3000);
Runtime.getRuntime().exec("adb connect localhost:5555");

但从我所看到的情况来看,它似乎没有做任何事情。

我还尝试在隐藏的SystemProperties API上使用反射:

static public String getprop(String key){
    try { Class c = Class.forName("android.os.SystemProperties");
        try { Method method = c.getDeclaredMethod("get", String.class);
            try { return (String) method.invoke(null, key);
            }  catch (IllegalAccessException e) {e.printStackTrace();}
            catch (InvocationTargetException e) {e.printStackTrace();}
        } catch (NoSuchMethodException e) {e.printStackTrace();}
    } catch (ClassNotFoundException e) {e.printStackTrace();}
    return null;
}

static public void setprop(String key, String value){
    try { Class c = Class.forName("android.os.SystemProperties");
        try { Method method = c.getDeclaredMethod("set", String.class, String.class);
            try { method.invoke(null, key, value);
            }  catch (IllegalAccessException e) {e.printStackTrace();}
            catch (InvocationTargetException e) {e.printStackTrace();}
        } catch (NoSuchMethodException e) {e.printStackTrace();}
    } catch (ClassNotFoundException e) {e.printStackTrace();}
}

似乎getprop()按预期工作,但是做setprop()然后getprop()没有显示任何修改。既不执行setprop(),也不执行shell getprop命令。

还有人要读这篇文章! ;) 感谢您的阅读,并非常感谢愿意寻求解决方案的人。

0 个答案:

没有答案