1

我目前正在尝试将数据写入我在手机上运行的 HID 驱动程序。如果我在 shell(通过 adb)中运行以下命令,echo -e \\x00\\x00\\x07\\x04\\x00\\x00\\x00 > /dev/hidg0 && echo -e \\x00\\x00\\x00\\x00\\x00\\x00\\x00 > /dev/hidg0则在连接到设备的计算机上键入正确的字符,在这种情况下是 da。但是,如果我像这样在 android 应用程序中发送相同的命令

Runtime shell = Runtime.getRuntime();
Process p = shell.exec("su");
DataOutputStream out = new DataOutputStream(p.getOutputStream());
out.writeBytes("echo -e \\x00\\x00\\x07\\x04\\x00\\x00\\x00 > /dev/hidg0 && echo -e \\x00\\x00\\x00\\x00\\x00\\x00\\x00 > /dev/hidg0\n");

打印了 2 个单引号,但仅此而已。我已经证明该应用程序通过将文件写入只能由 root 访问的位置来获得 root 权限。

那么为什么像这样的命令在 shell 中的行为方式与抛出进程类的方式不同呢?是否有人对我应该如何将数据发送到我的设备驱动程序有任何建议?

谢谢阿德里安

PS我也尝试过shell.exec("echo -e \\x00\\x00\\x07\\x04\\x16\\x06\\x00 > /dev/hidg0 && echo -e \\x00\\x00\\x00\\x00\\x00\\x00\\x00 > /dev/hidg0");,但这没有给我任何东西

4

1 回答 1

1

在 Java 处理流之后,shell 会看到以下命令:

echo -e \x00\x00\x07\x04\x00\x00\x00...

即,Java 自己处理双反斜杠。您需要添加另一组转义反斜杠,以便 shell 实际看到一个转义反斜杠。你可以做

out.writeBytes("echo -e \\\\x00\\\\x00...")

但这看起来很可怕。只需将带引号的字符串传递给shell

out.writeBytes("echo -e '\\x00\\x00\\x07\\x04\\x00\\x00\\x00' > /dev/hidg0 && echo -e '\\x00\\x00\\x00\\x00\\x00\\x00\\x00' > /dev/hidg0\n");
于 2012-09-08T14:13:07.553 回答