逐字节读取 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 应用程序获得这种访问权限 - 有几件事需要考虑:
- Android 允许您从您的应用程序访问文件系统 - 而不是对分区的原始访问。
- 您通常需要卸载 partition/file 系统才能
逐字节访问,因为您不希望获得任何权限
按照您的方式,您只能以 root 用户身份卸载。
如果你是 root 那么你可以卸载驱动器然后发出一个
dd
命令创建一个带有原始图像的新文件
喜欢:
Runtime.getRuntime().exec("su -c dd if=/dev/deviceToRead1> of=rawOutputFile");
我可以告诉你,如果这可以从非 root 设备上进行,那么它将被处理
作为将尽快修补的安全漏洞,因为它会
将整个 phone 及其上的所有数据置于危险之中。如果这
可以从非 root 设备进行,那么就可以
任何应用程序 steal/read 来自其他应用程序的数据
Android具体限制多方面
此行为可能会被 Google Play 阻止
如果您打算将此应用放入 Google 中,请进行验证
Play 商店,因为它被认为是恶意的。
我还可以告诉你,如果你能找到一种方法来实现这一点,那么它将需要
一个会给你root权限的漏洞。一旦你有根
(通过漏洞利用)然后剩下的就很容易用基本的命令行来完成
实用程序(mount
和 dd
,特别是)。
从商业角度来看,如果可能的话,您的应用会
让取证软件停业 :) 请记住,取证软件
执行此过程的软件也需要原始访问权限
需要物理访问设备的分区 and/or
设备上的根访问权限。
你得到java.io.FileNotFoundException
的原因是
因为您使用的 API 可以让您访问文件系统级别
以及您需要的绕过文件系统功能。你会
永远不要使用文件系统调用对分区进行原始访问。
我认为此列表可以回答您的问题。如果不首先获取 root 权限,您将无法执行此操作,否则 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 应用程序获得这种访问权限 - 有几件事需要考虑:
- Android 允许您从您的应用程序访问文件系统 - 而不是对分区的原始访问。
- 您通常需要卸载 partition/file 系统才能 逐字节访问,因为您不希望获得任何权限 按照您的方式,您只能以 root 用户身份卸载。
如果你是 root 那么你可以卸载驱动器然后发出一个
dd
命令创建一个带有原始图像的新文件 喜欢:Runtime.getRuntime().exec("su -c dd if=/dev/deviceToRead1> of=rawOutputFile");
我可以告诉你,如果这可以从非 root 设备上进行,那么它将被处理 作为将尽快修补的安全漏洞,因为它会 将整个 phone 及其上的所有数据置于危险之中。如果这 可以从非 root 设备进行,那么就可以 任何应用程序 steal/read 来自其他应用程序的数据 Android具体限制多方面
此行为可能会被 Google Play 阻止 如果您打算将此应用放入 Google 中,请进行验证 Play 商店,因为它被认为是恶意的。
我还可以告诉你,如果你能找到一种方法来实现这一点,那么它将需要 一个会给你root权限的漏洞。一旦你有根 (通过漏洞利用)然后剩下的就很容易用基本的命令行来完成 实用程序(
mount
和dd
,特别是)。从商业角度来看,如果可能的话,您的应用会 让取证软件停业 :) 请记住,取证软件 执行此过程的软件也需要原始访问权限 需要物理访问设备的分区 and/or 设备上的根访问权限。
你得到
java.io.FileNotFoundException
的原因是 因为您使用的 API 可以让您访问文件系统级别 以及您需要的绕过文件系统功能。你会 永远不要使用文件系统调用对分区进行原始访问。
我认为此列表可以回答您的问题。如果不首先获取 root 权限,您将无法执行此操作,否则 Android 的整个安全模型将被证明是无用的。