Еще порекомендую автору программу дизассемблер - Sourcer от V Communication. Последняя версия - 7.00. Можно нарыть в интернетах. На вход ему скармливается XXXXX.ROM, на выходе получите обычный ассемблерный листинг или даже .ASM файл, с комментариями по прерываниям и портам. Удобная вещь.
aascut Собственно не понял зачем вы вообще биос то ковыряете. То что в CMOS BIOS вы видите цифру 137 ещё ничего не означает. Лучше напишите какую ось используете и во сколько GB оценивает эта ось размер харда. Действительно, в начале 2002 года все производители добавляли в свои биосы поддержку LBA 48. Но, как мне кажется, эта поддержка ограничивалась только корректным отображением размера HDD. Хотя могу и ошибаться. ЗЫ. У меня Windows 98 работает спокойно с большими дисками, используя IDE драйвер от VIA (чипсет KT400A).
Tronix Посмотрю прогу спасибо, но 1 Мб кода смотреть ИМХО напрягает заранее. T800 Ось WinXP SP3 видит диск целиком. Acronis тоже самое. Диск от WD. У них (WD)есть корявая утилита (на крайний случай) которая записывает в бут сектор диска драйвер для 48 LBA, и типа все работает нормально. Почитав вопли владельцев D610 на форуме техподдержки DELLa, подумал ну лохи, все вроде же нормально работает, ан нет. И я бы не стал заморачиваться на этот счет, если бы вдруг в один прекрасный день диск из DMA5 не слетел в PIO. И так два раза. Стал ковырять БИОС, так как мне стало интересно. Посмотрел ДАМП из ДОСа, по адресу F000:FFA0 лежит jmp far ptr _F6380; бинарный код EA 80 63 00 F0. Ну и естественно то что там лежит не совпадает с содержимым моего ххххх.ROM по тем же адресам, хотя отдаленно напоминает. В бинарнике БИОСА по адресу джампа - нелогичные команды для Real Mode. Ну и пес с ними.. разберусь в конце.
Сначала надо было проверить, что по адресу Код (Text): F000:930F jmp far ptr 0F000h:0FFA0h ; Jump Просто в моем БИОС-е тоже команды есть по адресу F000:FFA0 Надо же смотреть все в комплексе. И главное : БИОС-ы сейчас из частей состоят и они часто запакованы, т.ч. непросто разобраться. Правда часть которая в F000 обычно незапакована.
Проверил, там (F000:930F) не этот jmp, а кусок кода из запакованной части БИОС начиная с адреса 00060610 (6000:0610). Выглядит так:8A 0E 81 00 8A 36 82 00 ну и т.д. Команды типа mov . Тогда что же получается. Где бут блок? Остался в верхних адресах что ли?
Аккуратно разбирайся. Лучше всего из ДОС-а работать - делай полный дамп и потом ищи. А ты прыгаешь из firmware в дамп. Либо используй утилиты с rom.by Phoenix от 1993 должен быть.
В заголовке темы ошибся, надо читать "Phoenix 1995-1998". Код выкуплен DELL и поддерживается только им. Еще вопрос, правильно ли я вычисляю смещение. Встретился такой код инициализации DRAM Код (Text): Дано ebx=00010000 (начальное значение), cs=F000 F000:B7A9 66 C1 EB 10 shr ebx, 10h ; 3)ebx=00000001; F000:B7AD 0F BC D3 bsf dx, bx ; 3)dx=0000; F000:B7B0 87 D3 xchg dx, bx ; 3)dx=0001;bx=0000 F000:B7B0 F000:B7B2 2E 8A 87 F4 B7 mov al, cs:[bx-480Ch] ; 3)al=A0(A0?; -> F000:B7B2 ; offset=f0000-480C=fffff-480B=FB7F4) Т.е из нулевого значения вычитаем . Получаем отрицательное число FB7F4, ставим флаг и берем значение смещения B7F4; смотрим адрес F000:B7F4??? берем число по этому адресу и пихаем в al. или я не прав?
aascut Просто выполните эти команды в отладчеге (все равно каком раз они не зависят* от моды или уровня привилегий) или поставьте себе эмулятор (плагин IDA/etc) и выполните этот кусок в нем. * Код расчитан на use16 так что префиксы 66h тут могут вызвать некоторое разночтение (если выполнять, к примеру, в Olly).
PSR1257II К стыду своему не умею пользоваться отладчиками. Пытался установить плагин emu X86 (для 5.5) в IDA 5.5- тоже не выходит. Если есть возможность - ткните носом, где качнуть(почитать про) откомпилированный эмуль для IDA 5.5. Статейки на этом сайте изучил, но на практике применить не могу в силу отсутствия опыта.
Это практически элементарно (при минимальных знаниях асма). Качайте Olly (с WASM/etc) - если любите WIN32 интерфейс, или TD (turbo debugger) - если "DOS". (В первом нельзя отлаживать 16 битный код - а во втотром наоборот). Попробуйте, я объясню (или еще кто-то).
PSR1257II Спасибо, попробую поковырять. Скачал emu8086, откомпилировал в нем эту строчку Код (Text): mov al, cs:[bx-480Ch] Отладчик выдал результат: Код (Text): mov al, cs:[bx]+B7F4 , значит я был прав. Olly понравился интерфейсом, его можно в 16 бит моде запустить хоть как то?
Если не ошибаюсь, в IDA в контекстном меню можно посмотреть и unsigned - так что может быть там тоже было видно это. Olly вряд ли, попробовал один раз - нет. Пробуйте td, он не хуже интерфейсом Наверняка есть еще много неплохих. В td можно трассировать части BIOS (например если зашел в int 13h). Также рекомендуют виртуальные среды (те полная эмуляция машины типа ~"bocus") - не пробовал, но многие стали пользовать.
А вот он куда родимый копируется: Код (Text): F000:48F2 Copy boot segment (3000h dwords=C000h bytes) to new address F000:48F2 into DRAM 00024000-00030000; F000:48F2 F000:48F2 SHAD: ; CODE XREF: F000:429FJ F000:48F2 66 BE 00 40 FF FF mov esi, 0FFFF4000h F000:48F8 66 BF 00 40 02 00 mov edi, 24000h F000:48FE 66 B9 00 30 00 00 mov ecx, 3000h F000:4904 66 8B D9 mov ebx, ecx ; ebx=3000; F000:4907 F3 66 67 A5 rep movs dword ptr es:[edi], dword ptr [esi] ; Move Byte(s) from String to String F000:490B 0F 09 wbinvd ; Invalidate Data Cache (write changes) F000:490D Check copying C000h bytes F000:490D 66 BE 00 40 FF FF mov esi, 0FFFF4000h F000:4913 66 BF 00 40 02 00 mov edi, 24000h F000:4919 66 B9 00 30 00 00 mov ecx, 3000h F000:491F F3 66 67 A7 repe cmps dword ptr [esi], dword ptr es:[edi] ; Compare Strings F000:4923 74 17 jz short loc_F493C ; jump if copying went well
Прошу прощения за ламерский вопрос по IDA: Дошел до момента передачи управления в новый сегмент(см. предыдущий пост).Как скопировать данные из старого(F000)в новый сегмент(2000) без потери данных в старом? Новый сегмент я создал. Код (Text): F000:42B5 EA BA 42 00 20 jmp far ptr unk_242BA ; jump to 000242BA address in F000:42B5 ; DRAM were is copy of BIOS F000:42B5 ; boot block(000F4000:000FFFFF) F000:42B5
Не вполне понятно зачем если данные просто копируются (но не изменяются). Можно анализировать оригинальную копию. Хотя, конечно, если там жесткие смещения и оффсеты то будет выглядеть лучше если создать сегмент с точно такими же SEG:OFS (не забываем сохранять *.idb потому что нет отката!) - те F4000:что-то там). А вообще копировать можно так: 0) Выбрать в меню File-> Load additional data from file -> и добавить кусок из файла (можно создать отдельный) - на этом этапе можно создать новый сегмент (seg=offset/16!); 1) Напейсать скрипт *.IDC; 2) Выполнить кусок копирования скриптом-эмулятором x86/etc; 3) что-то еще ...
PSR1257II О! Благодарю, получилось. Главная цель была, чтоб адресация правильная получилась. И оно работает, еще раз спасибо: Код (Text): --------------------------------------------------------------------------- _2000:42BA USE 16; _2000:42BA This point is at the new segment in DRAM _2000:42BA 0002:4000-0002:FFFF _2000:42BA _2000:42BA DRAM_BOOT_COPY: ; CODE XREF: F000:42B5J _2000:42BA db 66h ; Load Interrupt Descriptor Table Register _2000:42BA 66 2E 0F 01 1E EC 48 lidt fword ptr cs:byte_248EC _2000:42C1 66 B8 4B 41 54 53 mov eax, 5354414Bh _2000:42C7 66 E7 E8 out 0E8h, eax ; DELL Indicator:"STAK" _2000:42CA B8 00 00 mov ax, 0 _2000:42CD 8E D0 mov ss, ax ; ss=0000 stack segment _2000:42CF BC F0 FF mov sp, 0FFF0h ; ss:sp=0000FFF0 _2000:42D2 8E D8 mov ds, ax ; ds=0000 _2000:42D4 8E C0 mov es, ax ; es=0000; _2000:42D6 0F 7E C3 movd ebx, mm0 ; ebx=41800004; _2000:42D9 66 53 push ebx ; save ebx _2000:42D9 и т.д.
Просветление постепенно приходит. Правда пришлось расковырять весь бут блок. Но знания приобретенные бесценны- это хорошая зарядка для мозгов. Итак для DELL в CMOS по адресу [62]:[63] записывается ID процессора, а потом от туда считывается перед переходом FFFA0. И не случайно записывается в dx. Оказалось все просто. Вариант перхода по данному адресу возможен лишь в случае, когда бут блок отработал, память проинициализировалась, началось опознание других устройств и возник сбой, вызвавший перезагрузку(см Дополнение). Перезагрузка мягкая без отключения проца и памяти. К этому моменту, в сегменте F000:0000-F000:FFFF лежит распакованный модуль из БИОСа (первый из упакованного блока 60000-С1048) ему то и передается управление джампом. А FFFA0 - это по сути точка входа для "продолжения банкета" Мы мыслили в верном направлении, за это всем помогавшим-благодарнось. Остался нерешенным вопрос про Generic LPC порты 00000900h. Но есть большие подозрения что это Super IO чип, Я просмотрел (при помощи RW report утилитки)порты 2E/2F и 910/911 - данные регистров полностью совпадают. Вопрос только за что они отвечают? Дополнение: либо еще вариант когда вы вошли в биос поменяли параметры,нажали сохранить и вот тут опять биос по новому загружается.
Ошибка. Не совпадают. Размышления на эту тему:Делл БИОС использует LPC Generic IO Port 00000900h такие конструкции: Код (Text): push eax F000:5014 66 B8 6F 31 35 4B mov eax, 4B35316Fh F000:501A 66 E7 E8 out 0E8h, eax ; "K51o" -8051?? F000:501D 66 58 pop eax F000:501F BA 10 09 mov dx, 910h F000:5022 B0 82 mov al, 82h ; 'Â' F000:5024 EE out dx, al F000:5025 42 inc dx ; Increment by 1 F000:5026 B0 8C mov al, 8Ch ; 'Ì' F000:5028 EE out dx, al : Очевидно, что в данном куске кода используются Index/Data порты(или регистры??) 10/11 (Base 0900h) Т.е. в индекс заносим номер регистра,в данном случае= 82h, затем данные =8Сh записываем в этот (82h) регистр. Другой пример. Порт 08, Base (0900h), при попытке чтения из которого отваливается DVD ROM привод.
Постоянно натыкаюсь на эти порты. Сейчас ковыряю упакованные блоки. Принцип там тот же что и в boot блоке. Есть ядро, в котором вычисляется адреса для джампов (коллов) для вызова блоков инициализации устройств(регистров), после отработки кола блока возврат в ядро вычисления нового адреса. Однако вычисление нового адреса сопровождается таким вот кодом: Код (Text): Дано ax=1006(1)....1010(последнее значение) меняется для каждого нового вычисленного адреса! F000:CAB5 loc_FCAB5: ; CODE XREF: sub_FCA98+8j F000:CAB5 002 51 push cx F000:CAB6 004 8B C8 mov cx, ax ; 1)cx=1006;3)cx=1007;4)cx=1008; F000:CAB6 5)cx=1009;... F000:CAB8 LPC GENERIC IO PORT (BAR:0900h) READ-WRITE F000:CAB8 004 BA 10 09 mov dx, 910h F000:CABB 004 B0 86 mov al, 86h ; 'Ж' F000:CABD 004 EE out dx, al F000:CABE 004 42 inc dx ; Increment by 1 F000:CABF 004 8A C5 mov al, ch F000:CAC1 004 EE out dx, al ; 1)write 10 to reg#86; F000:CAC1 ; 3)write 10 to reg#86; F000:CAC1 ; 4)write 10 to reg#86; F000:CAC1 ; 5)write 10 to reg#86; F000:CAC2 004 BA 10 09 mov dx, 910h F000:CAC5 004 B0 85 mov al, 85h ; 'Е' F000:CAC7 004 EE out dx, al F000:CAC8 004 42 inc dx ; Increment by 1 F000:CAC9 004 8A C1 mov al, cl F000:CACB 004 EE out dx, al ; 1)write 06 to reg#85; F000:CACB ; 3)write 07 to reg#85; F000:CACB ; 4)write 08 to reg#85; F000:CACB ; 5)write 09 to reg#85; F000:CACC 004 BA 10 09 mov dx, 910h F000:CACF 004 B0 84 mov al, 84h ; 'Д' F000:CAD1 004 EE out dx, al F000:CAD2 004 42 inc dx ; Increment by 1 F000:CAD3 004 B0 00 mov al, 0 F000:CAD5 004 EE out dx, al ; 1)write 00 to reg#84; F000:CAD5 ; 3)write 00 to reg#84; F000:CAD5 ; 4)write 00 to reg#84; F000:CAD5 ; 5)write 00 to reg#84; F000:CAD6 004 BA 10 09 mov dx, 910h F000:CAD9 004 B0 82 mov al, 82h ; 'В' F000:CADB 004 EE out dx, al F000:CADC 004 42 inc dx ; Increment by 1 F000:CADD 004 B0 98 mov al, 98h ; 'Ш' F000:CADF 004 EE out dx, al ; 1)write 98 to reg#82; F000:CADF ; 3)write 98 to reg#82; F000:CADF ; 4)write 98 to reg#82; F000:CADF ; 5)write 98 to reg#82; F000:CADF ; F000:CAE0 F000:CAE0 loc_FCAE0: ; CODE XREF: sub_FCA98+52j F000:CAE0 004 BA 10 09 mov dx, 910h F000:CAE3 004 B0 82 mov al, 82h ; 'В' F000:CAE5 004 EE out dx, al F000:CAE6 004 42 inc dx ; Increment by 1 F000:CAE7 004 EC in al, dx ; read reg.#82 F000:CAE7 ; al=?? F000:CAE8 004 0A C0 or al, al ; Logical Inclusive OR F000:CAEA 004 75 F4 jnz short loc_FCAE0 ; wait while al=00?? F000:CAEC execute if al=00: F000:CAEC 004 59 pop cx F000:CAED F000:CAED loc_FCAED: ; CODE XREF: sub_FCA98+1Bj F000:CAED 002 58 pop ax F000:CAEE 000 C3 retn ; to F000:63B9 В коментах только мои предположения и ничего более. В коде F000:CAE0-F000:CAEA передача данных?? Ждем последнего байта?? Может кому покажется знакомой реализация подскажите!