Прямой доступ к диску windows

Прямой доступ к жесткому диску?

Мне было интересно, как работает доступ к жесткому диску. Например, как я могу просматривать/изменять сектора? Я ориентируюсь на Windows, если это поможет. Спасибо

person
jmasterx
  
schedule
24.04.2010
  
source
источник


Ответы (2)

На на этой странице есть важная информация по этому вопросу:

Вы можете открыть физический или логический диск с помощью интерфейса прикладного программирования (API) CreateFile() с этими именами устройств при условии, что у вас есть соответствующие права доступа к диску (т. е. вы должны быть администратором). Вы должны использовать оба флага CreateFile() FILE_SHARE_READ и FILE_SHARE_WRITE, чтобы получить доступ к диску.

После открытия логического или физического диска вы можете выполнять прямой ввод-вывод данных на всем диске. При выполнении прямого дискового ввода-вывода вы должны выполнять поиск, чтение и запись в кратных размерах секторов устройства и на границах секторов. Вызовите DeviceIoControl() с помощью IOCTL_DISK_GET_DRIVE_GEOMETRY, чтобы получить количество байтов на сектор, количество секторов, секторов на дорожку и т. д., чтобы можно было вычислить размер буфера, который вам понадобится.

В документации CreateFile также содержатся некоторые подсказки:

Вы можете использовать функцию CreateFile, чтобы открыть физический диск или том, который возвращает дескриптор устройства хранения с прямым доступом (DASD), который можно использовать с функцией DeviceIoControl. Это позволяет получить прямой доступ к диску или тому, например, к таким метаданным диска, как таблица разделов. Однако этот тип доступа также подвергает диск или том потенциальной потере данных, поскольку неправильная запись на диск с использованием этого механизма может сделать его содержимое недоступным для операционной системы. Чтобы обеспечить целостность данных, обязательно ознакомьтесь с DeviceIoControl и тем, как другие API ведут себя по-разному с дескриптором прямого доступа, а не с дескриптором файловой системы.

person
Eli Bendersky
  
schedule
24.04.2010


Прямой доступ к диску для записи в Windows 7

При разработке программы для защиты флешек от вирусов возникла необходимость записи секторов напрямую на диск. Прямой доступ к диску осуществлялся через функцию CreateFile. Под Windows XP все работало нормально, а под Windows 7 при попытке записи сектора возвращалась ошибка Access Denied, при том, что при открытии диска на запись никаких ошибок не возникало. После длительных поисков причины было выяснено следующее: еще в самом начале разработки в Windows 7 была обнаружена критическая уязвимость. Если не вдаваться в нудные технические подробности, то смысл ее заключался в том, что злоумышленник мог открыть системный диск напрямую для записи и поместить любой злонамеренный код в файл подкачки. В Microsoft решили проблему с присущей им дубовой прямолинейностью — просто взяли и запретили прямую запись на диски. Но поскольку нельзя, но было очень нужно, то способ обхода защиты нашелся очень быстро. Оказывается, что запись на диски запрещена не полностью, система разрешает записывать данные в нулевую дорожку диска и в неразмеченные области. Такое поведение вполне объяснимо: надо же как-то форматировать диски штатными средствами без дополнительных танцев с бубнами. Значит для того, чтобы система разрешила запись в произвольное место диска, она сперва должна определить его как неразмеченный. А это достигается уничтожением нулевого сектора диска перед записью. Естественно, что перед уничтожением надо сохранить все данные из нулевого сектора в сухом прохладном месте, а потом вернуть их обратно.

Порядок действий следующий: открыть диск для чтения-записи, попробовать записать нужный сектор. Если произошла ошибка Access Denied, то надо прочитать нулевой сектор, записать вместо него нули, после этого обязательно закрыть диск. Это нужно, чтобы система при повторном обращении посчитала диск неразмеченным и разрешила запись в любой сектор. Затем снова открываем диск для чтения-записи. После записи нужных данных восстанавливаем нулевой сектор и закрываем диск. Все, наша задача выполнена, данные записаны, система спокойна. У этого способа есть и минусы. Так, если работа вашей программы по какой-то причине завершилась аварийно до момента, когда она восстановила нулевую дорожку, то данные на диске могут стать недоступны или вообще потеряться. Способ проверен и хорошо работает на съемных дисках с файловой системой FAT/FAT32, на стационарных жестких дисках и других файловых системах я его не проверял.

