Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 073

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Как скопировать в файл загрузочную запись с логич раздела, где стоит 98 виндовс с помощью Делфи (или как-нибудь еще), работая в другой операционной системе, установленной на этой машине?

Ilia Ermakov Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ilia Ermakov (статус: 1-ый класс)
Вопрос отправлен: 2 ноября 2007, 17:35
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Ilia Ermakov!
Неважно в какой операционной системе Вы работаете, всмысле откуда она загружена, прочитать MBR (первые 512 байт диска) можно обратившись к \\.\PHYSICALDRIVE0. Кстати и на запись тоже есть доступ.
Только загрузчики современных ОС намного больше, а в MBR распологается код загрузки основного загрузчика и передача на него управления.

Ниже код копирования MBR в файл (FASM):

format PE GUI 4.0
entry start

include 'C:\fasm\INCLUDE\win32a.inc'

MBR_SIZE = 512

section '.code' code readable executable

align 4
start:
invoke CreateFile, DeviceName, GENERIC_READ,\
FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING,\
FILE_ATTRIBUTE_NORMAL, 0
cmp eax, INVALID_HANDLE_VALUE
je @exit
push eax
invoke ReadFile, eax, MBR, MBR_SIZE, NumberOfBytesRead, NULL
test eax, eax
jz @close
invoke CreateFile, FileName, GENERIC_WRITE,\
FILE_SHARE_READ, 0, CREATE_ALWAYS,\
FILE_ATTRIBUTE_NORMAL, 0
cmp eax, INVALID_HANDLE_VALUE
je @close
push eax
invoke WriteFile, eax, MBR, MBR_SIZE, NumberOfBytesRead, NULL
call [CloseHandle]
@close:
call [CloseHandle]
@exit:
invoke ExitProcess, 0

section '.data' data readable writeable

DeviceName db '\\.\PHYSICALDRIVE0',0
FileName db 'MBR.bin',0

section '.udata' readable writeable

MBR rb MBR_SIZE
NumberOfBytesRead dd ?

section '.idata' import data readable

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'

include 'C:\fasm\INCLUDE\APIA\KERNEL32.INC'
include 'C:\fasm\INCLUDE\APIA\USER32.INC'

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 4 ноября 2007, 03:38
Оценка за ответ: 5

Комментарий к оценке: Прикольно. А в чем это компилировать? Делфи не понимает этот код.
И небольшое уточнение: на самом деле мне нужна не МБР, а основной загрузчик системы, я так понимаю, который находится на логическом разделе, где стоит ОС. То есть в приведенном коде нужно исправить вместо \\.\PHYSICALDRIVE0 на \\.\PHYSICALDRIVE1 ? или все гораздо сложнее?

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 5 ноября 2007, 07:57; участников в обсуждении: 1.
Матвеев Игорь Владимирович

Матвеев Игорь Владимирович (статус: Студент), 5 ноября 2007, 07:57 [#1]:

Это ассемблерный код для FASM - www.flatassembler.net/. Я думаю не нужно сильно знать ассемблер, чтобы воспроизвести этот код на Delphi, здесь только пара функций.

MBR запись располагается на нулевом цилиндре нулевой дорожки основного (master) логического диска. Когда стоит несколько ОС - в спец. файле (boot.ini) добавляются новые сведения (пара строк), которые читает загрузчик и предлагает выбрать ОС при страте.

Загрузчики у разных операционных систем разной длинны, Вы можете для начала скопировать MBR, дизассемблировать ее (там обращения к функциям BIOS, т.к. ни MS-DOS и что-либо другое еще не загруженно, стравочник по функциям BIOS можно найти в сети). Проанализимровав этот код можно будет делать предположения о том, что, откуда и какой длинны нужно копировать.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 17 декабря 2018, 05:42
Выполнено за 0.04 сек.
Рейтинг@Mail.ru