Сейчас на форуме: (+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 |
|
Создано: 01 марта 2010 23:44 · Поправил: DenCoder · Личное сообщение · #2 Наконец дошли и до самого установщика Code:
Первая функция sub_F53DF3F6 ищет свободную структуру из 0x18 байт, первые 0xB байт которой - код передачи управления сисеру с последующей обработкой виндой, следующие 0xD байт - сохраняемые данные. База этих структур у меня находится по адресу F54F3F78. Кстати, места под эти структуры зарезервировано для всех 256 прерываний. Получается формат структуры такой struct InterruptHook { BYTE Code[0xB]; BYTE IntNum; DWORD IdtBase; DWORD IdtMemberLow; DWORD IdtMemberHigh; }; Code представляет собой такой код: push offset OldHandler push offset NewHandler retn Сами опкоды (68 push dword const и C3 retn) прописаны во всех 256 элементах структуры где-то еще раньше. Ну и где же и как же нам вставить свой код?... ----- IZ.RU |
|
Создано: 02 марта 2010 10:53 · Поправил: -=Hellsing=- · Личное сообщение · #3 DenCoder пишет: Ну и где же и как же нам вставить свой код?... Попробуй, поставить JMP на свой код пускай в нём выполняется патчение ,того что тебе надо и код Syser'a или, после патчение пускай возвращается на следующею команду после твоего джампа обратно. Еще можно для места под патч добавить секцию. |
|
Создано: 02 марта 2010 14:03 · Поправил: DenCoder · Личное сообщение · #4 Три типа модификации: A. С добавлением кода приведения в порядок селекторов B. С копированием и небольшой модификацией виндового кода приведения в порядок селекторов С. С подменой джампа в виндовом коде приведения в порядок селекторов. Вместо jmp nt!KiInterruptDispatch ставим jmp Syser!HookInterruptDispatch Вариант A может потребовать раздвигания границ кода (в PE-заголовке и в секции) в syser.sys, либо добавления еще одной секции, либо написания еще одного драйвера. B используется самой виндой. Для B необходимо управление памятью для выделения места под код и написания безошибочного экономного кода модификации. Работать будет вообще на меньшем множестве машин. Потому что виндовый код из ntoskrnl других версий(про которые кстати не написано на вкладке Версия) может отличаться несущественным одним байтом. Статическая правка по смещениям в моей системе на других машинах может привести к сбоям и краху. Чтобы этого не произошло, придется добавлять модуль дизасма. В общем этот вариант представляет некоторые сложности, а задача - как можно быстрее и проще исправить syser для некоторого класса машин. C - самый простой вариант, но на первый взгляд также как и варианте B не на всех машинах будет работать. Таких, как у меня, конечно, я имею ввиду Но его можно свести к поиску jmp на KiInterruptDispatch. Недостаток в том, что будет работать только для некоторых прерываний, для каждого из которых часть ntoskrnl вынесена зачем-то один в один в отдельную секцию, а для исключений это не используется. Поэтому, как бы проще не хотелось сделать, придется в итоге выбрать средний вариант - вариант A. Самым простым для выбранного варианта A было бы добавление в Code еще одного push, но тогда придется долго модифицировать весь syser, ведь размер структуры увеличится на 5 байт. Так можно было бы сделать без увеличения размера (с jmp вместо push), если б был уверен, что одинаковое во всех 256 элементах струутуры поле IdtBase не используется потом... Поэтому в установщик хуков лучше добавить установку хука на начало обработчика, что приводит к минимуму патча для выбранного варианта A... ----- IZ.RU |
|
Создано: 08 марта 2010 11:34 · Поправил: DenCoder · Личное сообщение · #5 |
<< . 1 . 2 . |
eXeL@B —› Дневники и блоги —› Драйвер для ATI 3D RAGE PRO TURBO AGP 2X и реверсинг |