|
Asm/C++/Delphi/Py/PHP/VBA
|
|
MBR и прочие радости жёсткого диска30.06.2018, 16:48. Показов 8634. Ответов 50
Метки нет (Все метки)
Всем привет!
Возникло несколько вопросов, но смежных (про геометрию жёстких дисков и загрузочные области), к тому же, предполагающих простые ответы, поэтому буду спрашивать в одной теме... ![]() 1. Все ли диски имеют 63 сектора на дорожке? Или бывает меньше? 2. Всегда ли между MBR и первым разделом расстояние минимум 63 сектора (т.е. 62 сектора между ними)? Или бывает меньше (в каких-то системах)? 3. Возможно ли установить винду на диск с размером сектора, не равным 512 байт (и вообще, встречаются ли такие жёсткие диски?) 4. Встречается ли между MBR и первым разделом не нулевые заполнители, а какие-либо другие (скажем, из символов 255 или в виде повторяющихся слов а-ля 0x8000)? Кроме секторов со служебными данными, естественно. 5. Можно ли установить и успешно загружать винду с USB, имеющим формат не HDD-USB, а FDD-USB, т.е. с boot-сектором в начале, а не MBR? Полагаю, что как минимум Win95/98 можно.
2
|
|
| 30.06.2018, 16:48 | |
|
Ответы с готовыми решениями:
50
Считывание MBR жесткого диска Вероятно, повредил MBR жёсткого диска
|
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
| 05.07.2018, 08:43 | |
|
Если откатывать старый MBR назад в процессе отладки, то перед отладкой вручную сохрани старый MBR в последний сектор нулевой дорожки и для отката назад вручную его обратно копируй и все дела. Специально добавлять для этого дела чего-то в код MBR нет никакого смысла.
1
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||
| 05.07.2018, 09:28 [ТС] | |||
|
Ethereal,
![]() Артур, речь вообще про отладку сейчас не идёт. Схема такая. Программа инсталляции ищет свободный (или свободные) сектор среди 1..62 (если считать с 0), т.е. состоящий из повторяющихся слов. В него записывает оригинальный MBR, на 0-й сектор – свой код (старый MBR не модифицируется, а перезаписывается, разве что partitoin table сохраняется, если надо). Если код длиннее 446 байт, остальной наш код записывается в остальные свободные сектора. Загрузчик делает что ему надо и либо просто загружает оригинальный MBR, либо восстанавливает его и те самые "свободные сектора" в прежнее состояние. Добавлено через 4 минуты При этом инсталлятор должен не просто наивно сканировать сектора 1..62, но и проверить: а) Режим работы прошивки: UEFI или legacy BIOS (ибо при UEFI эта затея бессмысленна). Да и вообще - содержит ли MBR какой-то код или состоит из нулей (хотя бы в начале). б) Не является ли 0-й сектор на самом не MBR'ом, а boot-сектором (такое возможно при загрузке с флехи, отформатированной как USB-FDD). в) Не начинается ли какой-либо из разделов раньше, чем с 63-го сектора. Добавлено через 11 минут Ещё навороты: если код нашей внедряемой программы очень большой (скажем, на 60 секторов), то для повышения успешности работы можно искать не только сектора с повторяющимися словами, но и сектора, в которых помимо повторяющихся слов есть ещё и несколько информационных (скажем, до 32-х или 64-х шт; алгоритм Бойера-Мура в помощь). Таким образом можно "сжать" сектор, содержащий 32 слова данных + повторяющиеся слова, по крайней мере, до 98 байт (вместо 512, т.е. "слово-заполнитель", "номер слова + само слово", "номер слова + само слово"...). Хотя не знаю, насколько это практически целесообразно, т.к. лично у меня такой сектор только один и то на GPT. Кстати, 7-ка и 10-ка (надо думать, что и 8-ка тоже) размечает диски таким образом, что у них первый раздел начинается аж с 2048-го сектора! Не знаю, как в XP, можно проверить... Добавлено через 9 минут А вот на XP (смотрю под виртуалкой) почему-то первый раздел начинается аж с 56-го сектора! О как! Так что, с такими делами нужно быть осторожнее: Добавлено через 6 минут
1
|
|||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
| 05.07.2018, 10:54 | |
|
Ну так и сказал бы, что пишешь что-то наподобие загрузочного вируса
![]() Так вот в былые времена, когда таковые размножались, не было у них алгоритма, который был бы корректен в любом случае. Заражение двумя разными вирусами одновременно могло приводить к тому, что диск переставал загружаться. Например, если оба вируса сохраняли оригинальный MBR в один и тот-же сектор, то загрузка зацикливалась. Так-что всегда закладывались на то, что алгоритмы будут работать в подавляющем большинстве случаев, но не всегда. В твоем случае. Ну например так - сохранять предыдущий MBR в сектор 0-й дорожки, не входящий в первый раздел, и содержащий одни одинаковые байты. Если такового не найдено, то не заражать. Также не заражать, если диск заражен УЖЕ. Вот так выходит и просто в реализации и более-менее прилично. Как ты собрался заражать USB-FDD я пока не понял. Критерий отличия MBR и бут-сектора простой и надежный не ясен. И сохранять предыдущую копию некуда. Бесхозных секторов-то уже нет. Когда-то загрузочные вирусы, что заражали дискеты, копировали старый бут-сектор в самый последний сектор дискеты. Но если дискету заполняли файлами полностью, то этот сектор затирался и дискета становилась незагружаемой. То есть тут надежного алгоритма, работающего всегда, не было вообще. Некоторые вирусы для сохранения старого бут-сектора форматировли заграничную дорожку (41-ю или 81-ю) и сохраняли туда. Но к твоей задаче такая техника не подходит. Короче, как заражать HDD более менее ясно, но как USB-FDD пока нет.
1
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||
| 05.07.2018, 13:29 [ТС] | |||
|
Собственно, наибольшую путаницу пока вносит тема с не-512-байтовыми секторами.
Не могу взять в толк, как с ними работать (тем более, что у меня нет таких примеров, а SSD показывает 512 как из-под DOS – ah=48h/int 13h, так и из-под винды: IOCTL_DISK_GET_DRIVE_GEOMETRY). Т.е. что я получу, если запрошу сектор LBA 1 через ah=42h/int 13h (или через ah=2)? Что я получу, если открою диск (PhysicalDrive) через CreateFile и прочту 512 байт, начиная со смещения 512? Для диска с 4K-секторами, например. Добавлено через 7 минут Ничего такого я не собираюсь делать (тем более, нынче это, ИМХО, не особо актуально... хотя WannaCry был недавно, но это не ко мне)! ![]() Критерий у меня пока такой: первый байт EB или E9 (jmp short/near) + слово по смещению 0x0B = 200h (размер сектора) + partition table либо пуст, либо признак активности хотя бы одного из разделов != 0x80 (т.е. ([0x1BEh] or [0x1CEh] or [0x1DEh] or [0x1EEh]) and 0x7F != 0). Пока не знаю, какие ещё признаки можно выделить. Есть идеи – делитесь! ![]() Добавлено через 6 минут Но тут, согласен, 100% гарантии тоже нет. И у MBR может быть jmp в начале (чтобы расположить свою сигнатуру, например, по смещению 2 или 3), и 200h может оказаться по смещению 0x0B, и таблица разделов пустой. А boot-сектор можно и с call начать (хотя куда адрес возврата будет записан - х/з) или с какого-нибудь stc+jc и пр. Чисто для прикола!
1
|
|||
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
||
| 06.07.2018, 00:58 | ||
|
1
|
||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||||
| 06.07.2018, 12:29 | ||||
|
Добавлено через 1 минуту Добавлено через 10 минут
1
|
||||
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
|||||
| 06.07.2018, 13:45 | |||||
|
Добавлено через 39 секунд Jin X, ты можешь описать задачу в целом? Добавлено через 6 минут
1
|
|||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
| 06.07.2018, 13:51 | |
|
1
|
|
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
||
| 06.07.2018, 13:57 | ||
|
1
|
||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||||
| 06.07.2018, 14:14 | ||||
|
Добавлено через 1 минуту Добавлено через 2 минуты Задачу его я не знаю. Но если ему нужен свой MBR, ну давайте говорить именно про это. Если бы была известна его задача, то тогда бы можно было подумать можно ли решить ее по другому.
1
|
||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||
| 06.07.2018, 18:17 [ТС] | ||||
![]() А если серьёзно, то я тоже не очень понимаю, как ещё, помимо встраивания в MBR кода для работы с файловыми системами, можно ещё работать с файлами. Если так делает grub, то флаг ему в руки, но это не самый простой и оптимальный путь. Но для grub'а это просто необходимо. И grub, насколько я понимаю, устанавливается на вновь размеченные диски, а не "внедряется" в уже существующую систему. Ещё пример использования. Лет 15 назад (когда дискеты были ещё в ходу, а порядок загрузки менялся только в настройках BIOS'а, а не по нажатию клавиши после POST) я писал прогу, которая внедрялась в MBR и при удержании Ctrl (или другой клавиши) загружала систему с дискеты. ![]() Ну вообще, задачи разные есть. Но раз мы затронули эту темы, было бы интересно (т.к. я этим ещё не занимался, но интересно): 1. Как настроить загрузчик Windows (от NT до 10) так, чтобы он загружал и запускал наш код (из файла) до загрузки ядра? И будут ли ему доступны какие-либо функции, кроме BIOS'овских? И это будет а-ля DOS COM или ...что? 2. Как запустить нашу прогу (уже нормальный PE EXE с поддержкой WinAPI) после загрузки ядра Windows, но ещё до загрузки всего остального? Короче говоря, как загружается chkdsk при проверке системного раздела на ошибки.
1
|
||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||||||||
| 07.07.2018, 13:19 | ||||||||
Сообщение было отмечено Mikl___ как решение
Решение
Добавлено через 12 минут Посмотрел сейчас свежим взглядом этот мой старый код, а там ошибка. Если бут-сектор подчитан с адреса 7С00h, то сообщения об ошибке по адресу 7C00h+(Text-Start) уже нет, оно затерто. Надо было написать 600h+(Text-Start) и брать его из копии MBR в памяти, а не из уже затертого оригинала. Добавлено через 1 час 7 минут Там в коде есть такие фишки. Чтобы передавать управление от оригинала MBR к его копии и от копии к бут-сектору не обязательно использовать дальние переходы. Можно ближние. У ближнего перехода относительная адресация и jmp метка порождает в коде команды E9 jmp near смещение перехода равное (адрес_метки - адрес_следующего_байта_за_jmp). Но к этому смещению можно вручную прибавлять абсолютные значения. Так-что jmp Next-7C00h+600h прыгнет из оригинала MBR лежащего с адреса 7С00h на метку Next, но уже не в оригинале, а в его копии, лежащей с адреса 600h. Поскольку смещение перехода будет принудительно поправлено на -7600h
1
|
||||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||||
| 07.07.2018, 14:55 [ТС] | ||||||
|
fasm/NASM в этом плане удобнее.
Можно написать jmp 0x7C00 и всё ![]() TASM/MASM такого не позволит. Хотя можно написать:
1
|
||||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||
| 07.07.2018, 15:15 | ||
|
1
|
||
|
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
|
|
| 07.07.2018, 15:19 | |
|
1
|
|
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
| 07.07.2018, 16:02 | |
|
У fasm-а неудобнее в другом месте. org смещение не даст заполнения образа кода нулями от верхушки уже накомпилированного образа вплоть до этого смещения. То, что после org пристыковывается в образе кода к тому, что было до. То есть у TASM-а и FASM-а org-и имеют разный смысл. И я не нашел как в FASM-е сделать org по TASM-овски. Самое простое - как в FASM-е поместить 55 AA в конец 512-байтной области не мучаясь указанием сколько именно заполнителя потребуется перед 55 AA ? А если и указывать, то раз до этого уже были использованы org 0x7C00 и org 0x600 получится какое-то кошмарное выражение. В котором надо будет сложить сколько кода накомпилировалось после org 0x7C00, сколько после org 0x600. Так-что TASM<->FASM нос вылез, хвост увяз ...
Добавлено через 15 минут В отличие от директивы ORG, применяемой MASM-совместимыми ассемблерами, которые позволяют перемещаться в объектном файле и переписывать уже сгенерированный код, NASM-овская ORG означает только то, что и соответствующее слово: origin (начало). Ее единственная функция — задавать смещение, которое будет прибавляться ко всем ссылкам на адреса внутри файла
1
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||||||||||||||||||||
| 07.07.2018, 18:37 [ТС] | |||||||||||||||||||||
![]()
org 0x7C00 в начале нет, пишем сразу org 0x600 и всё. Ну или как-то так:
1
|
|||||||||||||||||||||
|
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
|
|||||||||||||
| 07.07.2018, 21:28 | |||||||||||||
вывод при компиляции (build.txt):
версия масм - 6.11
2
|
|||||||||||||
|
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
|
|
| 07.07.2018, 21:32 | |
|
Ах, да, листинг: 1 (2).zip
1
|
|
| 07.07.2018, 21:32 | |
|
Smartsputnik и прочие прилагаемые радости Куча была повреждена и прочие радости DOS виснет на int 13h при чтении MBR жесткого диска
Ремонт логической "части" жёсткого диска, перезапись MBR и восстановление Partition Table Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
|
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время?
Никакой пенсии. Никакого нового. . .
|