Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Дневники и блоги —› Драйвер для ATI 3D RAGE PRO TURBO AGP 2X и реверсинг
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 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





Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 01 марта 2010 23:44 · Поправил: DenCoder
· Личное сообщение · #2

Наконец дошли и до самого установщика
Code:
  1. .text:F53B392E     ; int __stdcall sub_F53B392E(int IntNum, int IDT, int NewHandler, int SluiceType, int DPL, int Selector)
  2. .text:F53B392E     sub_F53B392E    proc near               ; CODE XREF: .text:F53B43BCp
  3. .text:F53B392E                                             ; .text:F53B43F7p
  4. .text:F53B392E
  5. .text:F53B392E     IdtMemberLow    = dword ptr -8
  6. .text:F53B392E     IdtMemberHigh   = dword ptr -4
  7. .text:F53B392E     IntNum          = dword ptr  8
  8. .text:F53B392E     IDT             = dword ptr  0Ch
  9. .text:F53B392E     NewHandler      = dword ptr  10h
  10. .text:F53B392E     SluiceType      = dword ptr  14h
  11. .text:F53B392E     DPL             = dword ptr  18h
  12. .text:F53B392E     Selector        = dword ptr  1Ch
  13. .text:F53B392E
  14. .text:F53B392E 000                 push    ebp
  15. .text:F53B392F 004                 mov     ebp, esp
  16. .text:F53B3931 004                 push    ecx
  17. .text:F53B3932 008                 push    ecx
  18. .text:F53B3933 00C                 push    ebx
  19. .text:F53B3934 010                 push    esi
  20. .text:F53B3935 014                 push    edi
  21. .text:F53B3936 018                 call    sub_F53DF3F6
  22. .text:F53B393B 018                 mov     ecx, eax
  23. .text:F53B393D 018                 test    ecx, ecx
  24. .text:F53B393F 018                 jz      loc_F53B39F7
  25. .text:F53B3945 018                 mov     dl, byte ptr [ebp+IntNum] ; Номер прерывания
  26. .text:F53B3948 018                 mov     eax, [ebp+IDT]
  27. .text:F53B394B 018                 movzx   esi, dl
  28. .text:F53B394E 018                 lea     esi, [eax+esi*8] ; Адрес элемента IDT, IntNum - индекс
  29. .text:F53B3951 018                 mov     edi, [esi]      ; Байты 0-3 элемента
  30. .text:F53B3953 018                 mov     [ecx+10h], edi
  31. .text:F53B3956 018                 mov     edi, [esi+4]    ; Байты 4-7 элемента
  32. .text:F53B3959 018                 mov     [ecx+14h], edi
  33. .text:F53B395C 018                 movzx   edi, word ptr [esi+6] ; Биты 31-16 смещения обработчика
  34. .text:F53B3960 018                 movzx   ebx, word ptr [esi] ; Биты 15-0 смещения обработчика
  35. .text:F53B3963 018                 mov     [ecx+0Ch], eax  ; База IDT
  36. .text:F53B3966 018                 mov     eax, [ebp+NewHandler] ; Новый обработчик
  37. .text:F53B3969 018                 mov     [ecx+6], eax    ; push offset NewHandler
  38. .text:F53B396C 018                 shl     edi, 10h
  39. .text:F53B396F 018                 or      edi, ebx        ; Старый обработчик
  40. .text:F53B3971 018                 mov     [ecx+1], edi    ; push offset OldHandler
  41. .text:F53B3974 018                 mov     [ecx+0Bh], dl   ; Номер прерывания
  42. .text:F53B3977 018                 mov     eax, [esi]      ; Байты 0-3 элемента IDT
  43. .text:F53B3979 018                 mov     [ebp+IdtMemberLow], eax
  44. .text:F53B397C 018                 mov     eax, [esi+4]    ; Байты 4-7 элемента IDT
  45. .text:F53B397F 018                 mov     [ebp+IdtMemberHigh], eax
  46. .text:F53B3982 018                 and     byte ptr [ebp+IdtMemberHigh], 0 ; этот байт должен быть 0 для шлюзов прерываний
  47. .text:F53B3986 018                 mov     eax, ecx
  48. .text:F53B3988 018                 shr     eax, 10h
  49. .text:F53B398B 018                 mov     word ptr [ebp+IdtMemberHigh+2], ax ; Установка старших бит нового обработчика
  50. .text:F53B398F 018                 mov     al, byte ptr [ebp+IdtMemberHigh+1] ; Байт доступа
  51. .text:F53B3992 018                 and     al, 0EFh        ; Сброс 4 бита, который вряд ли винда могла установить
  52. .text:F53B3994 018                 or      al, 80h         ; Установка бита присутствия сегмента
  53. .text:F53B3996 018                 cmp     byte ptr [ebp+SluiceType], 10h ; часто 10
  54. .text:F53B399A 018                 mov     word ptr [ebp+IdtMemberLow], cx ; Установка младших бит нового обработчика
  55. .text:F53B399E 018                 mov     byte ptr [ebp+IdtMemberHigh+1], al ; Установка байта доступа
  56. .text:F53B39A1 018                 jnb     short loc_F53B39B0
  57. .text:F53B39A3     Установка типа шлюза
  58. .text:F53B39A3 018                 mov     dl, al
  59. .text:F53B39A5 018                 xor     dl, byte ptr [ebp+SluiceType]
  60. .text:F53B39A8 018                 and     dl, 0Fh
  61. .text:F53B39AB 018                 xor     al, dl
  62. .text:F53B39AD 018                 mov     byte ptr [ebp+IdtMemberHigh+1], al
  63. .text:F53B39B0
  64. .text:F53B39B0     loc_F53B39B0:                           ; CODE XREF: .text:F53B39A1j
  65. .text:F53B39B0 018                 mov     dl, byte ptr [ebp+DPL] ; часто 4
  66. .text:F53B39B3 018                 cmp     dl, 4
  67. .text:F53B39B6 018                 jnb     short loc_F53B39C5
  68. .text:F53B39B8     Установка DPL
  69. .text:F53B39B8 018                 shl     dl, 5
  70. .text:F53B39BB 018                 xor     dl, al
  71. .text:F53B39BD 018                 and     dl, 60h
  72. .text:F53B39C0 018                 xor     al, dl
  73. .text:F53B39C2 018                 mov     byte ptr [ebp+IdtMemberHigh+1], al
  74. .text:F53B39C5
  75. .text:F53B39C5     loc_F53B39C5:                           ; CODE XREF: .text:F53B39B6j
  76. .text:F53B39C5 018                 mov     ax, word ptr [ebp+Selector] ; часто 0
  77. .text:F53B39C9 018                 test    ax, ax
  78. .text:F53B39CC 018                 jz      short loc_F53B39D2
  79. .text:F53B39CE     Установка селектора
  80. .text:F53B39CE 018                 mov     word ptr [ebp+IdtMemberLow+2], ax
  81. .text:F53B39D2
  82. .text:F53B39D2     loc_F53B39D2:                           ; CODE XREF: .text:F53B39CCj
  83. .text:F53B39D2 018                 push    eax
  84. .text:F53B39D3 01C                 mov     eax, cr0
  85. .text:F53B39D6     Аргумент SluiceType больше не нужен,
  86. .text:F53B39D6     используется как временная переменная
  87. .text:F53B39D6 01C                 mov     [ebp+SluiceType], eax
  88. .text:F53B39D9     Разрешаем запись в страницы только для чтения
  89. .text:F53B39D9 01C                 and     eax, 0FFFEFFFFh
  90. .text:F53B39DE 01C                 mov     cr0, eax
  91. .text:F53B39E1 01C                 pop     eax
  92. .text:F53B39E2     Фактическая замена элемента IDT
  93. .text:F53B39E2 018                 mov     eax, [ebp+IdtMemberLow]
  94. .text:F53B39E5 018                 mov     [esi], eax
  95. .text:F53B39E7 018                 mov     eax, [ebp+IdtMemberHigh]
  96. .text:F53B39EA 018                 mov     [esi+4], eax
  97. .text:F53B39ED 018                 push    eax
  98. .text:F53B39EE     Восстанавливаем cr0
  99. .text:F53B39EE 01C                 mov     eax, [ebp+SluiceType]
  100. .text:F53B39F1 01C                 mov     cr0, eax
  101. .text:F53B39F4 01C                 pop     eax
  102. .text:F53B39F5 018                 mov     eax, ecx
  103. .text:F53B39F7
  104. .text:F53B39F7     loc_F53B39F7:                           ; CODE XREF: .text:F53B393Fj
  105. .text:F53B39F7 018                 pop     edi
  106. .text:F53B39F8 014                 pop     esi
  107. .text:F53B39F9 010                 pop     ebx
  108. .text:F53B39FA 00C                 leave
  109. .text:F53B39FB 000                 retn    18h
  110. .text:F53B39FB     sub_F53B392E    endp


Первая функция 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




Ранг: 25.8 (посетитель), 4thx
Активность: 0.030
Статус: Участник

Создано: 02 марта 2010 10:53 · Поправил: -=Hellsing=-
· Личное сообщение · #3

DenCoder пишет:
Ну и где же и как же нам вставить свой код?...


Попробуй, поставить JMP на свой код пускай в нём выполняется патчение ,того что тебе надо и код Syser'a или, после патчение пускай возвращается на следующею команду после твоего джампа обратно.

Еще можно для места под патч добавить секцию.




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 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





Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 08 марта 2010 11:34 · Поправил: DenCoder
· Личное сообщение · #5

Взял уже новое железо. Сисер заработал... но бсоды не прекратились. Двойных ошибок только не стало и реже стали случаться. Последний бсод был с IRQL_NOT_LESS_OR_EQUAL c eip несуществющего адреса и irql = 0xFF...

-----
IZ.RU



<< . 1 . 2 .
 eXeL@B —› Дневники и блоги —› Драйвер для ATI 3D RAGE PRO TURBO AGP 2X и реверсинг
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати