Прямой доступ к диску
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.140] |
|
|
Правила раздела Visual Basic: Общие вопросы
FAQ Сайта
FAQ Раздела
Кладовка
Наши Исходники
API-Guide
Поиск по Разделу
MSDN Library Online
Google
Прямой доступ к диску
|
Сообщ.
#1
,
|
|
|
|
Набросал функцию.
ВОпросик, можно ли таким методом найти и скрыть файл с диска ??? Найти, т.е. по имени, но не функциями FindFirst ... ![]() ![]() Option Explicit Private Const OPEN_EXISTING = 3 Private Const FILE_SHARE_READ = &H1 Private Const FILE_SHARE_WRITE = &H2 Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long Private Sub Form_Load() Dim MBR() As Byte Dim OV As OVERLAPPED Dim br As Long Dim hDrive As Long ReDim MBR(0 To 511) 'hDrive = CreateFile("\\.\PHYSICALDRIVE0", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) hDrive = CreateFile("\\.\C:", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) Caption = Err.LastDllError Call SetFilePointer(hDrive, 0, 0, 0) Call ReadFile(hDrive, MBR(0), 512, br, OV) Call CloseHandle(hDrive) Text1.Text = Replace(StrConv(MBR, vbUnicode), vbNullChar, "+") End Sub |
|
Сообщ.
#2
,
|
|
|
|
Читает ли этот код серийник диска ?
Прикреплённый файл HDD_READ.zip (1.98 Кбайт, скачиваний: 107)
|
|
Сообщ.
#3
,
|
|
|
|
Найти то можно, но для этого придется учитывать особенности каждой файловой системы.
А вот скрыть. Это как? написать файл в пустое место? И еще, по твоему в массиве MBR() хранится MBR диска, или почему ту его так назвал? |
|
Сообщ.
#4
,
|
|
|
|
Цитата Velin @ Найти то можно, но для этого придется учитывать особенности каждой файловой системы. А вот скрыть. Это как? написать файл в пустое место? И еще, по твоему в массиве MBR() хранится MBR диска, или почему ту его так назвал? Да просто я сначала MBR туда писал, потом так и осталось название |
|
Сообщ.
#5
,
|
|
|
|
|
Сообщ.
#6
,
|
|
|
|
|
Сообщ.
#7
,
|
|
|
|
у кого нить есть пример использования функций ZwCreateFile или ZwOpenFile
|
|
Сообщ.
#8
,
|
|
|
|
Цитата Zhenya @ Цитата SCINER @ Читает ли этот код серийник диска ? Вот, выдает какую-то муть (xp sp2) в системе ДВА жестких - матер и слэйв. Это не муть, это и есть MBR. 2SCINER: Картинки не грузяццо. |
|
Сообщ.
#9
,
|
|
|
|
Цитата ALXR @ Это не муть, это и есть MBR. Какая МВR? Я про серийник - там пусто! |
|
Сообщ.
#10
,
|
|
|
|
Цитата ALXR @ Цитата Zhenya @ Цитата SCINER @ Читает ли этот код серийник диска ? Вот, выдает какую-то муть (xp sp2) в системе ДВА жестких - матер и слэйв. Это не муть, это и есть MBR. 2SCINER: Картинки не грузяццо. ![]() На работе у меня грузились. Сейчас вот дома смотрю, тоже грузятся. Скорее всего это что-то у тебя. Ну так что, кто нить может помочь с ZwOpenFile ZwCreateFile на VB ? |
|
Сообщ.
#11
,
|
|
|
|
Хм.А что помогать? Прототипы функций у тебя есть? Описания? Ну вообще, если хочеш, давай в асю<203-529-473>, поболтаем.
|
|
Сообщ.
#12
,
|
|
|
|
Цитата Zhenya @ Цитата ALXR @ Это не муть, это и есть MBR. Какая МВR? Я про серийник - там пусто! Серийный номер тома в байтах, а не в виде человеко-понятных символов. См. документацию по MBR. |
|
Сообщ.
#13
,
|
|
|
|
Цитата Сколь это не прикольно, но в данной ситуации эта стандартная фраза звучит довольно комично. Ибо вся документация по MBR заключается в этом обрывке:См. документацию по MBR. ![]() ![]() typedef struct tagMBR { char res[444]; PARTITION partno[4]; DWORD signature; }MBR; И где, тут серийный номер? |
|
Сообщ.
#14
,
|
|
|
|
Цитата Velin @ Цитата Сколь это не прикольно, но в данной ситуации эта стандартная фраза звучит довольно комично. Ибо вся документация по MBR заключается в этом обрывке:См. документацию по MBR. ![]() ![]() typedef struct tagMBR { char res[444]; PARTITION partno[4]; DWORD signature; }MBR; И где, тут серийный номер? Уважаемый Velin, не стоит так скептически относится ко всему сказанному на форуме. Если Вам не удается найти нужные данные, то это не значит, что их там нет. Следующие операции вполне дают исчерпывающую информацию: ![]() ![]() C:\>LABEL C: Том в устройстве C: имеет метку LABEL Серийный номер тома: X1X2-X3X4 Метка тома (11 символов, ENTER - метка не нужна): Удалить текущую метку тома [Y(да)/N(нет)]? n Далее, в данных, возвращаемых с помощью процедуры SCINER'а из первого сообщения, можно найти байты X4, X3, X2, X1 (обращаю внимание, что они идут В ОБРАТНОМ ПОРЯДКЕ, как это обычно принято) по смещению 43h. Следующий код выводит серийный номер тома: ![]() ![]() Option Explicit Private Const OPEN_EXISTING = 3 Private Const FILE_SHARE_READ = &H1 Private Const FILE_SHARE_WRITE = &H2 Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long Private Sub Form_Load() Dim MBR() As Byte Dim OV As OVERLAPPED Dim br As Long Dim hDrive As Long, s As String, serial As String ReDim MBR(0 To 511) 'hDrive = CreateFile("\\.\PHYSICALDRIVE0", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) hDrive = CreateFile("\\.\C:", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) Call SetFilePointer(hDrive, 0, 0, 0) Call ReadFile(hDrive, MBR(0), 512, br, OV) Call CloseHandle(hDrive) s = StrConv(MBR, vbUnicode) serial = Mid(s, 68, 4) MsgBox "Серийный номер устройства: " & ClipHex(Mid(serial, 4, 1)) & ClipHex(Mid(serial, 3, 1)) & _ " - " & _ ClipHex(Mid(serial, 2, 1)) & ClipHex(Mid(serial, 1, 1)) End End Sub Function ClipHex(ByVal s As String) As String If s <> "" Then ClipHex = Right("00" & Hex(Asc(Left(s, 1))), 2) End Function PS: Уважаемый Velin, прошу впредь высказываться в темах менее категорично. Это оскорбляет. Спасибо за внимание. |
|
Сообщ.
#15
,
|
|
|
|
Цитата Уважаемый ALXR прошу Вас впредь читать содержимое топика. Это отсеит многие вопросы. Тогда вам станет понятно, чтоPS: Уважаемый Velin, прошу впредь высказываться в темах менее категорично а) то что хранится у скинера в переменной MBR это никакая не MBR(он сам это сказал) б) И как следствие, приведенное вами "доказательство" наличия в MBR серийного номера не верно ![]() Цитата А я и не отношусь. Рекомендую Вам брать пример, скажем с Васи, он хоть и модератор, не считает для себя почему-то оскорбительным, если его поправят. И даже признает, если вдруг нечянно ошибется(привести линк?). А вы почему-то начинаете возмущаться, что вас обижают. Лучше бы доказали, что правы. Уважаемый Velin, не стоит так скептически относится ко всему сказанному на форуме |
|
Сообщ.
#16
,
|
|
|
|
Цитата Velin @ Хм.А что помогать? Прототипы функций у тебя есть? Описания? Ну вообще, если хочеш, давай в асю<203-529-473>, поболтаем. Нет к сожалению у меня нет ни деклараций функций, ни типов. Т.е. по работе с файлами через Zw функйии вообще ничего нет. 2 ALXR У меня твой код показывает серийник 0000 - 0100 - это явно не серийник =( |
|
Сообщ.
#17
,
|
|
|
|
Цитата SCINER @ Цитата Velin @ Хм.А что помогать? Прототипы функций у тебя есть? Описания? Ну вообще, если хочеш, давай в асю<203-529-473>, поболтаем. Нет к сожалению у меня нет ни деклараций функций, ни типов. Т.е. по работе с файлами через Zw функйии вообще ничего нет. 2 ALXR У меня твой код показывает серийник 0000 - 0100 - это явно не серийник =( Ах, ну да, забыл дополнить. Этот адрес ФС-зависимый. На дисках с FAT32 у меня возвращается верный серийный номер, а на NTFS то же самое 0000 - 0100. В NTFS он лежит по адресу 48h. Вот, работающий на NTFS код: ![]() ![]() Option Explicit Private Const OPEN_EXISTING = 3 Private Const FILE_SHARE_READ = &H1 Private Const FILE_SHARE_WRITE = &H2 Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long Private Sub Form_Load() Dim MBR() As Byte Dim OV As OVERLAPPED Dim br As Long Dim hDrive As Long, s As String, serial As String ReDim MBR(0 To 511) hDrive = CreateFile("\\.\C:", GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) Call SetFilePointer(hDrive, 0, 0, 0) Call ReadFile(hDrive, MBR(0), 512, br, OV) Call CloseHandle(hDrive) s = StrConv(MBR, vbUnicode) serial = Mid(s, 73, 4) MsgBox "Серийный номер устройства: " & ClipHex(Mid(serial, 4, 1)) & ClipHex(Mid(serial, 3, 1)) & _ " - " & _ ClipHex(Mid(serial, 2, 1)) & ClipHex(Mid(serial, 1, 1)) End End Sub Function ClipHex(ByVal s As String) As String If s <> "" Then ClipHex = Right("00" & Hex(Asc(Left(s, 1))), 2) End Function 2Velin: а) то что хранится у скинера в переменной MBR это никакая не MBR(он сам это сказал) - увы и ах, но это все-таки MBR. В этом вопросе, по-видимому, Вы не очень компетенты и поэтому воздержитесь от резких высказываний. б) И как следствие, приведенное вами "доказательство" наличия в MBR серийного номера не верно - доказательство (без кавычек!) выше. |
|
Сообщ.
#18
,
|
|
|
|
Цитата Говорить это не черное а белое это конечно весьма аргументированно. увы и ах, но это все-таки MBR. Цитата Кажеться, я где то уже описывал свойство некоторых людей выдавать свое невежество за невежество других.В этом вопросе, по-видимому, Вы не очень компетенты ------ 2SCINER, я не знаю, какие прототипы у Zw-функций в um(вероятно, такие же), но в km прототип такой: ![]() ![]() NTSTATUS ZwCreateFile( OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength ); NTSTATUS ZwOpenFile( OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG OpenOptions ); |
|
Сообщ.
#19
,
|
|
|
|
Цитата Velin @ Цитата Говорить это не черное а белое это конечно весьма аргументированно. увы и ах, но это все-таки MBR. Цитата Кажеться, я где то уже описывал свойство некоторых людей выдавать свое невежество за невежество других.В этом вопросе, по-видимому, Вы не очень компетенты 1. Я считаю, что выше приведенный мною код вполне аргументирует мое высказывание. Сделайте резервную копию MBR с помощью какой-либо программы по работе с жесткими дисками и сравните полученные данные. 2. "Стрелки переводить" - не хорошо. В последнем Вашем сообщении не вижу ничего, что противоречит предыдущему моему сообщению, однако Вы продолжаете "гнуть" свое. Чье же здесь невежество? Кстати, номер <203-529-473> не найден. Я бы хотел пообщаться с Вами в icq. |
|
Сообщ.
#20
,
|
|
|
|
2SCINER: У тебя объявления NtCreateFile есть? Где ты ее будеш использовать?
2ALXR:Тогда дай свой, если не найден. А что противоречит - ты в своем коде читаеш header логического диска, видиш там серийный номер. Так? А потом вдруг утверждаеш, что серийный номер хранится в MBR |
|
Сообщ.
#21
,
|
|
|
|
Основные недостатки:
ALXR, в твоем коде вылазит месаг бокс и пишет что мол такой-то такой-то серийный номер устройства... Так какого устройства? Если жесткача, то какого? если их ДВА в системе и где второй серийник? Velin!!! ALXR!!! Развели тут спор! для чего вам приват?! спорьте там Добавлено Опять форум глючит |
|
Сообщ.
#22
,
|
|
|
|
Цитата Не устройства, а логического диска. Из кода лекго понять, что это серийный номер диска C. такой-то такой-то серийный номер устройства. |
|
Сообщ.
#23
,
|
|
|
|
Цитата SCINER @ таким методом найти и скрыть файл с диска а чем ZwQueryDirectoryFile не утраивает? |
|
Сообщ.
#24
,
|
|
|
|
Цитата Алиса @ Цитата SCINER @ таким методом найти и скрыть файл с диска а чем ZwQueryDirectoryFile не утраивает? устроит, если примерчиком поделишься или почитать чего нить подкинешь по теме |
|
Сообщ.
#25
,
|
|
|
|
в архиве простой пример перечисления без FindFile...
но на счет скрытия ZwQueryDirectoryFile надо перехватывать (хорошо бы на уровне системы в r0). здесь VB не катит:( блин, файл не цепляется. архив тебе в мыло ушел. |
|
Сообщ.
#26
,
|
|
|
|
Цитата Алиса @ в архиве простой пример перечисления без FindFile... но на счет скрытия ZwQueryDirectoryFile надо перехватывать (хорошо бы на уровне системы в r0). здесь VB не катит:( блин, файл не цепляется. архив тебе в мыло ушел. Спасибо, будем посмотреть. А зачем перехватывать, я просто хотел нарушить немного структуру файла, чтобы его вообще не видели никто кроме меня. |
|
Сообщ.
#27
,
|
|
|
|
Цитата А вас не беспокоит, что в один прекрасный момент драйвер файловой системы то же "не увидит" Ваш файл и запишет на его место что-нибудь еще? А зачем перехватывать, я просто хотел нарушить немного структуру файла, чтобы его вообще не видели никто кроме меня. |
|
Сообщ.
#28
,
|
|
|
|
Цитата Velin @ Цитата А вас не беспокоит, что в один прекрасный момент драйвер файловой системы то же "не увидит" Ваш файл и запишет на его место что-нибудь еще?А зачем перехватывать, я просто хотел нарушить немного структуру файла, чтобы его вообще не видели никто кроме меня. Но Windows не запишет в занятый сектор. А файл ведь можно уместить и просто в частично занятом секторе. |
|
Сообщ.
#29
,
|
|
|
|
Цитата Ну вообщето, ячейки для файлов в ФС называются кластерами. Как раз записать в частично занятый сектор Windows может запрасто. Проблема в том, что checkdisk может увидеть файл, запись о котором есть в ФС, но которого нету не в одной папке. И как Вы думаете, что он с ним сделает? Но Windows не запишет в занятый сектор |
|
Сообщ.
#30
,
|
|
|
|
Цитата И как Вы думаете, что он с ним сделает? ни чего!! такой метод применяеться при очистке оглавления. т.е. очистке таблицы файлов. просто файловая система может подумать что на этом месте пусто и записать туда новые данные. помоему такая фишка вообше на NTFS не получиться. SCINER, а ты выдел где ни нить такую реализацию?? |
|
Сообщ.
#31
,
|
|
|
|
Цитата maxim84_ @ Цитата И как Вы думаете, что он с ним сделает? ни чего!! такой метод применяеться при очистке оглавления. т.е. очистке таблицы файлов. просто файловая система может подумать что на этом месте пусто и записать туда новые данные. помоему такая фишка вообше на NTFS не получиться. SCINER, а ты выдел где ни нить такую реализацию?? нет не видел я вообще дисками не занимался раньше |