Ковыряние DELL (Phoenix 1993) BIOS

Тема в разделе "WASM.RESEARCH", создана пользователем aascut, 2 сен 2011.

  1. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Еще порекомендую автору программу дизассемблер - Sourcer от V Communication. Последняя версия - 7.00. Можно нарыть в интернетах. На вход ему скармливается XXXXX.ROM, на выходе получите обычный ассемблерный листинг или даже .ASM файл, с комментариями по прерываниям и портам. Удобная вещь.
     
  2. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    aascut
    Собственно не понял зачем вы вообще биос то ковыряете. То что в CMOS BIOS вы видите цифру 137 ещё ничего не означает.
    Лучше напишите какую ось используете и во сколько GB оценивает эта ось размер харда.
    Действительно, в начале 2002 года все производители добавляли в свои биосы поддержку LBA 48. Но, как мне кажется, эта поддержка ограничивалась только корректным отображением размера HDD. Хотя могу и ошибаться.
    ЗЫ. У меня Windows 98 работает спокойно с большими дисками, используя IDE драйвер от VIA (чипсет KT400A).
     
  3. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    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. Ну и пес с ними.. разберусь в конце.
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Сначала надо было проверить, что по адресу
    Код (Text):
    1. F000:930F                 jmp     far ptr 0F000h:0FFA0h ; Jump
    Просто в моем БИОС-е тоже команды есть по адресу F000:FFA0 :) Надо же смотреть все в комплексе.
    И главное : БИОС-ы сейчас из частей состоят и они часто запакованы, т.ч. непросто разобраться.
    Правда часть которая в F000 обычно незапакована.
     
  5. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Проверил, там (F000:930F) не этот jmp, а кусок кода из запакованной части БИОС начиная с адреса 00060610 (6000:0610). Выглядит так:8A 0E 81 00 8A 36 82 00 ну и т.д.
    Команды типа mov . Тогда что же получается. Где бут блок? Остался в верхних адресах что ли?
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Аккуратно разбирайся. Лучше всего из ДОС-а работать - делай полный дамп и потом ищи. А ты прыгаешь из firmware в дамп.
    Либо используй утилиты с rom.by Phoenix от 1993 должен быть.
     
  7. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    В заголовке темы ошибся, надо читать "Phoenix 1995-1998". Код выкуплен DELL и поддерживается только им.
    Еще вопрос, правильно ли я вычисляю смещение. Встретился такой код инициализации DRAM
    Код (Text):
    1. Дано ebx=00010000 (начальное значение), cs=F000
    2. F000:B7A9 66 C1 EB 10            shr   ebx, 10h                ; 3)ebx=00000001;
    3. F000:B7AD 0F BC D3                bsf   dx, bx                  ; 3)dx=0000;
    4. F000:B7B0 87 D3                     xchg  dx, bx                  ; 3)dx=0001;bx=0000
    5. F000:B7B0                                                                  
    6. F000:B7B2 2E 8A 87 F4 B7        mov   al, cs:[bx-480Ch]       ; 3)al=A0(A0?; ->
    7. F000:B7B2                                                                  ; offset=f0000-480C=fffff-480B=FB7F4)
    8. Т.е из нулевого значения вычитаем . Получаем отрицательное число FB7F4,
    9.  ставим флаг и берем значение смещения B7F4; смотрим адрес F000:B7F4???
    10. берем число по этому адресу и пихаем в al.
    или я не прав?
     
  8. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    Просто выполните эти команды в отладчеге (все равно каком раз они не зависят* от моды или уровня привилегий) или поставьте себе эмулятор (плагин IDA/etc) и выполните этот кусок в нем.

    * Код расчитан на use16 так что префиксы 66h тут могут вызвать некоторое разночтение (если выполнять, к примеру, в Olly).
     
  9. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    PSR1257II
    К стыду своему не умею пользоваться отладчиками. Пытался установить плагин emu
    X86 (для 5.5) в IDA 5.5- тоже не выходит. Если есть возможность - ткните носом, где качнуть(почитать про) откомпилированный эмуль для IDA 5.5. Статейки на этом сайте изучил, но на практике применить не могу в силу отсутствия опыта.
     
  10. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    Это практически элементарно (при минимальных знаниях асма). Качайте Olly (с WASM/etc) - если любите WIN32 интерфейс, или TD (turbo debugger) - если "DOS". (В первом нельзя отлаживать 16 битный код - а во втотром наоборот).

    Попробуйте, я объясню (или еще кто-то).
     
  11. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    PSR1257II
    Спасибо, попробую поковырять.
    Скачал emu8086, откомпилировал в нем эту строчку
    Код (Text):
    1. mov   al, cs:[bx-480Ch]
    Отладчик выдал результат:
    Код (Text):
    1. mov   al, cs:[bx]+B7F4
    , значит я был прав.
    Olly понравился интерфейсом, его можно в 16 бит моде запустить хоть как то?
     
  12. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    Если не ошибаюсь, в IDA в контекстном меню можно посмотреть и unsigned - так что может быть там тоже было видно это.

    Olly вряд ли, попробовал один раз - нет. Пробуйте td, он не хуже интерфейсом :) Наверняка есть еще много неплохих. В td можно трассировать части BIOS (например если зашел в int 13h). Также рекомендуют виртуальные среды (те полная эмуляция машины типа ~"bocus") - не пробовал, но многие стали пользовать.
     
  13. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    PSR1257II
    Эмулятор правильно называется bochs. Но отладчик там нетривиальный.
     
  14. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    А вот он куда родимый копируется:
    Код (Text):
    1. F000:48F2   Copy boot segment (3000h dwords=C000h bytes) to new address
    2. F000:48F2   into DRAM 00024000-00030000;
    3. F000:48F2
    4. F000:48F2  SHAD:                                   ; CODE XREF: F000:429FJ
    5. F000:48F2 66 BE 00 40 FF FF       mov   esi, 0FFFF4000h
    6. F000:48F8 66 BF 00 40 02 00       mov   edi, 24000h
    7. F000:48FE 66 B9 00 30 00 00       mov   ecx, 3000h
    8. F000:4904 66 8B D9                   mov   ebx, ecx                ; ebx=3000;
    9. F000:4907 F3 66 67 A5  rep movs dword ptr es:[edi], dword ptr [esi] ; Move Byte(s) from String to String
    10. F000:490B 0F 09                        wbinvd           ; Invalidate Data Cache (write changes)
    11. F000:490D                          Check copying C000h bytes
    12. F000:490D 66 BE 00 40 FF FF       mov   esi, 0FFFF4000h
    13. F000:4913 66 BF 00 40 02 00        mov   edi, 24000h
    14. F000:4919 66 B9 00 30 00 00        mov   ecx, 3000h
    15. F000:491F F3 66 67 A7          repe cmps dword ptr [esi], dword ptr es:[edi] ; Compare Strings
    16. F000:4923 74 17                         jz    short loc_F493C         ; jump if copying went well
     
  15. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Прошу прощения за ламерский вопрос по IDA: Дошел до момента передачи управления в новый сегмент(см. предыдущий пост).Как скопировать данные из старого(F000)в новый сегмент(2000) без потери данных в старом? Новый сегмент я создал.
    Код (Text):
    1. F000:42B5 EA BA 42 00 20  jmp   far ptr unk_242BA   ; jump to 000242BA address in
    2. F000:42B5                                                ; DRAM were is copy of BIOS
    3. F000:42B5                                                ; boot block(000F4000:000FFFFF)
    4. F000:42B5
     
  16. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    Не вполне понятно зачем если данные просто копируются (но не изменяются). Можно анализировать оригинальную копию. Хотя, конечно, если там жесткие смещения и оффсеты то будет выглядеть лучше если создать сегмент с точно такими же SEG:OFS (не забываем сохранять *.idb потому что нет отката!) - те F4000:что-то там).

    А вообще копировать можно так:

    0) Выбрать в меню File-> Load additional data from file -> и добавить кусок из файла (можно создать отдельный) - на этом этапе можно создать новый сегмент (seg=offset/16!);

    1) Напейсать скрипт *.IDC;

    2) Выполнить кусок копирования скриптом-эмулятором x86/etc;

    3) что-то еще ...
     
  17. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    PSR1257II
    О! Благодарю, получилось. Главная цель была, чтоб адресация правильная получилась.
    И оно работает, еще раз спасибо:
    Код (Text):
    1.  ---------------------------------------------------------------------------
    2. _2000:42BA                          USE 16;
    3. _2000:42BA                          This point is at the new segment in DRAM
    4. _2000:42BA                          0002:4000-0002:FFFF
    5. _2000:42BA
    6. _2000:42BA                          DRAM_BOOT_COPY:        ; CODE XREF: F000:42B5J
    7. _2000:42BA                                    db      66h        ; Load Interrupt Descriptor Table Register
    8. _2000:42BA 66 2E 0F 01 1E EC 48    lidt  fword ptr cs:byte_248EC
    9. _2000:42C1 66 B8 4B 41 54 53         mov   eax, 5354414Bh
    10. _2000:42C7 66 E7 E8                    out   0E8h, eax          ; DELL Indicator:"STAK"
    11. _2000:42CA B8 00 00                    mov   ax, 0
    12. _2000:42CD 8E D0                        mov   ss, ax               ; ss=0000 stack segment
    13. _2000:42CF BC F0 FF                 mov   sp, 0FFF0h           ; ss:sp=0000FFF0
    14. _2000:42D2 8E D8                         mov   ds, ax              ; ds=0000
    15. _2000:42D4 8E C0                        mov   es, ax               ; es=0000;
    16. _2000:42D6 0F 7E C3                    movd  ebx, mm0          ; ebx=41800004;
    17. _2000:42D9 66 53                         push  ebx                  ; save ebx
    18. _2000:42D9
    и т.д.
     
  18. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Просветление постепенно приходит. Правда пришлось расковырять весь бут блок. Но знания приобретенные бесценны- это хорошая зарядка для мозгов.
    Итак для 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 - данные регистров полностью совпадают. Вопрос только за что они отвечают?

    Дополнение: либо еще вариант когда вы вошли в биос поменяли параметры,нажали сохранить и вот тут опять биос по новому загружается.
     
  19. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Ошибка. Не совпадают.:dntknw:

    Размышления на эту тему:Делл БИОС использует LPC Generic IO Port 00000900h такие конструкции:
    Код (Text):
    1.   push  eax
    2. F000:5014 66 B8 6F 31 35 4B                  mov   eax, 4B35316Fh
    3. F000:501A 66 E7 E8                           out   0E8h, eax               ; "K51o" -8051??
    4. F000:501D 66 58                              pop   eax
    5. F000:501F BA 10 09                           mov   dx, 910h
    6. F000:5022 B0 82                              mov   al, 82h ; 'Â'
    7. F000:5024 EE                                 out   dx, al
    8. F000:5025 42                                 inc   dx                      ; Increment by 1
    9. F000:5026 B0 8C                              mov   al, 8Ch ; 'Ì'
    10. F000:5028 EE                                 out   dx, al
    :
    Очевидно, что в данном куске кода используются Index/Data порты(или регистры??) 10/11 (Base 0900h)
    Т.е. в индекс заносим номер регистра,в данном случае= 82h, затем данные =8Сh записываем в этот (82h) регистр.

    Другой пример. Порт 08, Base (0900h), при попытке чтения из которого отваливается DVD ROM привод.
     
  20. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Постоянно натыкаюсь на эти порты. Сейчас ковыряю упакованные блоки. Принцип там тот же что и в boot блоке. Есть ядро, в котором вычисляется адреса для джампов (коллов) для вызова блоков инициализации устройств(регистров), после отработки кола блока возврат в ядро вычисления нового адреса. Однако вычисление нового адреса сопровождается таким вот кодом:
    Код (Text):
    1. Дано ax=1006(1)....1010(последнее значение) меняется для каждого нового вычисленного адреса!
    2. F000:CAB5                    loc_FCAB5:     ; CODE XREF: sub_FCA98+8j
    3. F000:CAB5 002 51          push    cx
    4. F000:CAB6 004 8B C8      mov cx, ax    ; 1)cx=1006;3)cx=1007;4)cx=1008;
    5. F000:CAB6                                            5)cx=1009;...
    6. F000:CAB8                LPC GENERIC IO PORT (BAR:0900h) READ-WRITE
    7. F000:CAB8 004 BA 10 09   mov     dx, 910h
    8. F000:CABB 004 B0 86       mov     al, 86h ; 'Ж'
    9. F000:CABD 004 EE            out     dx, al
    10. F000:CABE 004 42           inc     dx              ; Increment by 1
    11. F000:CABF 004 8A C5       mov     al, ch
    12. F000:CAC1 004 EE           out     dx, al          ; 1)write 10 to reg#86;
    13. F000:CAC1                                                ; 3)write 10 to reg#86;
    14. F000:CAC1                                                ; 4)write 10 to reg#86;
    15. F000:CAC1                                                ; 5)write 10 to reg#86;
    16. F000:CAC2 004 BA 10 09    mov     dx, 910h
    17. F000:CAC5 004 B0 85        mov     al, 85h ; 'Е'
    18. F000:CAC7 004 EE            out     dx, al
    19. F000:CAC8 004 42             inc     dx              ; Increment by 1
    20. F000:CAC9 004 8A C1       mov     al, cl
    21. F000:CACB 004 EE            out     dx, al          ; 1)write 06 to reg#85;
    22. F000:CACB                                                 ; 3)write 07 to reg#85;
    23. F000:CACB                                                  ; 4)write 08 to reg#85;
    24. F000:CACB                                                  ; 5)write 09 to reg#85;
    25. F000:CACC 004 BA 10 09     mov     dx, 910h
    26. F000:CACF 004 B0 84          mov     al, 84h ; 'Д'
    27. F000:CAD1 004 EE              out     dx, al
    28. F000:CAD2 004 42             inc     dx              ; Increment by 1
    29. F000:CAD3 004 B0 00         mov     al, 0
    30. F000:CAD5 004 EE            out     dx, al          ; 1)write 00 to reg#84;
    31. F000:CAD5                                                 ; 3)write 00 to reg#84;
    32. F000:CAD5                                                 ; 4)write 00 to reg#84;
    33. F000:CAD5                                                 ; 5)write 00 to reg#84;
    34. F000:CAD6 004 BA 10 09     mov     dx, 910h
    35. F000:CAD9 004 B0 82         mov     al, 82h ; 'В'
    36. F000:CADB 004 EE              out     dx, al
    37. F000:CADC 004 42             inc     dx              ; Increment by 1
    38. F000:CADD 004 B0 98         mov     al, 98h ; 'Ш'
    39. F000:CADF 004 EE             out     dx, al          ; 1)write 98 to reg#82;
    40. F000:CADF                                                  ; 3)write 98 to reg#82;
    41. F000:CADF                                                  ; 4)write 98 to reg#82;
    42. F000:CADF                                                  ; 5)write 98 to reg#82;
    43. F000:CADF                                            ;
    44. F000:CAE0
    45. F000:CAE0          loc_FCAE0:                ; CODE XREF: sub_FCA98+52j
    46. F000:CAE0 004 BA 10 09       mov     dx, 910h
    47. F000:CAE3 004 B0 82           mov     al, 82h ; 'В'
    48. F000:CAE5 004 EE               out     dx, al
    49. F000:CAE6 004 42               inc     dx              ; Increment by 1
    50. F000:CAE7 004 EC            in      al, dx          ; read reg.#82
    51. F000:CAE7                                               ; al=??
    52. F000:CAE8 004 0A C0       or      al, al          ; Logical Inclusive OR
    53. F000:CAEA 004 75 F4      jnz     short loc_FCAE0 ; wait while al=00??
    54. F000:CAEC                   execute if al=00:
    55. F000:CAEC 004 59            pop     cx
    56. F000:CAED
    57. F000:CAED     loc_FCAED:        ; CODE XREF: sub_FCA98+1Bj
    58. F000:CAED 002 58       pop     ax
    59. F000:CAEE 000 C3     retn                    ; to F000:63B9
    60. В коментах только мои предположения и ничего более.
    В коде F000:CAE0-F000:CAEA передача данных?? Ждем последнего байта??
    Может кому покажется знакомой реализация подскажите!