Сейчас на форуме: (+5 невидимых) |
eXeL@B —› Дневники и блоги —› Драйвер для ATI 3D RAGE PRO TURBO AGP 2X и реверсинг |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 10 февраля 2010 17:46 · Поправил: DenCoder · Личное сообщение · #1 Исследования перешли в реверс драйвера Syser Debugger 1 февраля 2010 года Нашел на одном из ftp-серверов игру Freelancer... Посмотрел системные требования - должна пойти. Поставил, запускаю - критическое предупреждение программы о том, что драйвер видеокарты устарел и рекомендуется его обновить. Попробовал без нового драйвера, в графике много артефактов, в частности луч звезды в космосе отображается в виде нескольких двумерных квадратов с окружностями внутри. Попробовал найти новый драйвер... 2 февраля 2010 года Найти не удалось ничего новее legacy All-in-wonder rage pro от февраля 2002 года. У меня Windows XP. Видел сборки Windows XP с включенными в них дровами для RAGE PRO 5.10.2613.6010, но по-моему это ошибка - нуль ошибочно заменен на 3... Поставил. Результаты значительно лучше в графике. Первый ролик с сюжетом игры был показан без артефактов, да и вообще ролики стали нормально отображаться. Но только ролики. В остальном стало только хуже. Когда заходит дело до отображения текста, то текст невозможно разобрать из-за того, что он мелькает и перемешивается с неведомо по какому алгоритму и откуда берущимися другими текстами и пиктограмками из игры. А иногда можно получить и BSOD... Пробовал найти более новый драйвер от сторонних разработчиков. Находил новые, но для Vista и за деньги... Нашел еще много информации о том, что ATI не умеет писать драйвера, Линуксоидам очень везет - практически любой драйвер могут собрать(но мне исходники драйвера под никсы ни к чему), попробовал несколько утилит для настройки - все бесполезно.... 5 февраля 2010 года Напрашивалось уже несколько решений 1) Забить на все 2) Накопить на новую видюху с поддержкой AGP 2X 3) Обновить SP до 3 4) Поставить вообще Ubuntu 5) Заказать драйвер 6) Реверс инжиринг существующего драйвера Напрашивалась мысль - "Как же делаются драйвера для Linux? Ведь спецификации видеоадаптеров закрыты. Реверс инжиринг?" Поискав в интернете, это частично подтвердилось. Оказалось, что не так уж и мало кодеров копаются во внутренностях закрытых драйверов. Но также наткнулся на официальном сайте, на то, что ATI вроде как поддерживает разработчиков для своих устройств на других ОС. Для себя из их инструментов ничего полезного не нашел... 7 февраля Все же решился на реверсинг. Но мне нужен инструмент. А у меня в арсенале OllyDbg 1.0 и 2.0 beta, Ida 4.04, WinDbg (глючит окно с листингом). Пробовал SoftIce - вообще не работает, патчи ставил, много чего делал - не помогает. SysDebuger вываливается в BSOD. И вот решил поискать новую Иду с мыслью "а вдруг?" и наткнулся на 5.5. Не поверил своему счастью - сейчас много чего в интернете размешали с г.... примерно 1:100, поэтому внимательно прочитал все посты на форуме cracklab по этой теме. Получив многочисленные подтверждения решил поставить... Радость возросла до небес. Вот оно - то, о чем я мечтал и сам хотел написать. В мечтах, конечно, еще взаимосвязи данных, ну да ладно. Такой визуализированный дизассемблер - уже очень круто!!! 8 февраля Редкие BSOD'ы в игре Freelancer все время ссылались на один и тот же адрес BFA053A6 в модуле ati2drad.dll. Поэтому вполне возможно, что место недоработки драйвера там или в другом драйвере, который обращается к этой функции... Место, в котором происходит 5 исключение, содержит инструкцию fld dword ptr [ecx]... Посмотрев функцию, сделано несколько выводов: 1) алгоритм функции в упрощении сводится, грубо говоря, к следующему func(Arg1, Arg2, Arg3, Arg4) { m = Arg1 + <фикс. смещение>; Base = Arg2; Addr1 = Arg3; do { x = *(WORD*)Addr1; y = *(WORD*)(Addr1 + 2); z = *(WORD*)(Addr1 + 4); xAddr = x * m + Base; yAddr = y * m + Base; zAddr = z * m + Base; { //вычисления при помощи адресов xAddr, yAddr, zAddr //на какой-то итерации цикла первое же обрашение по одному из адресов //и вызывает 5 исключение } Addr1 += Arg4; }while(<сложная комбинация условий>); } 2) Возможно параметры какие-то неверно передаются. Проследив кросс-реферинг, выяснил, что это функция имеет ссылку только в памяти в группе адресов. Адрес базы также имеет ссылку на запись, та функция также, докопался до источника адреса - область память динамически выделяется... 10 февраля 3) Нужен все же отладчик, скачал новую версию SysDebugger, буду пробовать 4) Нужно с кем-то обсудить. Еле как зарегистрировался на cracklab. :D ----- IZ.RU |
|
Создано: 16 февраля 2010 18:35 · Поправил: DenCoder · Личное сообщение · #2 16 февраля Syser.Debugger.v1.99.1900.1185 произвольно вываливается в BSOD с кодом 0x7F(8, 0x80042000, 0, 0). Это обстоятельство побудило меня проверить оперативную память и драйвера. Штатной утилитой verifier нашел несколько дров, непроходящих проверку, отключил их. Отключил вообще все дрова от программ, которыми уже давно не пользуюсь, антивирусы, антируткиты. Все то же самое. Поиски проблемы с Syser сподвигли проанализировать crash dump. 0x7F с кодом исключения 8 - двойная ошибка #DF, которая возникает в случаях, когда одновременно происходят два исключения, которые не могут быть обслужены последовательно. К таким исключениям относятся #DE(INT 0 - деление на нуль), #TS(INT 0A - ошибочный TSS), #NP(INT 0B - сегмент недоступен), #SS(INT 0C - Ошибка стека), #GP(INT 0D - общая ошибка защиты) и #PF(INT 0E - ошибка сегментной адресации). Какие именно исключения в тот момент возникли, анализ полного Crash dump'а не показывает. WinDbg лишь показал Code:
Почему бы в Ida не посмотреть? В Syser.sys не нашел по указанному смещению (0x1684) такой команды, видимо он самораспаковывается, или в нем 2 сегмента кода, на тот момент не установил. Но в SDbgMsg.sys обнаружил по смещению 0xb02 функцию с единственной O-ссылкой. По смещению A18, на который эта ссылка указывала, находилось Code:
Параметр 0E - это как раз номер исключения (ошибки), sub_10B02 - адрес того самого обработчика этого исключения. Смысл вызываемой функции sub_10572 в том, что в ней подменяется адрес обработчика исключения #GP на sub_10B02. И я мыслю так, что этот обработчик не вызывается, так как не успело обработаться какое-то другое из списка... Ладно, скачал 1195 релиз Syser'а, буду проверять, то же ли самое. Скопирую перед установкой нового сисера старые драйвера от него с базами Ida в другую папку... ----- IZ.RU |
|
Создано: 16 февраля 2010 22:46 · Личное сообщение · #3 И 1195 весело, под музыку кейгена, вылетает в BSOD с той же ошибкой. В дровах нового Syser'а изменен только Syser.sys. Все остальные дрова те же. Результаты анализа дампа такие Code:
Code:
Более подробную информацию выложу позже. ----- IZ.RU |
|
Создано: 16 февраля 2010 23:16 · Личное сообщение · #4 Пока непонятно, в чем дело. Возможно в дампе просто не та информация. По указанному смещению Syser!DllUnload+0x885b действительно находится указанная команда lock bts dword ptr [Syser!gpSyserPluginUI+0x12e0 (f5606b3c)], 1Fh. Но блок, в контексте которого эта команда с префиксом LOCK, аналогичен блоку, заключенному в скобки критических секций (EnterCriticalSection и LeaveCriticalSection). Code:
Как может произойти исключение на этой команде??? Возможно следующий BSOD даст другой, более правдивый дамп... ----- IZ.RU |
|
Создано: 17 февраля 2010 00:01 · Поправил: DenCoder · Личное сообщение · #5 Обнаружил еще по кросс-референсам, что функция sub_19800, которой принадлежит этот блок, вызывается в самом начале одного из трех обработчиков исключений 6, 0B и 0C. Это соответственно #UD (Недопустимая операция), #NP (Сегмент недоступен) и #SS (Ошибка стека). Но к списку одновременных исключений, вызывающих #DF, относится только #NP и #SS. В качестве аргументов этой функции передается только один аргумент в каждом обработчике - номер исключения. Но сама функция оперирует гораздо большим количеством - 8 аргументов. Эти аргументы - адрес возврата, код ошибки, который передается исключению. Но до обработки их не доходит ввиду появления еще одного исключения. ----- IZ.RU |
|
Создано: 17 февраля 2010 00:35 · Личное сообщение · #6 |
|
Создано: 17 февраля 2010 01:29 · Поправил: DenCoder · Личное сообщение · #7 И только я приготовился к новому запуску сиськи, закрыл уже браузер, хотел уже закрыть WinDbg, но решил пробить стек от его лимита. Для меня сначала все казалось бессмысленными данными. Но вдруг краем глаза заметил, что все данные повторяются. Code:
Итак до бесконечности. Налицо переполнение стека!!! А это #SS. Второе исключение похоже найдено... Но какое все же первое? Для начала вводим !address 804e1827 и узнаем, что этот адрес лежит в диапазоне адресов ntoskrnl.exe. f54c7819 - адрес той самой команды, которая вызывает исключение. Здесь чего-то я не понимаю, как может инструкция lock bts вызвать исключение, если адрес валидный? Только если то самое 0E, ошибка страничной адресации #PF... Оно возникает при обращениях к странице памяти, когда страница в данный момент выгружена на диск. Третий адрес f550d679 оказался адресом возврата из функции, в которой происходит исключение. Тогда 0D - ее аргумент, который, судя по коду, совпадает с номером исключения. 1980 - предыдущий ebp (фрейм уровнем выше). Значит, дальше 1 - переменная, счетчик цикла (этот блок приведен выше). Счетчик досчитал до 1, то есть исключение возникает на самой первой итерации цикла. Но тогда что такое 10083 и вслед за ним 8? Дальше идет адрес команды, вызвавшей исключение - f54c7819 и что-то дальше. Попробуем пойти в обратную сторону. Адрес, предшествующий параметру, 804e1827 - возможно адрес команды вызвавшей исключение #GP (0D). Если так, то теперь дело за ntoskrnl.exe... ----- IZ.RU |
|
Создано: 17 февраля 2010 11:45 · Поправил: DenCoder · Личное сообщение · #8 17 февраля ntoskrnl реверсить да с pdb-файлами одно удовольствие, даже толком поспать не смог... 804e1827 - адрес обработчика тоже исключения 0D. (#GP - общая ошибка защиты) Похоже, что Syser делает подмену обработчика по стандарту - сначала его обработчик, затем виндовый. Обработчик в Syser вызывается через шлюз вызова, виндовый с кодом ошибки при этом сохраняется дальше в стеке, чтобы быть вызванным после обработки Syser'а. Возможно в некоторых случаях наоборот. Но почему же переполнение стека??? Приведу еще раз дамп стека, только на сей раз более полный и тогда можно будет понять, что курица все же сначала была, а не яйца. ))) Code:
Вверху наши рекурсии обработчика, внизу около 512 байт до базы стека заполнено нулями. Попробуем разобрать по частям наш стек вводим команды dd, начиная с dd f7be2a3c L1, чтобы удобнее было здесь выложить Первая часть Здесь повторяется, за исключением e1820000 Code:
Это я уже выкладывал, но в таком виде смотреть удобней и приятней. Как мы узнали, что e1820000 - пул? Очень просто - набрали команду !address e1820000 (благо, у меня полный креш дамп). В ответ windbg напрягся, подумал и выдал e1000000 - 0fc00000 Usage KernelSpaceUsagePagedPool К пулу еще, может, вернусь... Итак, началось все (точнее, повторы начались) с непонятных 3 двойных слов и адреса команды, вызвавшей исключение (не факт, конечно, в зависимости от исключения адрес может указывать на следующую команду). Но эта команда в функции, которая вызывается из обработчика какого-то исключения (нельзя сказать, что началось все именно с #GP, поскольку эта функция вызывается многими обработчиками). И, возможно, 3 этих непонятных числа - составной код ошибки. Но тогда из этого и из того, что только два исключения из набора {0, 0A, 0B, 0C, 0D, 0E} способны вызвать 8, а также из того, что второе исключение - 0C, следует только одно: все началось с исключения, не входящего в этот набор. Про составные коды ошибок в книге от Зубкова ничего не нашел, такие не исключаются при исключениях от 12h... Вернемся к этому вопросу чуть позже (для этого надо погуглить). С первой частью дампа немного ясно. Возможно, вторая часть больше прояснит смысл неясных двойных слов. Code:
По той же самой схеме, как и выше, это ни что иное, как результат исключения 0C (#SS). Но код ошибки равен 0, а это значит, что не было переполнения стека и ошибка произошла не из-за отсутствия сегмента стека ss. Но, по определению не может происходить одновременно два исключения(#SS и #GP) из набора выше без результирующего #DF! Либо из этого правила есть исключения, либо #SS было обработано "правильно" и одно из неясных слов первой части дампа - адрес возврата. Хотя возможно еще и третье - часть стека был заменена, что вполне может иметь место при переполнении стека (тогда третья часть дампа поможет :s2. 2-ое невозможно, так как код обработчика исключения sub_5F97E после возврата из функции затер бы флагами и другими регистрами все. Вот код обработчика, по которому можно увидеть, что после вызова функции - заглушка, хотя можно там, между командами mov fs, eax и pop fs вставить дополнительный код обработчика. Code:
----- IZ.RU |
|
Создано: 17 февраля 2010 11:55 · Поправил: DenCoder · Личное сообщение · #9 и код функции, которая вызывается большинством обработчиков Syser Code:
Что-то совсем туго... Неужели в некоторых случаях возможны два и более одновременных исключения типа #SS и #GP ??? ----- IZ.RU |
|
Создано: 17 февраля 2010 12:41 · Личное сообщение · #10 Нашел на WASM ----- IZ.RU |
|
Создано: 18 февраля 2010 14:19 · Поправил: DenCoder · Личное сообщение · #11 Первая часть дампа стека будет выглядеть так Code:
В EFLAGS только RS взведен. На тему этого флага есть расхождения, а у Зубкова вообще противоречивые высказывания в одном абзаце: "Флаг RF - когда этот флаг равен 1, отладочные исключения временно запрещены. Он устанавливается командой IRETD из обработчика отладочного прерывания, чтобы #DB не произошло перед выполнением команды, которая его вызвала, еще раз. На флаг не влияют команды POPF, PUSHF, IRET." На этом исследования ставлю пока на паузу, так как еще много других дел... ----- IZ.RU |
|
Создано: 18 февраля 2010 15:14 · Личное сообщение · #12 1) В нашей компьтерной коммисионке GF2 MX400 - 200р Радеоны и GF4 и 5-е по 500-600р Неужто это дорого? Свяжись с любыми ремонтниками - они может бесплатно такое добро подарят. 2) Единственный плюс в твоей работе - это освоение syser и драйверов, но материал не подходящий. Где гарантия, что дело не в драйвере, а в железе. Был у меня в свое IDE-контроллер "ускоренный" с шиной VLB и с 286-м(!) на плате. И драйвера были, но сам по себе он кривой был - железно. Прямо с ним еще видео-карта. Так пока профи не сделали нормальные драйвера - она не заработала. Ну и как нормальный вариант : все-таки поискать драйвера. Очень часто самые новые не есть самые лучшие. 3) А ты уверен, что для этой игры AGP 2X достаточно, а главное что твоя мамка это поддерживает и в БИОС-е включено ? Я уже для себя уяснил, что железо должно быть сбалансировано. Нельзя ждать безглючности, когда железо из разных весовых категорий. |
|
Создано: 18 февраля 2010 18:26 · Личное сообщение · #13 1) Я сам себе ремонтник. Плюс ко всей продукции от ATI уже отношусь скептически. NVidia надо проверить. 2) Да, из названия темы можно убрать все про видеоадаптер и оставить реверс драйвера. Люблю копаться. Исследования проблемы могут помочь не только в освоении драйверов, но и выяснить, в чем же проблема на самом деле, в железе или в дровах? 3) Уверен - для двух версий драйверов ошибки разные. Соединить бы два комплекта драйверов в один без ошибок... ----- IZ.RU |
|
Создано: 19 февраля 2010 16:41 · Поправил: DenCoder · Личное сообщение · #14 ДАЛЬШЕ ВСЕ ДЛЯ TRIAL ДИСТРИБУТИВА Syser Debugger В новых дампах все то же самое. Только в стеке указатели на фреймы более правдивые и первопричина исключений #GP - #UD. Это исключение не содержит кода ошибки. В стеке после виндового обработчика _KiTrap06 записан адрес возврата 2, селектор cs = 0x1000 (может быть только для реального и виртуального режимов), EFLAGS = 0xb0202 (RF = 1, VM = 1, VIF = 1). Имеет место межсегментное переключение, поскольку дальше (если так) ESP = 0x1ffc, ss = 0x1000 (может быть только для реального режимов и втруального режимов). Далее 16 байт нули и 0x27f, 0x7c900000 (база ntdll.dll) и опять 16 нулей. Что еще? На момент креша cr2 = f795bffc - выход за пределы нижней границы стека, cr0 = 8001003b (PG = 1, CD = 0, NW = 0, AM = 0, WP = 1, NE = 1, ET = 1, TS = 1 - задача переключена, EM = 0, MP = 1, PE = 1), cr4 = 6d9 (10(???) бит = 1, FSR = 1, PMC = 0, PGE = 1, MCE = 1, PAE = 0, PSE = 1, DE = 1, TSD = 0, PVI = 0, VME = 1), cr3 = 00039000 (20 старших бит физ. адреса начала каталога страниц = 39, PCD = 0, PWT = 0) все dr = 0 Отсюда можно сделать вывод, что исключение #UD возникло в виртуальном режиме, адрес команды вызвавшей исключение - cs:ip = 1000:0002, ss:sp = 1000:1ffc. gdtr = 8003f000, gdtl = 3ff, idtr = 8003f400, idtl = 7ff, tr = 50, ldtr = 0 Отюда селекторы могут быть от 8 до 3F8, номера шлюзов от 0 до FF. Шлюзы адрес сег IOPL тип шлюза Code:
SE - бит присутствия сегмента. Как видно, Syser.sys перехватывает #DB, #BP, #UD, #NP, #SS, #GP, #PF, INT 2D, INT 31, INT 3C. Дальше все обработчики от прерываний 3D до FF в ntoskrnl.exe. Три обработчика вызываются через шлюзы задач: NMI, #DF, #MC. ----- IZ.RU |
|
Создано: 19 февраля 2010 21:47 · Поправил: DenCoder · Личное сообщение · #15 Таблица дескрипторов. Code:
P - бит присутствия сегмента Непонятно, почему у системных дескрипторов разрядность 16, а TSS - 32битные. Также непонятен вызов обработчика #MC через дескриптор A0. Но ошибки нет - парсинг макросом. ----- IZ.RU |
|
Создано: 20 февраля 2010 16:33 · Поправил: DenCoder · Личное сообщение · #16 |
|
Создано: 20 февраля 2010 23:08 · Личное сообщение · #17 |
|
Создано: 21 февраля 2010 18:51 · Поправил: DenCoder · Личное сообщение · #18 Если прыгнуть по одному из адресов обработчиков в Syser, прописанных в таблице, то мы окажемся в секции данных в окружении одних нулей. Это говорит о том, функция установки хуков на прерывания прописывает туда код, который уже передает управление одной из функций обработчиков, и вписывает в стек возврат на виндовый обработчик. Есть интерес более детально ее пореверсить. Также нужно выяснить, в какой виртуальной задаче произошло исключение #UD. Пореверсив немного виндовый обработчик _KiTrap_06, выяснил, что источник исключения #UD и есть инструкция по адресу 1000:0002 или 10002 в защищенном режиме. Обработчик сравнивает четыре байта по адресу инструкции-источника с 1) C4 C4 50 42 и 2) C4 C4 50 43, но ничего такого у нас нет (у нас C4 C4 FE 00), и обработчик сравнивает два байта с С4 С4. Не странно ли? Как будто исключение #UD по адресу 1000:0002 - необходимая часть работы системы. ----- IZ.RU |
|
Создано: 22 февраля 2010 22:22 · Поправил: DenCoder · Личное сообщение · #19 Занопил установку хука на 6 исключение и уаля, хотя бы при старте винды комп не вылетает в BSOD. Но и syser.sys не грузится. Что-то странное происходит. Обработка любого исключения вызывает рекурсивные #GP(0). Команда вида mov dword ptr ss:Address, r32 вызывает #SS и вслед за ним те же рекурсии с #GP. Бред какой-то... ----- IZ.RU |
|
Создано: 23 февраля 2010 21:01 · Личное сообщение · #20 |
|
Создано: 23 февраля 2010 22:09 · Личное сообщение · #21 |
|
Создано: 27 февраля 2010 00:29 · Личное сообщение · #22 Отдохнул несколько дней. Решил опять немного покопаться в сисере. И меня осенило, я просто был невнимателен к информации в WinDbg... Отдыхая от этого занятия несколько дней, я все время думал, как может происходить исключение при обращениях по адресам, по которым недавно все было нормально. И вот глянув в очередной раз на уже надоевший анализ WinDbg, я заметил f5550819 f00fba2d3cfb68f51f lock bts dword ptr [Syser!gpSyserPluginUI+0x12e0 (f568fb3c)],1Fh ds:0120:f568fb3c=???????? Так ведь дело то в том, что ds = 120, лимит у этого сегмента FFFF, а адрес по которому обращение - выходит за эти пределы. Это и вызывает исключение #GP(0). Рекурсивное. Дальше, посмотрев еще раз на регистры в момент краша, увидел tr = 50. Залез в этот TSS, там в принципе были уже все данные для KeBugCheck2, которая, похоже, и выводит синий экран. Посмотрел в стек этой задачи. Вызов был из tss = 28. Сохраненные регистры этой задачи находятся в 80042000. Оттуда вывел ss = F8. С ним та же самая история, что и с ds = 120 - команда mov ss:byte_F569212B, 1 по адресу F557C71C вызывает иссключение #SS, поскольку адрес заходит за границы лимита (В случае, если syser.sys грузится с ситемой, то все начинается с #UD; при ручной загрузке первая проблема - #SS). В случае ds можно было б предположить, что где-то он сбивается. Но ss в большинстве случаев нет необходимости использовать явно. Значит, скорее всего, в драйвере ошибочное использование сегментных регистров. Но что теперь? Syser.sys не дает себя менять так просто. Он в каком-то месте проверяет свою котрольную сумму или хеш и в случае изменений не грузится. А так было бы простым решением изменить пару байт... Эту проблему надо решить. Также непонятно, каким чудом у других Syser Debugger работает? Возможны несколько тому причин: 1) Дескрипторы в GDT по другому определены в системе 2) Для TSS = 28 системой не используются данные селекторы, cs = 8, а ds = es = ss = 10 3) Какой-то драйвер сбивает селекторы 4) Неведомо откуда syser.sys другой 5) Что-то еще... ----- IZ.RU |
|
Создано: 27 февраля 2010 15:15 · Поправил: -=Hellsing=- · Личное сообщение · #23 DenCoder пишет: Также непонятно, каким чудом у других Syser Debugger работает? К примеру, также как и SoftIce на одних осях он работает, а на других нет. У меня, к примеру, и SoftIce и Syser нормально работают в XP SP2 (Если конечно винда чистая). Но насчёт Syser Debugge нет такой тенденции как у SoftIce ты, наверное, первый у кого Syser Debugge не хочет работать. Вот мой Syser.sys сам Syser скачивал от отсюдова. 4bab_27.02.2010_CRACKLAB.rU.tgz - Syser.sys.rar |
|
Создано: 27 февраля 2010 17:59 · Личное сообщение · #24 |
|
Создано: 01 марта 2010 02:33 · Поправил: DenCoder · Личное сообщение · #25 Дистриб опять 1195, взят с форума Изменил один байт ради интереса в syser.sys. Заменил префикс ss на команду NOP. Теперь вместо первого #SS возникает #GP. Если селекторы сбиты, то так и должно быть... Нашел дальше в стеке, за адресом возникновения первого исключения, следующее: Code:
(1) Проверил каждый установленный сисером обработчик прерываний и нашел для INT 3C: Code:
Это сходится с тем, что в стеке. Команда !address показывает, что это в невыгружаемом пуле, а поиск файла по первым байтам в системной папке находит только ntoskrnl.exe, но смещения для некоторых дальних джампов изменены. Кто-то скопировал полностью обработчик и поправил смещения... Если теперь сравнить обработчик в сисере (f53acef6) с предположительно виндовым, то можно увидеть, что якобы виндовый приводит сначала селекторы в порядок (фрагменты кода помечены 2 и 3), а потом уже начинает обработку! Этого нет в сисере!!! Code:
Code:
Теперь понятно, почему при первом исключении сисер сохраняет ebp = e1820000... Но что за адрес 118:80e5 ? WinDbg ничего не дает в ответ на этот запрос. Она просто не находит его в известных диапазонах адресов... Нужен ntoskrnl.exe из папки %SystemRoot%\System32\ от Windows XP Pro SP2 для сравнения со своим. MD5-хэш моего B9D0F564511439E9C64F92387C622222, размер - 2 182 784 байт. Кто может, подсобите, плиз! ----- IZ.RU |
|
Создано: 01 марта 2010 10:48 · Поправил: -=Hellsing=- · Личное сообщение · #26 DenCoder пишет: Нужен ntoskrnl.exe из папки %SystemRoot%\System32\ от Windows XP Pro SP2 для сравнения со своим. MD5-хэш моего B9D0F564511439E9C64F92387C622222. |
|
Создано: 01 марта 2010 13:06 · Поправил: DenCoder · Личное сообщение · #27 В этом ntoskrnl на 32384 байт меньше, приведенный обработчик 3C содержит несущественные изменения, версии совпадают, внутренние имена нет - у меня ntoskrnl.exe, в этом - ntkrnlmp.exe. Почти все то же самое... Размер: 2 150 400 байт MD5-хэш: F571D3CBE7BF4119E85880A3FE64BD74 В общем, понятно уже, что разработчики сисера кое-чего не учли и допустили ошибку, которая не проявляет себя с другими аппаратными конфигурациями. Но найти ошибку мало, нужно теперь решение проблемы. Ко мне в голову приходят основных 2 варианта: 1) Сообщить разрабам сисера о найденной ошибке 2) Исправить самому - написать свой обработчик для сисера или модифицировать установщик хука на INT 3C так, чтобы модифицировался виндовый, чтобы восстановление селекторов происходило перед передачей управления в обработчик сисера, затем прыг в обработчик и затем в KiInterruptDispatch. ----- IZ.RU |
|
Создано: 01 марта 2010 13:38 · Личное сообщение · #28 |
|
Создано: 01 марта 2010 17:56 · Поправил: DenCoder · Личное сообщение · #29 Да, ты прав. Можно сообщить об ошибке, как параллельное решение проблемы. Только кто этим займется? Я по-английски читаю только технические тексты. Пробовал как-то с Израильским программистом по аське общаться - кое-как поняли друг друга. В общем если кто-нить вдруг захочет связаться с разработчиками, то нужно перевести и отправить им этот текст: "В драйвере syser.sys обнаружена ошибка. Ее смысл в том, что возникает прерывание (у меня INT 3C, на компьютерах с другой конфигурацией номер может отличаться) в то время, когда выполняется код 16-битного драйвера, а установленный на него в syser.sys обработчик не восстанавливает селекторы ds, es и ss. Это влечет за собой рекурсивную обработку #GP до переполнения стека, что и приводит к #DF и BSOD. Данная ошибка проявляется не на всех аппаратных конфигурациях. Как вариант исправления данной ошибки предлагается исправить код установки хука на это прерывание по смещению 0x27DB от начала файла syser.sys таким образом, чтобы перед началом его обработки селекторы приводились в порядок для правильной адресации глобальных переменных." Кстати все то же самое и к #UD относится и все остальные хученные исключения и прерывания надо просмотреть. Лично я пока не понимаю, неужели в Win32 еще есть 16-битные драйвера и как так этого не учли разработчики. Пока разберусь дальше с установкой хука на прерывание 3C. В зависимости от даты креш-дампа база syser.sys может отличаться, т.к. для удобства я в иде перебазирую драйвер. Сейчас рассматривается код сисера с базой 0xF53AB000. Код установки хука: Code:
Код функции определения номера прерывания: Code:
Алгоритм вычисления этого номера зависит от байтовой переменной (возможно булевой) по адресу F54F5890. Если она равна нулю, номер определяется просто - IntNum = Arg0 + 0x30 = 0x3C. ----- IZ.RU |
|
Создано: 01 марта 2010 23:42 · Поправил: DenCoder · Личное сообщение · #30 Код функции установщика хука Code:
В переменной dword_F54C7B1C количество процессоров. Т.к. у меня один процессор, то меня интересует только часть этой функции, по адресу F53B43E0. Выясняется, что и сам установщик не здесь, а возможно в sub_F53B392E, которая в случае успеха должна возвращать не 0. Глянем и первую функцию Code:
Суть ее - определение базы IDT. Параметр функции - указатель, в котором надо сохранить лимит таблицы, у нас 0. ----- IZ.RU |
. 1 . 2 . >> |
eXeL@B —› Дневники и блоги —› Драйвер для ATI 3D RAGE PRO TURBO AGP 2X и реверсинг |