Вот фрагмент кода на Ассемблере, взятый из рабочего проекта. При необходимости его можно легко портировать на другие языки программирования.

        ; Открыть диск для чтения и записи
        invoke  CreateFile,drvName,GENERIC_READ+GENERIC_WRITE,\
                FILE_SHARE_READ+FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL
        ; Сохранить хэндл
        mov     [hFile],eax
 
        ; Сразу прочитать нулевую дорожку
        invoke  ReadFile,[hFile],mbr,512,tmp,NULL
 
        ; Установить смещение на нужный сектор
        invoke  SetFilePointer,[hFile],512*numberofsector,0,FILE_BEGIN
 
        ; Попытаться записать нужный сектор
        invoke  WriteFile,[hFile],new_sector,512,tmp,NULL
        or      eax,eax
        ; Ошибок записи не произошло
        jnz     close_drive_and_exit
 
        ; Получить код последней ошибки
        invoke  GetLastError
        ; Ошибка Access Denied?
        cmp     eax,5
        ; Произошла какая-то другая критическая ошибка
        jne     close_drive_and_exit
 
        ; Уничтожить нулевую дорожку
        invoke  SetFilePointer,[hFile],0,0,FILE_BEGIN
        invoke  WriteFile,[hFile],zerobuff,512,tmp,NULL
        ; Закрыть диск
        invoke  CloseHandle,[hFile]
 
        ; Открыть заново диск с уничтоженной дорожкой
        invoke  CreateFile,drvName,GENERIC_READ+GENERIC_WRITE,\
                FILE_SHARE_READ+FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL
        ; Сохранить хэндл
        mov     [hFile],eax
 
        ; Установить смещение на нужный сектор
        invoke  SetFilePointer,[hFile],512*numberofsector,0,FILE_BEGIN
 
        ; Записать нужный сектор
        invoke  WriteFile,[hFile],new_sector,512,tmp,NULL
 
        ; Записать нулевую дорожку обратно
        invoke  SetFilePointer,[hFile],0,0,FILE_BEGIN
        invoke  WriteFile,[hFile],mbr,512,tmp,NULL
 
close_drive_and_exit:
        ; Закрыть диск
        invoke  CloseHandle,[hFile]

Код приведен минимально необходимый, без дополнительной обработки возможных ошибок. В реальной ситуации, конечно, надо позаботиться о лучшей сохранности прочитанной нулевой дорожки, об обработке ситуации в случае ошибки записи данных на диск с уничтоженной нулевой дорожкой и т.д. Все это вы можете сделать самостоятельно.

Не зря говорится: «Что бы русский ни делал — все равно получается автомат Калашникова». Хотел как лучше, а в результате нашел способ как лишний раз наклонить защиту системы :)

I want to be able to read and write data directly to and from a disk (i.e. at a sector / cluster level) but I’ve yet to find a suitable tool for doing this under windows.

I’ve been trying to figure out how to write my own in C#, but the documentation I’ve found is sparse and only deals with C++ APIs.

Whats the best way of reading /writing directly to / from a drive in C#? (or can anyone recommend me a tool that allows me to read / write directly from a drive?)

asked Sep 9, 2009 at 12:48

Justin's user avatar

pinvoke.net has a collection of managed code wrappers for essentially all Win32 API’s, including those that can talk to the Disk Manager service and perform low level kernel/IO.

answered Sep 9, 2009 at 12:55

Jason's user avatar

JasonJason

28.1k10 gold badges64 silver badges64 bronze badges

1

Honestly, you probably need to look at Platform Invoke if you want to write this code in C#. It lets you interact with unmanaged platform APIs, which you mentioned is the bulk of the information you’ve found so far :-)

answered Sep 9, 2009 at 12:52

Joel Martinez's user avatar

Joel MartinezJoel Martinez

47k26 gold badges131 silver badges185 bronze badges

This question comes up on a search for terms related to block device write in .NET, so I’d like to embellish the original answers with some direct links.

First, you’ll be using a PInvoke to CreateFile to get a file handle.

PInvoke methods are used to import CreateFile into the .NET environment. MSDN have an example under their discussion of SafeFileHandle. If you want to create c# type for the parameters and return codes of CreateFile, there are some examples on PInvoke

However, you need to decide whether you want to write to physical device or a volume on it. Volumes correspond to partitions on the device. E.g. «\.\PhysicalDrive0» is the physical device, whereas «\.\C:» is the volume.

For details of the the available Win32 devices, use a C# version of QueryDosDevice Background on these Win32 devices, their naming convertion and relationship to O/S objects can be found in «Windows Internals» by Mark Russinovich.

answered Dec 7, 2011 at 12:44

Donal Lafferty's user avatar

Donal LaffertyDonal Lafferty

5,8177 gold badges44 silver badges60 bronze badges

Categories:

  • Компьютеры
  • IT
  • Cancel

Немного о прямом доступе к диску.

