逐字节读取 partition/directory /storage/extSdCard 作为文件。 Android

Reading partition/directory /storage/extSdCard as a file, byte by byte. Android

此代码在连接了 SD 卡的 windows 机器上运行时遇到问题,但在 android 上无法运行。有谁知道如何将 sdcard 逐字节读取为单个文件?我想从分区中读取所有字节。

    public void buttonOnClick(View v) throws IOException {
    //File diskRoot = new File("\\.\G:"); // for Windows disk ex. G

    int off=0;
    int len=1024;

    FileInputStream stream = null;

    //TODO find direct access to sd card
    //File sdDir = new File("storage/extSdCard");
    File sdDir = new File("storage/extSdCard");
    //File sdDir = new File("dev/block/platform/s3c-sdhci.2/mmcblk1");
    //File sdDir = Environment.getExternalStorageDirectory();
    //FileInputStream asd = openFileInput(Environment.getExternalStorageState());

    //File sdDir = new File(Environment.getExternalStorageDirectory()); gives internal storage of device
    //sdDir.getParentFile().mkdirs();
    //File file = new File(sdDir,"");
    byte[] buffer = new byte[1024];
    try {
        stream = new FileInputStream(sdDir);

        while (stream.read(buffer, off, len) != -1) {
            //
        }
        stream.close();
    } catch (FileNotFoundException e){
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

以上版本的 "File sdDir" 的任何注释都给出 logcat 相同的输出:

01-01 21:13:06.751 10887-10887/raf.test W/System.err﹕ java.io.FileNotFoundException: /storage/extSdCard: open failed: EISDIR (是一个目录)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 libcore.io.IoBridge.open(IoBridge.java:416)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 java.io.FileInputStream.(FileInputStream.java:78)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在raf.test.MBR.buttonOnClick(MBR.java:77)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在java.lang.reflect.Method.invokeNative(本机方法)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 java.lang.reflect.Method.invoke(Method.java:511)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 android.view.View$1.onClick(View.java:3719)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在android.view.View.performClick(View.java:4261)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 android.view.View$PerformClick.run(View.java:17356)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 android.os.Handler.handleCallback(Handler.java:615)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 android.os.Handler.dispatchMessage(Handler.java:92)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 android.os.Looper.loop(Looper.java:137)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在 android.app.ActivityThread.main(ActivityThread.java:4921)
01-01 21:13:06.751 10887-10887/raf.test W/System.err:在java.lang.reflect.Method.invokeNative(本机方法)
01-01 21:13:06.756 10887-10887/raf.test W/System.err:在 java.lang.reflect.Method.invoke(Method.java:511)
01-01 21:13:06.756 10887-10887/raf.test W/System.err:在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
01-01 21:13:06.756 10887-10887/raf.test W/System.err:在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
01-01 21:13:06.756 10887-10887/raf.test W/System.err:在dalvik.system.NativeStart.main(本机方法)
01-01 21:13:06.756 10887-10887/raf.test W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: EISDIR (是一个目录)
01-01 21:13:06.756 10887-10887/raf.test W/System.err:在 libcore.io.IoBridge.open(IoBridge.java:405)
01-01 21:13:06.756 10887-10887/raf.test W/System.err: ... 16 更多

权限为:

 <uses-permission android:name="android.permission.read_external_storage"/>
<uses-permission android:name="android.permission.write_external_storage"/>

我不确定您是否可以在没有 root 的情况下从标准 Android 应用程序获得这种访问权限 - 有几件事需要考虑:

  1. Android 允许您从您的应用程序访问文件系统 - 而不是对分区的原始访问。
  2. 您通常需要卸载 partition/file 系统才能 逐字节访问,因为您不希望获得任何权限 按照您的方式,您只能以 root 用户身份卸载。
  3. 如果你是 root 那么你可以卸载驱动器然后发出一个 dd 命令创建一个带有原始图像的新文件 喜欢:

    Runtime.getRuntime().exec("su -c dd if=/dev/deviceToRead1> of=rawOutputFile");

  4. 我可以告诉你,如果这可以从非 root 设备上进行,那么它将被处理 作为将尽快修补的安全漏洞,因为它会 将整个 phone 及其上的所有数据置于危险之中。如果这 可以从非 root 设备进行,那么就可以 任何应用程序 steal/read 来自其他应用程序的数据 Android具体限制多方面

  5. 此行为可能会被 Google Play 阻止 如果您打算将此应用放入 Google 中,请进行验证 Play 商店,因为它被认为是恶意的。

  6. 我还可以告诉你,如果你能找到一种方法来实现这一点,那么它将需要 一个会给你root权限的漏洞。一旦你有根 (通过漏洞利用)然后剩下的就很容易用基本的命令行来完成 实用程序(mountdd,特别是)。

  7. 从商业角度来看,如果可能的话,您的应用会 让取证软件停业 :) 请记住,取证软件 执行此过程的软件也需要原始访问权限 需要物理访问设备的分区 and/or 设备上的根访问权限。

  8. 你得到java.io.FileNotFoundException的原因是 因为您使用的 API 可以让您访问文件系统级别 以及您需要的绕过文件系统功能。你会 永远不要使用文件系统调用对分区进行原始访问。

我认为此列表可以回答您的问题。如果不首先获取 root 权限,您将无法执行此操作,否则 Android 的整个安全模型将被证明是无用的。