1

現在、携帯電話で実行しているHIDドライバーにデータを書き込もうとしています。シェルで(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つの一重引用符が印刷されますが、それ以外は何も印刷されません。ルートでのみアクセスできる場所にファイルを書き込むことで、アプリがルート特権を取得していることを証明しました。

では、なぜこのようなコマンドは、プロセスクラスをスローしたのと同じようにシェルで動作しないのでしょうか。また、デバイスドライバーにデータを送信する方法について誰か提案がありますか?

ありがとうエイドリアン

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がストリームを処理した後、シェルは次のコマンドを認識しています。

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

つまり、Javaは二重の円記号自体を処理しています。シェルが実際に単一のエスケープされたバックスラッシュを認識できるように、エスケープされたバックスラッシュの別のセットを追加する必要があります。あなたができる

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

しかし、それはひどいように見えます。引用符で囲まれた文字列をシェルに渡すだけです

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 に答える