Существует такая замечательная возможность, как прямой доступ к жесткому диску компьютера, в обход BIOS материнской платы. Данную возможность предоставляют множество программ (программы разбиения дисков, низкоуровнего форматирования, криптоваяния, безопасного затирания информации и многие другие). Не все имеют представление, зачем может понадобиться такая возможность.
Приведу лишь один пример использования данной технологии.
Не так давно столкнулся в одной организации с тем, что BIOS моего компьютера оказался нестандартным, такого BIOS с такой хэш суммой не было даже на сайте производителя. Посмотрев описания компонентов компьютера нашел материнскую плату с такими же компонентами и скачал соответствующий BIOS. Затем попытался перепрошить полностью (заменить) BIOS своей материнской платы. Прошивка прошла успешно, компьютер перезагрузил. Все работало. Но мне давала покой одна небольшая проблемка, в BIOS оказались неперезаписываемы некоторые блоки (таблицы) Flash-памяти. ;-) Если посмотреть на описания на данный тип BIOS (можно найти в интернет), то окажется, что часть данных блоков (таблиц) отвечали за работу контроллера HDD материнскрой платы. После довольно длительных раздумий я решил сравнить информацию BIOS о HDD контроллера материнской платы и информацию о HDD при прямом доступе к HDD. HDD был по информации BIOS на 80 Gb. Для получения доступа к жесткому диску компьютера я воспользовался последовательно программами низкоуровневого форматирования, затирания информации по ГОСТу и программой разбиения диска на разделы.
Результат меня удивил. Оказалось, что жесткий диск на моем компьютере не на 80 Gb, как информировал BIOS, а на 160 Gb.
Решил проверить свои умозаключения по данному поводу в беседе со специалистами в данной области.
Немного пообщавшись в интернет, я выяснил, что имеется возможность для дублирования информации между видимой частью, которую выдавал BIOS, и другой частью, которая была доступная только при прямом доступе к диску.

Вот такая история. Поэтому следует обращать внимание не только на программную защиту, но и проверять программно-аппаратные компоненты вашего компьютера.

Надеюсь, что мой опыт окажется кому-то полезным. Удачи! ;-)

Источник

Прямой доступ к диску

Модератор: Модераторы

Прямой доступ к диску

Есть ли возможность под Windows обращаться к HDD напрямую (по секторам)?

mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Прямой доступ к диску

Сообщение SII » 20.12.2010 11:44:37

Есть, если позволяют права доступа. Насколько помню, диск открывается как файл с именем \\.\PHYSICALDRIVEnn или что-то в этом роде. Подробно в MSDN смотреть надо.

SII
новенький
 
Сообщения: 64
Зарегистрирован: 24.06.2007 17:15:09
Откуда: Зеленоград
  • Профиль
  • ICQ

Re: Прямий доступ к диску

Сообщение Nik » 20.12.2010 11:47:01

Сильно подозреваю, что придётся писать собственный драйвер. Возможность точно есть — такие программы, как Victoria работают с HDD из под Windows на самом низком уровне.

Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров
  • Профиль
  • Сайт

Re: Прямой доступ к диску

Сообщение Fess » 21.12.2010 02:18:32

возможность есть ,через API Createfile , тока по-моему там для НТ и обычного ядра имена дисков отличаются , после получения описателя (дескриптора) вызов функции низкого уровня доступ к секторам через регистры . если надо очень детализирую .

Добавлено спустя 4 минуты 57 секунд:
кстати, насколько помню права доступа не обязательны , т.к. функция -родная АПИ , ну в крайнем случае есть юзерпорт и портталк , подцепил модуль и поехал.

Fess
незнакомец
 
Сообщения: 2
Зарегистрирован: 03.12.2010 01:03:19

Re: Прямой доступ к диску

Сообщение mirk » 23.12.2010 02:30:26

если надо очень детализирую

Был бы очень рад небольшому примерчику ;)

mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Прямой доступ к диску

Сообщение coyot.rush » 23.12.2010 16:02:33

http://msdn.microsoft.com/en-us/library/aa363858.aspx

CreateFile…
Physical Disks and Volumes
Direct access to the disk or to a volume is restricted. For more information, see «Changes to the file system and to the storage stack to restrict direct disk access and direct volume access in Windows Vista and in Windows Server 2008» in the Help and Support Knowledge Base at

http://support.microsoft.com/kb/942448

.
Windows Server 2003 and Windows XP/2000: Direct access to the disk or to a volume is not restricted in this manner.

Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 306
Зарегистрирован: 14.08.2009 08:59:48

Re: Прямой доступ к диску

Сообщение mikro » 23.12.2010 18:53:28

mikro
незнакомец
 
Сообщения: 1
Зарегистрирован: 23.12.2010 18:12:47


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

  • Прыгает пинг в world of tanks windows 10
  • Прошивка биос asus из под windows
  • Простой редактор изображений для windows
  • Пунто свитчер не переключает раскладку windows 10
  • Прошивка bios msi из windows