|
Asm/C++/Delphi/Py/PHP/VBA
|
|
MBR и прочие радости жёсткого диска30.06.2018, 16:48. Показов 8624. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|