簡體   English   中英

如何從java訪問磁盤上的特定原始數據

[英]How to access specific raw data on disk from java

我正在嘗試使用以下代碼訪問原始磁盤中偏移量為 50 字節的一個字節。

randomAccessFile = new RandomAccessFile("C:", "r");
randomAccessFile.seek(50);
byte[] buffer = new byte[1];
randomAccessFile.read(buffer);

但我得到的只是以下錯誤:

java.io.FileNotFoundException: C: (Acceso denegado)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:98)
at pru.lseek.main(lseek.java:26)

有沒有辦法從java訪問驅動器中的精確字節?

我一直在尋找從物理驅動器訪問原始數據的可能性。 現在,當我開始使用它時,我只想告訴您如何操作。 您可以直接從 java 中訪問原始磁盤數據……只需以管理員權限運行以下代碼:

    File diskRoot = new File ("\\\\.\\PhysicalDrive0");
    RandomAccessFile diskAccess = new RandomAccessFile (diskRoot, "r");
    byte[] content = new byte[1024];
    diskAccess.readFully (content);

因此,您將獲得系統上第一個物理驅動器的第一個 kB。 要訪問邏輯驅動器 - 如上所述 - 只需將“PhysicalDrive0”替換為驅動器號,例如“D:”

哦,是的......我在Win 7系統上嘗試過Java 1.7......

只需在http://support.microsoft.com/kb/100027/en-us 上查看物理驅動器的命名

如果您有興趣在 Windows 下寫入原始卷,請嘗試此操作(需要 Java 7)。

  String pathname;
  // Full drive:
  // pathname = "\\\\.\\PhysicalDrive0";
  // A partition (also works if windows doesn't recognize it):
  pathname = "\\\\.\\GLOBALROOT\\ArcName\\multi(0)disk(0)rdisk(0)partition(5)";

  Path diskRoot = ( new File( pathname ) ).toPath();

  FileChannel fc = FileChannel.open( diskRoot, StandardOpenOption.READ,
        StandardOpenOption.WRITE );

  ByteBuffer bb = ByteBuffer.allocate( 4096 );

  fc.position( 4096 );
  fc.read( bb );
  fc.position( 4096 );
  //fc.write( bb ); // careful!

  fc.close();

當然,您必須確保設備可寫且不被系統訪問/鎖定。 還要確保您的應用程序以必要的權限(提升的權限)運行。

順便說一句:使用new RandomAccessFile(drive, "rw")似乎不起作用,因為 Java 不會以與原始設備兼容的模式打開文件句柄(例外是java.io.FileNotFoundException (The parameter is incorrect) )。 但是閱讀也可以與RandomAccessFile

RandomAccessFile 並不是為了打開目錄來操作條目,您需要創建或刪除文件。 “Acceso denegado”可能意味着訪問被拒絕。 要做到這一點,你需要 JNI。

編輯:你想要做的事情真的很復雜,沒有通用的方法來做到這一點。 您可以逐個扇區訪問硬盤,但是您必須解釋它的結構,這顯然取決於文件系統、FAT、NTFS、HPFS 等。

在 Linux 下,您可以嘗試打開/dev/<device> ,例如/dev/hda/dev/sdb2 這將使您能夠訪問原始磁盤(或僅分區),但需要您具有適當的權限——不過,“普通”用戶沒有這些權限。

Java 只能訪問文件。 Unix 將“原始設備”的概念作為 /dev 目錄中的文件,所以你想要的在那里是可能的。 但不是在 Windows 上,因為它沒有原始高清數據的這種文件表示。

在 Windows 中,您需要將原始設備標識符作為文件訪問。 如果您傳入文件“\\\\.\\c:”,它應該可以工作,您使用的是設備 UNC 名稱 \\.\\c:(\\. 表示這台機器)。

對於 Vista 及更高版本,我認為它不會正常工作,因為有一些機制可以防止設備驅動程序以外的任何內容對磁盤進行原始訪問(不要引用我的話)

@hunsricker:請注意,訪問原始設備需要一些權限(取決於驅動器:是否可移動/取決於 WinXP 的文件系統:允許使用 iso9660,不允許使用 FAT)。

另請注意,讀取的大小確實很重要(取決於操作系統):在 iso9660 文件系統上,讀取(1024 字節)在 XP 上有效,但在 7 上失敗。 在七上看起來讀取必須是塊對齊的:讀取(2048 字節)有效。

在 unix 中,您可以從/dev文件讀/寫。 (我不知道)

在 Windows 中,我認為您需要通過 JNI(Java 本機接口)讀取/寫入磁盤扇區。 調用一些 C 庫與操​​作系統對話。

更新:在 C 庫中,您可能需要使用 Win32API 來獲取文件句柄,例如CreateFile(..)函數。

https://metacpan.org/pod/Win32API::File

http://jan.newmarch.name/ssw/files/win32.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM