Восстановление данных. Практическое руководство
0x0040 bf 00 7e be 00 7c f3 a4-e9 00 02 fb bd 00 7e 8b ┐.~╛.|єдщ..√╜.~Л0x0050 fd be be 01 b9 04 00 80-3a 80 74 0b 83 c6 10 e2 ¤╛╛.╣..А:Аt.Г╞.т0x0060 f6 8b b5 b2 01 eb 51 56-83 c6 10 49 e3 0b 80 3a ЎЛ╡▓.ыQVГ╞.Iу.А:0x0070 80 75 f5 8b b5 b0 01 eb-3f 5e 56 8a 12 8a 72 01 АuїЛ╡░.ы?^VК.Кr.0x0080 8a 4a 02 8a 6a 03 bb 00-7c be 05 00 56 b8 01 02 КJ.Кj.╗.|╛..V╕..0x0090 cd 13 73 0e 33 c0 cd 13-5e 4e 75 f0 8b b5 b4 01 ═.s.3└═.^NuЁЛ╡┤.0x00a0 eb 16 5e be fe 7d 81 3c-55 aa 74 06 8b b5 b6 01 ы.^╛■}Б<Uкt.Л╡╢.0x00b0 eb 06 5e 03 f5 e9 48 fd-e8 1b 00 8b b5 b8 01 e8 ы.^.їщH¤ш..Л╡╕.ш0x00c0 14 00 b4 00 cd 16 33 c0-8е c0 26 c7 06 72 04 34 ..┤.═.3└О└&╟.r.40x00d0 12 ea f0 ff 00 f0 03 f5-ac 3c 00 74 0b 56 b4 0e .ъЁ .Ё.їм<.t.V┤.0x00e0 bb 07 00 cd 10 5e eb f0-c3 49 6e 76 61 6c 69 64 ╗..═.^ыЁ├Invalid0x00f0 20 70 61 72 74 69 74 69-6f 6e 20 74 61 62 6c 65 partition table0x0100 00 44 69 73 6b 20 69 73-20 6e 6f 74 20 62 6f 6f .Disk is not boo0x0110 74 61 62 6c 65 00 45 72-72 6f 72 20 6c 6f 61 64 table.Error load0x0120 69 6e 67 20 6f 70 65 72-61 74 69 6e 67 20 73 79 ing operating sy0x0130 73 74 65 6d 00 4d 69 73-73 69 6e 67 20 6f 70 65 stem.Missing ope0x0140 72 61 74 69 6e 67 20 73-79 73 74 65 6d 00 0d 0a rating system...0x0150 52 65 70 6c 61 63 65 20-61 6e 64 20 73 74 72 69 Replace and stri0x0160 6b 65 20 61 6e 79 20 6b-65 79 20 77 68 65 6e 20 ke any key when0x0170 72 65 61 64 79 0d 0a 00-00 00 00 00 00 00 00 00 ready...........0x0180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................0x0190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................0x01a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 45 06 ..............E.0x01b0 e9 00 01 01 16 01 35 01-4e 01 6a 72 a5 d5 00 00 щ.....5.N.jrе╒..0x01c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................0x01d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................0x01e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 01 ..............A.0x01f0 01 00 06 3f 20 5f 20 00-00 00 e0 ff 02 00 55 aa ...? _ ...p ..UkСоздаем MBR и пишем свой менеджер мультизагрузки
В этом разделе я расскажу, как написать собственный менеджер мультизагрузки. Менеджер мультизагрузки представляет собой код, находящийся в загрузочном секторе, и по выбору пользователя загружающий любую из нескольких операционных систем, установленных на компьютере. В процессе обсуждения вы познакомитесь с прерыванием
, таблицей разделов и т.д. Стандартный загрузчик, устанавливаемый большинством операционных систем по умолчанию, слишком примитивен, чтобы его воспринимать всерьез, а нестандартные загрузчики от независимых разработчиков обычно слишком неповоротливы и ненадежны. Вот и давайте напишем свой! Пока мы будем его писать, мы познаем дао и дзен ассемблера, научимся отлаживать программы без отладчика и поближе познакомимся с низкоуровневыми интерфейсами винчестера.INT 13hИнтерфейс INT 13hУправлять дисками можно как через порты ввода/вывода, так и через BIOS. Порты намного более могущественны и интересны, однако BIOS программируется намного проще, к тому же она поддерживает большое количество разнокалиберных накопителей, абстрагируясь от конструктивных особенностей каждой конкретной модели. Поэтому будем действовать через нее, а точнее, через интерфейс прерывания
.INT 13hПопробуем прочитать сектор с диска в режиме CHS. Действовать нужно из самой MBR или из "голой" MS-DOS, иначе у нас ничего не получится, ведь Windows NT блокирует прямой доступ к диску даже из режима эмуляции MS-DOS.
Номер функции заносится в регистр
. В случае чтения он равен двум. РегистрAHотвечает за количество обрабатываемых секторов. Так как мы собираемся читать по одному сектору за операцию, занесем сюда единицу. РегистрALхранит номер головки, aDH— номер привода (DL— первый жесткий диск,80h— второй и т.д.). Пять младших битов регистра81hзадают номер сектора, оставшиеся биты регистраCLи восемь битов регистраCLопределяют номер цилиндра, который мы хотим прочитать. Регистровая параCHуказывает на адрес буфера-приемника. Вот, собственно говоря, и все. После выполнения командыES:BXсчитываемые данные окажутся в буфере, а если произойдет ошибка (например, головка "споткнется" о BAD-сектор), то BIOS установит флаг переноса (carry flag), и мы будем вынуждены либо повторить попытку, либо вывести грустное сообщение на экран.INT 13hКод этой программы на языке ассемблера представлен в листинге 5.6.
Листинг 5.6. Код, считывающий загрузочный сектор или расширенную таблицу разделов
MOV SI, 1BEh ; Перейти к первому разделуMOV AX, CS ; Настраиваем ESMOV ES, AXMOV BX, buf ; Смещение буфера...read_all_partitions:MOV AX, bud ; Читать 1 сектор с дискаMOV DL, 80h ; Читать с первого дискаMOV DH, [SI+1] ; Стартовый номер головкиMOV CX, [SI+2] ; Стартовый сектор с цилиндром INT 13hJC error ; Ошибка чтения;Обрабатываем считанный boot-сектор или расширенную таблицу разделов;===================================================================;CMP byte [SI], 80hJZ LOAD_BOOT ; Это загрузочный сектор; Передаем на него управление