Newsgroups: fido7.ru.hacker Distribution: fido7 X-Comment-To: Alexander Erohin Approved: gateway@fido7.ru From: Sergey Ozerov Date: Tue, 04 Aug 98 10:46:33 +0400 Subject: Re: Award Bios Рискуя впасть в оффтопик, расскажу алгоритм вычисления так называемого "инженерного пароля" сразу для 2-х форматов: для старого и для нового. Сразу оговорюсь, что случай, когда криворукие изготовители мамок (к примеру, A-Bit) используют новый формат, но почему-то по дефаулту пишут там данные в старом формате (можно исправить через MODBIN.EXE), не рассматриваются. Отличительные признаки этого кривого описания: по адресу F000:EC60 (или со смещением 0x1EC60 от начала ORIGINAL.TMP) находится 0xAA1E000000000000, что в принципе равносильно отсутствию инженерного пароля, пока его вручную не переопределишь через MODBIN и не прошьёшь заново BIOS (я менял на "ABIT"), ибо ввести с клавиатуры код 0xD8 (Alt-216) невозможно. Итак, поехали ;-)... 1. Старый формат. Для проверки пароля используются два байта (первый -- младший, второй -- старший) по адресу F000:EC60 (или со смещением 0x1EC60 от начала ORIGINAL.TMP). Признаком старого формата можно считать наличие байтов 0x1461 по адресу F000:EC62 (0x1EC62). Контрольная сумма считается следующим образом. Сначала в неё заносится код последнего введённого символа пароля (вроде как максимальное количество символов -- 8). Затем код предпоследнего символа сдвигается на два бита влево и добавляется к контрольной сумме. Предшествующий ему символ также сдвигается уже на 4 бита влево и также добавляется к контрольной сумме. И так далее. Разряды переполнения добавляются к младшему биту контрольной суммы. Вышедшая за разрядную сетку при сдвиге влево часть кода добавляется к младшим битам. Соответственно, "раскручивание" пароля производится в обратном порядке. Рассмотрим на примере контрольной суммы 0x1EAA (для "AWARD_SW"): 0001 1110 1010 1010 0111 1010 -- примем, что это -- последний символ кода (вибираются из подмножества цифр и лат.букв) ========================== 0001 1110 0011 0000 -- остаток после вычитания 01 1110 00 -- пусть это -- предпоследний символ кода (сдвинут на 2 бита влево) ========================== 0001 1100 0101 0000 -- остаток после вычитания 0111 0101 -- третий с конца символ кода (сдвиг на 4 бита) ========================== 0001 0101 0000 0000 -- остаток 01 0101 00 -- четвёртый с конца символ кода (сдвиг на 6 битов) ========================== 0000 0000 0000 0000 -- остаток = 0 -> вычисления закончены Итак, для данной контрольной суммы 0x1EAA нами получен один из возможных паролей: 0x5475787A или в символьном виде "Tuxz". Кто хочет, может написать программу, а меня ломает ;-)... ======== 2. Hовый формат. Пароль зашит в закодированном виде в символьной строке длиной 8 байт с адреса F000:EC60 (или со смещением 0x1EC60 от начала ORIGINAL.TMP). При длине пароля менее 8 символов признаком конца строки является символ 0x00. Признаком нового формата можно считать наличие байта 0x14 по адресу F000:EC68 (0x1EC68). Побитное кодирование каждого байта пароля производится так: 7 6 5 4 3 2 1 0 -- было 2 1 0 4 3 7 6 5 -- стало То есть, три старших бита каждого байта обмениваются местами с 3-мя младшими битами этого же байта, а биты 3 и 4 остаются на месте. Расшифровка пароля в этом случае достаточно тривиальна, и такой пароль, как видно из алгоритма, может быть только один. По вышеуказанному алгоритму уважаемый CoModerator данной эхи написал и прислал мне исполняемый код, который даже работает, но не было учтено ограничение "не более 8 символов на пароль" С наилучшими пожеланиями, Sergey