Ковыряние AMI BIOS

Тема в разделе "WASM.RESEARCH", создана пользователем mega_john, 7 дек 2010.

  1. mega_john

    mega_john New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    16
    Приветствую воинов дзена!
    Возникла такая проблема, купил новый винт в ноутбук размером 64гб
    (до этого стоял 60гб), а он, зараза такая, не определяется в биосе :dntknw:
    Всякие способы, зажимать HPA, бить на разделы, ни к чему не приводят.
    Диск рабочий, успешно определяется тулзами типа MHDD, HDAT2,
    на него даже можно установить виндовс, только вот загрузиться не получится...
    Как единственный выход из ситуации, я решил пропатчить биос, просто тупо сказать ему
    что винт установлен и грузиться нужно с него. Вобщем распаковал и биос на составляющие
    модули, и в одном месте нашел похожее место на определение параметров винта,
    а именно посыл команды: IDENTIFY DEVICE - ECh. А вот что дальше делать, не знаю, скилов моих не хватает. Видимо полученный буфер от винта анализируется в другом модуле и это место я уже найти не могу... В атаче лежат распакованные модули, функция определение находится в файле F0_User_Defined_or_Reserved.bin смещение 15D
    В общем помогите кто чем может, в решении данной проблемы
     
  2. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    mega_john

    Это похоже на процедуру чтения серийного нумера hdd (512 байт):

    Код (Text):
    1. seg000:015D sub_15D         proc near
    2. seg000:015D                 pusha
    3. seg000:015E                 mov     bx, dx
    4. seg000:0160                 call    wait_port_7     ; while(!(inportb(port+7)&0x40));
    5. seg000:0163                 jnb     short loc_167
    6. seg000:0165                 jmp     short not_ready
    7. seg000:0167 ; ---------------------------------------------------------------------------
    8. seg000:0167 ; outportb(port+6,0xA0+(drive<<4)); // ?
    9. seg000:0167
    10. seg000:0167 loc_167:                                ; CODE XREF: sub_15D+6j
    11. seg000:0167                 add     dx, 6
    12. seg000:016A                 shl     al, 4
    13. seg000:016D                 out     dx, al
    14. seg000:016E ; outportb(port+7,0xEC);
    15. seg000:016E                 mov     dx, bx
    16. seg000:0170                 add     dx, 7
    17. seg000:0173                 mov     al, 0ECh ; 'ý'
    18. seg000:0175                 out     dx, al
    19. seg000:0176                 mov     cx, 1000
    20. seg000:0179                 call    delay_cx
    21. seg000:017C ; while(!(inportb(port+7)&0x48));
    22. seg000:017C                 mov     dx, bx
    23. seg000:017E                 call    sub_22E
    24. seg000:0181                 jb      short not_ready
    25. seg000:0183                 call    sub_280
    26. seg000:0186                 mov     cx, 100h
    27. seg000:0189                 mov     dx, bx
    28. seg000:018B                 add     dx, 0
    29. seg000:018E                 cld
    30. seg000:018F                 mov     di, offset hdd_serial_num?
    31. seg000:0192                 rep insw
    32. seg000:0194                 test    ds:hdd_serial_num?, 80h
    33. seg000:0199                 jnz     short loc_19E
     
  3. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    mega_john

    Собственно, я сказал очевидное :) - вы и так это написали. Имхо проблемы могут быть из-за задержек (через loop), но это так. Кусок кода можно загрузить в отладчик/etc и посмотреть как он отрабатывает.
     
  4. mega_john

    mega_john New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    16
    Вы меня видимо не верно поняли ;) в этой функции мы получаем информацию о диске, его геометрию, название, итд, а не только серийник. Дальше где-то эта информация обрабатывается и на экран выводится список найденных дисков, их размер, итд... скорее всего при обработке этих данных возникает переполнение либо деление на 0. Вариантов решения может быть несколько, править эту таблицу(например указать размер диска 60гб, и по идее должно прокатить), править функцию расчета геометрии, или вообще ничего не расчитывать, а просто указать биосу что диск есть. Только вот у меня проблема найти эти места. Я даже не уверен, что пошел правильным путем...(((
     
  5. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    mega_john
    Ну исправить нулевой сектор не так то просто.
    Тут проще найти нужно место в коде и поправить.
     
  6. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    mega_john

    Ну я не сильно разбираюсь в hdd Ж) Тем не менее:

    В указанной процедуре я нашел следующее:

    Предположив что это смещение в текущем сегменте (кода) буфера для серийного номера (512) далее просто ищем (в IDA - ec 22 байты) и находим кучку ссылок:

    Код (Text):
    1. seg000:00B4 hdd_serial_ofs  dw 22ECh                ; DATA XREF ...
    2. ...
    3. seg000:4A90                 mov     bx, offset hdd_serial_num?
    4. ...
    5. seg000:4AAA                 mov     si, offset hdd_serial_num?
    6. ...
    7. seg000:4B55                 mov     bx, offset hdd_serial_num?
    8. seg000:4B58                 cmp     dword ptr [bx+1FEh], 0AA55h
    9. ...
    hdd_serial_ofs Наверное будет также интересен - тем более что на него есть ссылки.

    Также еще раз повторю свой савет исполнить этот код загрузившись с дискетки :derisive:
     
  7. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    PSR1257
    Врятли бы производитель ноутов лепил бы в них "уникальный" образ биоса.
    Хотя всякое может быть ....
     
  8. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    T800

    Я даже не понял о чем вы :)

    Я лишь (вроде так) нашел этот буфер обмена и несколько ссылок на него. Команда по смещению 4B58 говорит о том, что буфер может быть использован для нулевого сектора а не только как "серийный номер hdd" (я так называю то, что читается в самой первой процедуре - insw - 512 байт).
     
  9. mega_john

    mega_john New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    16
    T800
    так я о том и говорю, что нужно править биос! какой смысл править сектор, если биос считает что винта нет?

    PSR1257
    спасибо за савет ;) обязательно воспользуюсь

    но меня до сих пор смущает данный модуль, если на него посмотреть в хекс едиторе, то будет видно, что он сильно похож на rom прошиватель, а не на инициализатор дисков...
     
  10. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    mega_john

    Ну раз спасибо то вот еще один (последний пока) савет: поискав три байтика - B0 EC EE - которые кодируют команду mov al,0ECh, out dx,al - по всем данным модулям - я нашел его только в одном (еще) модуле:

    Судя по строчкам в первом модуле действительно похоже на 'BIOS ROM Crisis Recovery Utility V1.15'.

    Sorr за банальные саветы - мне просто любопытна ;)
     
  11. mega_john

    mega_john New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    16
    да мне самому любопытно забороть эту проблему, даже очень)

    как видно из названия данного модуля, это архив, распакованный лежит в аттаче

    данные байтики находятся в файле _1B_component_04h, а тут возникает такая проблема(для меня)
    все эти файлики погружаются по разным сегментам/смещениям, откуда их брать мне непонятно...
    так что где считывается IDENTIFY DEVICE data я найти не могу
     
  12. BLiTZ

    BLiTZ Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    54
    Попробуй спросить еще на http://www.rom.by/ . Также ради интереса можно натравить их биоспатчер на этот биос и посмотреть что скажет.
     
  13. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    mega_john

    Ну вот там чуть ниже вроде есть чтение:

    Код (Text):
    1. seg000:180E                 rep insw
    Код если пишеца одним челом - то пишеца примерно одинаково, так что у вас уже есть one swatch (первый модуль).

    Не совсем понимаю как вы так достали все эти куски. Наверное они идут в памяти друг за другом и скорее всего они из сегмента F000. Почему вы не сдампили сразу весь BIOS (с памяти?) - с адресов C0000 и до самого верха? Если умудрится сказать IDA с какого адреса все это реально сидит то вообще красота будет.

    Попозже может еще посмотрю...
     
  14. mega_john

    mega_john New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    16
    BLiTZ
    Спасибо за совет, но без преувеличения могу сказать, что перерыл весь интернет в поисках решения своей проблемы. Патчер который там присутствует, не умеет работать с биосом 8-й версии.

    PSR1257
    Да боюсь биос на столько сложная весч, что пишется далеко не одним человеком. Все эти куски распакованы спец тулзами из образа для прошивки, так что как оно выглядит в памяти, я не имею представления...
     
  15. XVilka

    XVilka New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2010
    Сообщения:
    24
    Адрес:
    Moscow
    а есть ссылка на полный образ - по отдельным модулям сложно сказать
     
  16. mega_john

    mega_john New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    16
    конечно, в аттаче последний биос целиком
     
  17. XVilka

    XVilka New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2010
    Сообщения:
    24
    Адрес:
    Moscow
    Спасибо! А есть возможность, сделать lspci или другой вывод, с номерами устройств?
     
  18. mega_john

    mega_john New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2008
    Сообщения:
    16
    прошу прощения за долгое отсутствие...
    если желание еще не пропало, то вот отчет эвереста по PCI устройствам :)