|
Вопрос # 1 073/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Как скопировать в файл загрузочную запись с логич раздела, где стоит 98 виндовс с помощью Делфи (или как-нибудь еще), работая в другой операционной системе, установленной на этой машине?
 |
Вопрос задал: 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 можно найти в сети). Проанализимровав этот код можно будет делать предположения о том, что, откуда и какой длинны нужно копировать.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|