Прямой доступ к жесткому диску?
Мне было интересно, как работает доступ к жесткому диску. Например, как я могу просматривать/изменять сектора? Я ориентируюсь на 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
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
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 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 LaffertyDonal Lafferty
5,8177 gold badges44 silver badges60 bronze badges
- Компьютеры
- 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 athttp://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