Экспертная система 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)
Текущее время: 22 февраля 2025, 11:32
Выполнено за 0.04 сек.