Сейчас на форуме: (+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
Статус: Участник

Создано: 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:
  1. BUGCHECK_STR:  0x7f_8
  2.  
  3. TSS:  00000028 -- (.tss 0x28)
  4. eax=0000f0ac ebx=00000000 ecx=0000f054 edx=f53e7816 esi=00000030 edi=0000262c
  5. eip=f54fcf00 esp=0000f000 ebp=0000f02c iopl=0         nv up di pl nz ac po nc
  6. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010012
  7. Syser!gpSyserPluginUI+0x1684:
  8. f54fcf00 68023bb5f7      push    offset SDbgMsg+0xb02 (f7b53b02)


Почему бы в Ida не посмотреть?
В Syser.sys не нашел по указанному смещению (0x1684) такой команды, видимо он самораспаковывается, или в нем 2 сегмента кода, на тот момент не установил. Но в SDbgMsg.sys обнаружил по смещению 0xb02 функцию с единственной O-ссылкой. По смещению A18, на который эта ссылка указывала, находилось

Code:
  1. .text:00010A13 028 68 78 24 01 00                push    offset dword_12478
  2. .text:00010A18 02C 68 02 0B 01 00                push    offset sub_10B02
  3. .text:00010A1D 030 6A 0E                         push    0Eh
  4. .text:00010A1F 034 E8 4E FB FF FF                call    sub_10572


Параметр 0E - это как раз номер исключения (ошибки), sub_10B02 - адрес того самого обработчика этого исключения. Смысл вызываемой функции sub_10572 в том, что в ней подменяется адрес обработчика исключения #GP на sub_10B02. И я мыслю так, что этот обработчик не вызывается, так как не успело обработаться какое-то другое из списка...

Ладно, скачал 1195 релиз Syser'а, буду проверять, то же ли самое. Скопирую перед установкой нового сисера старые драйвера от него с базами Ida в другую папку...

-----
IZ.RU





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

Создано: 16 февраля 2010 22:46
· Личное сообщение · #3

И 1195 весело, под музыку кейгена, вылетает в BSOD с той же ошибкой.

В дровах нового Syser'а изменен только Syser.sys. Все остальные дрова те же.

Результаты анализа дампа такие

Code:
  1. kd> !analyze --f
  2. ********************************************************************** *********
  3. *                                                                             *
  4. *                        Bugcheck Analysis                                    *
  5. *                                                                             *
  6. ********************************************************************** *********
  7.  
  8. UNEXPECTED_KERNEL_MODE_TRAP (7f)
  9. This means a trap occurred in kernel mode, and it's a trap of a kind
  10. that the kernel isn't allowed to have/catch (bound trap) or that
  11. is always instant death (double fault).  The first number in the
  12. bugcheck params is the number of the trap (8 = double fault, etc)
  13. Consult an Intel x86 family manual to learn more about what these
  14. traps are. Here is a *portion* of those codes:
  15. If kv shows a taskGate
  16.         use .tss on the part before the colon, then kv.
  17. Else if kv shows a trapframe
  18.         use .trap on that value
  19. Else
  20.         .trap on the appropriate frame will show where the trap was taken
  21.         (on x86, this will be the ebp that goes with the procedure KiTrap)
  22. Endif
  23. kb will then show the corrected stack.
  24. Arguments:
  25. Arg1: 00000008, EXCEPTION_DOUBLE_FAULT
  26. Arg2: 80042000
  27. Arg3: 00000000
  28. Arg4: 00000000
  29.  
  30. Debugging Details:
  31. ------------------
  32.  
  33.  
  34. BUGCHECK_STR:  0x7f_8
  35.  
  36. TSS:  00000028 -- (.tss 0x28)
  37. eax=0000800b ebx=00000080 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
  38. eip=f54c7819 esp=0000f000 ebp=0000f004 iopl=0         nv up di ng nz na po cy
  39. cs=0008  ss=0010  ds=0120  es=0120  fs=0000  gs=0000             efl=00010083
  40. Syser!DllUnload+0x885b:
  41. f54c7819 f00fba2d3c6b60f51f lock bts dword ptr [Syser!gpSyserPluginUI+0x12e0 (f5606b3c)],1Fh ds:0120:f5606b3c=????????
  42. Resetting default scope
  43.  
  44. DEFAULT_BUCKET_ID:  DRIVER_FAULT
  45.  
  46. PROCESS_NAME:  System
  47.  
  48. LAST_CONTROL_TRANSFER:  from 00000000 to f54c7819
  49.  
  50. STACK_TEXT:  
  51. 0000f004 00000000 00000000 00000000 00000000 Syser!DllUnload+0x885b
  52.  
  53.  
  54. STACK_COMMAND:  .tss 0x28 ; kb
  55.  
  56. FOLLOWUP_IP: 
  57. Syser!DllUnload+885b
  58. f54c7819 f00fba2d3c6b60f51f lock bts dword ptr [Syser!gpSyserPluginUI+0x12e0 (f5606b3c)],1Fh
  59.  
  60. SYMBOL_STACK_INDEX:  0
  61.  
  62. SYMBOL_NAME:  Syser!DllUnload+885b
  63.  
  64. FOLLOWUP_NAME:  MachineOwner
  65.  
  66. MODULE_NAME: Syser
  67.  
  68. IMAGE_NAME:  Syser.sys
  69.  
  70. DEBUG_FLR_IMAGE_TIMESTAMP:  4b49f44d
  71.  
  72. FAILURE_BUCKET_ID:  0x7f_8_Syser!DllUnload+885b
  73.  
  74. BUCKET_ID:  0x7f_8_Syser!DllUnload+885b
  75.  
  76. Followup: MachineOwner
  77. ---------


Code:
  1. kd> !thread
  2. THREAD 8358c1e8  Cid 0004.0088  Teb: 00000000 Win32Thread: 00000000 RUNNING on processor 0
  3. Not impersonating
  4. DeviceMap                 e10010e0
  5. Owning Process            0       Image:         <Unknown>
  6. Attached Process          837cb660       Image:         System
  7. Wait Start TickCount      37883          Ticks: 0
  8. Context Switch Count      709             
  9. UserTime                  00:00:00.000
  10. KernelTime                00:00:00.000
  11. Start Address NtApm!SuspendPollThread (0xf7bef50a)
  12. Stack Init f7be3000 Current f7be2d34 Base f7be3000 Limit f7be0000 Call 0
  13. Priority 8 BasePriority 8 PriorityDecrement 0 DecrementCount 0
  14. ChildEBP RetAddr  Args to Child              
  15. 00000000 f54c7819 00000000 00000000 00000000 nt!KiTrap08+0x44 (FPO: TSS 28:0)
  16. WARNING: Stack unwind information not available. Following frames may be wrong.
  17. 0000f004 00000000 00000000 00000000 00000000 Syser!DllUnload+0x885b


Более подробную информацию выложу позже.

-----
IZ.RU





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

Создано: 16 февраля 2010 23:16
· Личное сообщение · #4

Пока непонятно, в чем дело. Возможно в дампе просто не та информация. По указанному смещению Syser!DllUnload+0x885b действительно находится указанная команда lock bts dword ptr [Syser!gpSyserPluginUI+0x12e0 (f5606b3c)], 1Fh. Но блок, в контексте которого эта команда с префиксом LOCK, аналогичен блоку, заключенному в скобки критических секций (EnterCriticalSection и LeaveCriticalSection).

Code:
  1. .text:0001980D
  2. .text:0001980D loc_1980D:              ; CODE XREF: .text:00019822j
  3. .text:0001980D inc     [ebp+var_4]
  4. .text:00019810 cmp     [ebp+var_4], 1000h
  5. .text:00019817 jg      short loc_19824
  6.  
  7. .text:00019819 lock bts dword_158B3C, 1Fh
  8. .text:00019822 jb      short loc_1


Как может произойти исключение на этой команде???

Возможно следующий BSOD даст другой, более правдивый дамп...

-----
IZ.RU





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

Создано: 17 февраля 2010 00:01 · Поправил: DenCoder
· Личное сообщение · #5

Обнаружил еще по кросс-референсам, что функция sub_19800, которой принадлежит этот блок, вызывается в самом начале одного из трех обработчиков исключений 6, 0B и 0C. Это соответственно #UD (Недопустимая операция), #NP (Сегмент недоступен) и #SS (Ошибка стека). Но к списку одновременных исключений, вызывающих #DF, относится только #NP и #SS.

В качестве аргументов этой функции передается только один аргумент в каждом обработчике - номер исключения. Но сама функция оперирует гораздо большим количеством - 8 аргументов. Эти аргументы - адрес возврата, код ошибки, который передается исключению. Но до обработки их не доходит ввиду появления еще одного исключения.

-----
IZ.RU





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

Создано: 17 февраля 2010 00:35
· Личное сообщение · #6

Сдается мне, что ошибка в Syser в том, что он просто не обрабатывает 8 исключение

-----
IZ.RU





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

Создано: 17 февраля 2010 01:29 · Поправил: DenCoder
· Личное сообщение · #7

И только я приготовился к новому запуску сиськи, закрыл уже браузер, хотел уже закрыть WinDbg, но решил пробить стек от его лимита. Для меня сначала все казалось бессмысленными данными. Но вдруг краем глаза заметил, что все данные повторяются.

Code:
  1. f7be1700  0000000d 804e1827 00000000 f54c7819
  2. f7be1710  00000008 00010083 00000001 00001740
  3. f7be1720  f550d679 0000000d 804e1827 00000000
  4. f7be1730  f54c7819 00000008 00010083 00000001
  5. f7be1740  00001764 f550d679 0000000d 804e1827
  6. f7be1750  00000000 f54c7819 00000008 00010083
  7. f7be1760  00000001 00001788 f550d679 0000000d
  8. f7be1770  804e1827 00000000 f54c7819 00000008


Итак до бесконечности. Налицо переполнение стека!!! А это #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





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

Создано: 17 февраля 2010 11:45 · Поправил: DenCoder
· Личное сообщение · #8

17 февраля

ntoskrnl реверсить да с pdb-файлами одно удовольствие, даже толком поспать не смог...

804e1827 - адрес обработчика тоже исключения 0D. (#GP - общая ошибка защиты)

Похоже, что Syser делает подмену обработчика по стандарту - сначала его обработчик, затем виндовый. Обработчик в Syser вызывается через шлюз вызова, виндовый с кодом ошибки при этом сохраняется дальше в стеке, чтобы быть вызванным после обработки Syser'а. Возможно в некоторых случаях наоборот. Но почему же переполнение стека???

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

Code:
  1. f7be29b0  f550d679 0000000d 804e1827 00000000
  2. f7be29c0  f54c7819 00000008 00010083 00000001
  3. f7be29d0  000029f4 f550d679 0000000d 804e1827
  4. f7be29e0  00000000 f54c7819 00000008 00010083
  5. f7be29f0  00000001 00002a18 f550d679 0000000d
  6. f7be2a00  804e1827 00000000 f54c7819 00000008
  7. f7be2a10  00010083 00000001 00002a3c f550d679
  8. f7be2a20  0000000d 804e1827 00000000 f54c7819
  9. f7be2a30  00000008 00010083 00000001 e1820000
  10. f7be2a40  f550d985 0000000c 804e1530 00000000
  11. f7be2a50  f54f371c 00000008 00010097 8337c15c
  12. f7be2a60  000080e5 00000118 00000202 00f001fa
  13. f7be2a70  f7be2dcc f7be2d74 0000530b f7beff40
  14. f7be2a80  0000530b f7beff40 00000000 f7be2d74
  15. f7be2a90  f7bef99d f7be2aa4 f7beff60 00000000
  16. f7be2aa0  804dc750 00010006 00000000 836f6380
  17. f7be2ab0  836f6380 f7be2acc 80563ffe 836f6388
  18. f7be2ac0  00000000 00000000 837ee730 f7be2af0
  19. f7be2ad0  00000202 804e834a 000000b4 804e8372
  20. f7be2ae0  00000001 00000001 00000000 f7be2b9c
  21. f7be2af0  804ec813 f7be2b04 00000001 00000300
  22. f7be2b00  8055ef80 00000000 f7be2b84 f7be2b84
  23. f7be2b10  f7be2b84 f7be2b84 f7be2b84 f7be2b84
  24. f7be2b20  f7be2b84 f7be2b84 f7be2b84 f7be2b84
  25. f7be2b30  00000000 00000000 00000120 00000120
  26. f7be2b40  00000000 00000000 00000000 00000000
  27. f7be2b50  00000000 0000530b e1820000 000080bc
  28. f7be2b60  00000118 00000200 e1824000 e1825000
  29. f7be2b70  e1826000 e1827000 e1828000 e1829000
  30. f7be2b80  836f6ca8 e1958000 00005314 00000001
  31. f7be2b90  000000b4 00000000 000000b4 0000081b
  32. f7be2ba0  8055ef80 f7be2bd8 80549631 837f7000
  33. f7be2bb0  0000081b 00000015 837a3548 837f1000
  34. f7be2bc0  00000001 ffffff4c 00000000 00000000
  35. f7be2bd0  c038606c 0000001b f7be2c18 8054b28b
  36. f7be2be0  8054b2af 837a3548 00000000 00000000
  37. f7be2bf0  e180cbf8 00000001 00000000 00000070
  38. f7be2c00  804dcea6 00000001 00000006 f7be2c1c
  39. f7be2c10  8058ee67 e180cb90 f7be2dac 805b52ce
  40. f7be2c20  e181b000 00000000 00000000 805b52d8
  41. f7be2c30  0000067a 00000000 0000067a 00000000
  42. f7be2c40  00000002 0000047e 000029ed 00000000
  43. f7be2c50  00000000 00000000 00000000 00000000
  44. f7be2c60  00000000 00000000 00000000 00000000
  45. f7be2c70  00000000 00000000 f768adae 000001f7
  46. f7be2c80  837a4374 837a40e8 837a4370 f7be2c9c
  47. f7be2c90  f7692729 837a4374 837d8058 f7be2cb4
  48. f7be2ca0  f7691502 837da5c8 837a4374 806f3628
  49. f7be2cb0  8345c26c f7be2cec f768bda1 00000001
  50. f7be2cc0  837a4370 00000000 837da918 00000202
  51. f7be2cd0  804e3ee3 837da918 837a40e8 ffdff9c0
  52. f7be2ce0  0d7da5c8 f7be2d00 f768e614 00000000
  53. f7be2cf0  00000000 00000000 837dab7c 00000000
  54. f7be2d00  f7be2d24 804dad9f 837da918 837a4030
  55. f7be2d10  0001000d ffffffff f7be2d24 806f4076
  56. f7be2d20  00000000 00000000 f7bef347 badb0d00
  57. f7be2d30  00000000 f7be2dcc 00000246 804dbde0
  58. f7be2d40  f7be2d80 8358c1e8 ffdff120 00000246
  59. f7be2d50  804dc6bc 8358c258 8358c1e8 804dc6f2
  60. f7be2d60  f7beff60 00000000 804dc750 804dc98b
  61. f7be2d70  00be2dcc f7be2d94 f7befaa6 0000530b
  62. f7be2d80  f7be2d90 f7be2d8c 00000000 00000000
  63. f7be2d90  00000000 00000000 f7bef541 00000000
  64. f7be2da0  8358c1e8 f7be2ddc 00000000 00000000
  65. f7be2db0  8057dfed 00000000 00000000 00000000
  66. f7be2dc0  00000000 f7be2db8 00000000 ffffffff
  67. f7be2dd0  804e2af1 804fa640 00000000 00000000
  68. f7be2de0  804fa477 f7bef50a 00000000 00000000
  69. f7be2df0  0000027f 00000000 00000000 00000000
  70. f7be2e00  00000000 00000000 00001f80 00000000
  71. f7be2e10  00000000 00000000 00000000 00000000


Вверху наши рекурсии обработчика, внизу около 512 байт до базы стека заполнено нулями.
Попробуем разобрать по частям наш стек

вводим команды dd, начиная с dd f7be2a3c L1, чтобы удобнее было здесь выложить

Первая часть
Здесь повторяется, за исключением e1820000
Code:
  1. f7be2a3c  e1820000 - адрес в выгружаемом пуле (Paged Pool)
  2. f7be2a38  00000001 - ???
  3. f7be2a34  00010083 - ???
  4. f7be2a30  00000008 - ???
  5. f7be2a2c  f54c7819 - адрес команды в обработчике Syser, вызвавшей исключение
  6. f7be2a28  00000000 - код ошибки исключения, 0 для стандартного обработчика исключения #GP в большинстве случаев
  7. f7be2a24  804e1827 - адрес виндового обработчика в ntoskrnl исключения #GP, _KiTrap0D
  8. f7be2a20  0000000d - номер исключения для вызываемой из обработчика Syser исключения #GP функции
  9. f7be2a1c  f550d679 - адрес возврата в обработчик Syser исключения #GP
  10. f7be2a18  00002a3c - сохраняемый ebp для для вызываемой из обработчика Syser исключения #GP функции


Это я уже выкладывал, но в таком виде смотреть удобней и приятней. Как мы узнали, что e1820000 - пул? Очень просто - набрали команду !address e1820000 (благо, у меня полный креш дамп). В ответ windbg напрягся, подумал и выдал

e1000000 - 0fc00000
Usage KernelSpaceUsagePagedPool

К пулу еще, может, вернусь...

Итак, началось все (точнее, повторы начались) с непонятных 3 двойных слов и адреса команды, вызвавшей исключение (не факт, конечно, в зависимости от исключения адрес может указывать на следующую команду). Но эта команда в функции, которая вызывается из обработчика какого-то исключения (нельзя сказать, что началось все именно с #GP, поскольку эта функция вызывается многими обработчиками). И, возможно, 3 этих непонятных числа - составной код ошибки. Но тогда из этого и из того, что только два исключения из набора {0, 0A, 0B, 0C, 0D, 0E} способны вызвать 8, а также из того, что второе исключение - 0C, следует только одно:

все началось с исключения, не входящего в этот набор.

Про составные коды ошибок в книге от Зубкова ничего не нашел, такие не исключаются при исключениях от 12h... Вернемся к этому вопросу чуть позже (для этого надо погуглить).

С первой частью дампа немного ясно. Возможно, вторая часть больше прояснит смысл неясных двойных слов.

Code:
  1. f7be2a4c  00000000 - код ошибки
  2. f7be2a48  804e1530 - адрес виндового обработчика в ntoskrnl исключения #SS, _KiTrap0C
  3. f7be2a44  0000000c - номер исключения для вызываемой из обработчика Syser исключения #SS функции
  4. f7be2a40  f550d985 - адрес возврата в обработчик Syser исключения #SS


По той же самой схеме, как и выше, это ни что иное, как результат исключения 0C (#SS). Но код ошибки равен 0, а это значит, что не было переполнения стека и ошибка произошла не из-за отсутствия сегмента стека ss. Но, по определению не может происходить одновременно два исключения(#SS и #GP) из набора выше без результирующего #DF! Либо из этого правила есть исключения, либо #SS было обработано "правильно" и одно из неясных слов первой части дампа - адрес возврата. Хотя возможно еще и третье - часть стека был заменена, что вполне может иметь место при переполнении стека (тогда третья часть дампа поможет :s2.

2-ое невозможно, так как код обработчика исключения sub_5F97E после возврата из функции затер бы флагами и другими регистрами все.

Вот код обработчика, по которому можно увидеть, что после вызова функции - заглушка, хотя можно там, между командами mov fs, eax и pop fs вставить дополнительный код обработчика.

Code:
  1. .text:0005F97E     sub_5F97E proc near     ; DATA XREF: .text:00012779o
  2. .text:0005F97E 000 push    0Ch
  3. .text:0005F980 004 call    sub_19800
  4. .text:0005F985 004 lea     esp, [esp+4]
  5. .text:0005F989 000 pushf
  6. .text:0005F98A 004 pusha
  7. .text:0005F98B 024 mov     ebp, esp
  8. .text:0005F98D 024 push    ds
  9. .text:0005F98E 028 push    es
  10. .text:0005F98F 02C push    fs
  11. .text:0005F991 030 mov     ax, 23h
  12. .text:0005F995     db      66h
  13. .text:0005F995 030 mov     ds, ax
  14. .text:0005F998     assume ds:nothing
  15. .text:0005F998     db      66h
  16. .text:0005F998 030 mov     es, ax
  17. .text:0005F99B     assume es:nothing
  18. .text:0005F99B 030 mov     ax, 30h
  19. .text:0005F99F     db      66h
  20. .text:0005F99F 030 mov     fs, ax
  21. .text:0005F9A2     assume fs:nothing
  22. .text:0005F9A2 030 pop     fs
  23. .text:0005F9A4     assume fs:nothing
  24. .text:0005F9A4 02C pop     es
  25. .text:0005F9A5     assume es:nothing
  26. .text:0005F9A5 028 pop     ds
  27. .text:0005F9A6     assume ds:_data
  28. .text:0005F9A6 024 popa
  29. .text:0005F9A7 004 popf
  30. .text:0005F9A8 000 retn
  31. .text:0005F9A8     sub_5F97E endp


-----
IZ.RU





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

Создано: 17 февраля 2010 11:55 · Поправил: DenCoder
· Личное сообщение · #9

и код функции, которая вызывается большинством обработчиков Syser

Code:
  1. .text:00019800     sub_19800       proc near               ; CODE XREF: .text:0005F674p
  2. .text:00019800                                             ; .text:0005F95Ap
  3. .text:00019800                                             ; .text:0005F980p
  4. .text:00019800                                             ; .text:0005F9ACp
  5. .text:00019800
  6. .text:00019800     var_C           = dword ptr -0Ch
  7. .text:00019800     var_8           = dword ptr -8
  8. .text:00019800     var_4           = dword ptr -4
  9. .text:00019800     arg_0           = dword ptr  8
  10. .text:00019800     arg_8           = dword ptr  10h
  11. .text:00019800     arg_C           = dword ptr  14h
  12. .text:00019800     arg_10          = dword ptr  18h
  13. .text:00019800     arg_14          = dword ptr  1Ch
  14. .text:00019800     arg_18          = dword ptr  20h
  15. .text:00019800     arg_1C          = dword ptr  24h
  16. .text:00019800
  17. .text:00019800 000                 push    ebp
  18. .text:00019801 004                 mov     ebp, esp
  19. .text:00019803 004                 sub     esp, 4
  20. .text:00019806 008                 mov     [ebp+var_4], 0
  21. .text:0001980D
  22. .text:0001980D     loc_1980D:                              ; CODE XREF: .text:00019822j
  23. .text:0001980D 008                 inc     [ebp+var_4]
  24. .text:00019810 008                 cmp     [ebp+var_4], 1000h
  25. .text:00019817 008                 jg      short loc_19824
  26. .text:00019819 008                 lock bts dword_158B3C, 1Fh
  27. .text:00019822 008                 jb      short loc_1980D
  28. .text:00019824
  29. .text:00019824     loc_19824:                              ; CODE XREF: .text:00019817j
  30. .text:00019824 008                 push    eax
  31. .text:00019825 00C                 push    ds
  32. .text:00019826 010                 mov     eax, 10h
  33. .text:0001982B                     db      66h
  34. .text:0001982B 010                 mov     ds, ax
  35. .text:0001982E                     assume ds:nothing
  36. .text:0001982E 010                 mov     eax, [esp+0Ch+var_8]
  37. .text:00019832 010                 mov     ds:dword_157B38, eax
  38. .text:00019837 010                 xor     eax, eax
  39. .text:00019839 010                 mov     eax, [esp+0Ch+var_C]
  40. .text:0001983C 010                 mov     ds:word_157B9A, ax
  41. .text:00019842 010                 mov     ds:dword_157B3C, ecx
  42. .text:00019848 010                 mov     ds:dword_157B40, edx
  43. .text:0001984E 010                 mov     ds:dword_157B44, ebx
  44. .text:00019854 010                 mov     ds:dword_157B50, esi
  45. .text:0001985A 010                 mov     ds:dword_157B54, edi
  46. .text:00019860 010                 mov     eax, [ebp+0]
  47. .text:00019863 010                 mov     ds:dword_157B4C, eax
  48. .text:00019868 010                 mov     eax, [ebp+arg_10]
  49. .text:0001986B 010                 mov     ds:word_157B96, ax
  50. .text:00019871 010                 test    ax, 3
  51. .text:00019875 010                 jz      short loc_1988A
  52. .text:00019877 010                 mov     eax, [ebp+arg_18]
  53. .text:0001987A 010                 mov     ds:dword_157B48, eax
  54. .text:0001987F 010                 mov     eax, [ebp+arg_1C]
  55. .text:00019882 010                 mov     ds:word_157B98, ax
  56. .text:00019888 010                 jmp     short loc_1989B
  57. .text:0001988A     ; ---------------------------------------------------------------------- -----
  58. .text:0001988A
  59. .text:0001988A     loc_1988A:                              ; CODE XREF: .text:00019875j
  60. .text:0001988A 010                 lea     eax, [ebp+arg_18]
  61. .text:0001988D 010                 mov     ds:dword_157B48, eax
  62. .text:00019892 010                 mov     ax, ss
  63. .text:00019895 010                 mov     ds:word_157B98, ax
  64. .text:0001989B
  65. .text:0001989B     loc_1989B:                              ; CODE XREF: .text:00019888j
  66. .text:0001989B 010                 xor     eax, eax
  67. .text:0001989D 010                 mov     ax, fs
  68. .text:000198A0 010                 mov     ds:word_157B9C, ax
  69. .text:000198A6 010                 mov     ax, es
  70. .text:000198A9 010                 mov     ds:word_157B94, ax
  71. .text:000198AF 010                 mov     ax, gs
  72. .text:000198B2 010                 mov     ds:word_157B9E, ax
  73. .text:000198B8 010                 mov     eax, [ebp+arg_8]
  74. .text:000198BB 010                 mov     ds:dword_157BBC, eax
  75. .text:000198C0 010                 mov     eax, [ebp+arg_0]
  76. .text:000198C3 010                 mov     ds:dword_157BB8, eax
  77. .text:000198C8 010                 mov     eax, [ebp+arg_C]
  78. .text:000198CB 010                 mov     ds:dword_157B8C, eax
  79. .text:000198D0 010                 mov     eax, [ebp+arg_14]
  80. .text:000198D3 010                 mov     ds:dword_157B90, eax
  81. .text:000198D8 010                 pop     ds
  82. .text:000198D9                     assume ds:_data
  83. .text:000198D9 00C                 pop     eax
  84. .text:000198DA 008                 pusha
  85. .text:000198DB 028                 pushf
  86. .text:000198DC 02C                 cld
  87. .text:000198DD 02C                 mov     eax, dword_157854
  88. .text:000198E2 02C                 test    eax, eax
  89. .text:000198E4 02C                 jz      short loc_1992D
  90. .text:000198E6 02C                 cmp     byte ptr ds:loc_25DD3[eax], 0
  91. .text:000198ED 02C                 jz      short loc_1992D
  92. .text:000198EF 02C                 call    sub_43FD8
  93. .text:000198F4 02C                 mov     ecx, dword_157B8C
  94. .text:000198FA 02C                 mov     edx, dword_157854
  95. .text:00019900 02C                 cmp     ecx, [edx+4408h]
  96. .text:00019906 02C                 mov     dword_157B30, eax
  97. .text:0001990B 02C                 jb      short loc_19915
  98. .text:0001990D 02C                 cmp     ecx, [edx+440Ch]
  99. .text:00019913 02C                 jb      short loc_1992D
  100. .text:00019915
  101. .text:00019915     loc_19915:                              ; CODE XREF: .text:0001990Bj
  102. .text:00019915 02C                 mov     edi, eax
  103. .text:00019917 02C                 imul    edi, 8Ch
  104. .text:0001991D 02C                 add     edi, off_126C70
  105. .text:00019923 02C                 push    23h
  106. .text:00019925 030                 pop     ecx
  107. .text:00019926 02C                 mov     esi, offset dword_157B38
  108. .text:0001992B 02C                 rep movsd
  109. .text:0001992D
  110. .text:0001992D     loc_1992D:                              ; CODE XREF: .text:000198E4j
  111. .text:0001992D                                             ; .text:000198EDj
  112. .text:0001992D                                             ; .text:00019913j
  113. .text:0001992D 02C                 lock btr dword_158B3C, 1Fh
  114. .text:00019936 02C                 popf
  115. .text:00019937 028                 popa
  116. .text:00019938 008                 mov     esp, ebp
  117. .text:0001993A 004                 pop     ebp
  118. .text:0001993B 000                 retn
  119. .text:0001993B     sub_19800       endp


Что-то совсем туго... Неужели в некоторых случаях возможны два и более одновременных исключения типа #SS и #GP ???

-----
IZ.RU





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

Создано: 17 февраля 2010 12:41
· Личное сообщение · #10

Нашел на WASM --> здесь <-- фразу "а также: Зубков тоже ошибается... ". Видимо из-за ошибок автора книги, которую я читаю, вся неразбериха и получается.

-----
IZ.RU





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

Создано: 18 февраля 2010 14:19 · Поправил: DenCoder
· Личное сообщение · #11

Эта статья расставила все по местам.

Первая часть дампа стека будет выглядеть так

Code:
  1. f7be2a3c  e1820000 - адрес в выгружаемом пуле (Paged Pool)
  2. f7be2a38  00000001 - локальная переменная-итератор в вызываемой функции из обработчика Syser исключения
  3. f7be2a34  00010083 - EFLAGS
  4. f7be2a30  00000008 - селектор команд
  5. f7be2a2c  f54c7819 - адрес команды в обработчике Syser, вызвавшей исключение
  6. f7be2a28  00000000 - код ошибки исключения, 0 для стандартного обработчика исключения #GP в большинстве случаев
  7. f7be2a24  804e1827 - адрес виндового обработчика в ntoskrnl исключения #GP, _KiTrap0D
  8. f7be2a20  0000000d - номер исключения для вызываемой из обработчика Syser исключения #GP функции
  9. f7be2a1c  f550d679 - адрес возврата в обработчик Syser исключения #GP
  10. f7be2a18  00002a3c - сохраняемый ebp для для вызываемой из обработчика Syser исключения #GP функции


В EFLAGS только RS взведен. На тему этого флага есть расхождения, а у Зубкова вообще противоречивые высказывания в одном абзаце:

"Флаг RF - когда этот флаг равен 1, отладочные исключения временно запрещены. Он устанавливается командой IRETD из обработчика отладочного прерывания, чтобы #DB не произошло перед выполнением команды, которая его вызвала, еще раз. На флаг не влияют команды POPF, PUSHF, IRET."

На этом исследования ставлю пока на паузу, так как еще много других дел...

-----
IZ.RU




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

Создано: 18 февраля 2010 15:14
· Личное сообщение · #12

1) В нашей компьтерной коммисионке GF2 MX400 - 200р Радеоны и GF4 и 5-е по 500-600р
Неужто это дорого? Свяжись с любыми ремонтниками - они может бесплатно такое добро подарят.
2) Единственный плюс в твоей работе - это освоение syser и драйверов, но материал не подходящий.
Где гарантия, что дело не в драйвере, а в железе.

Был у меня в свое IDE-контроллер "ускоренный" с шиной VLB и с 286-м(!) на плате.
И драйвера были, но сам по себе он кривой был - железно.
Прямо с ним еще видео-карта. Так пока профи не сделали нормальные драйвера - она не заработала.

Ну и как нормальный вариант : все-таки поискать драйвера. Очень часто самые новые не есть самые лучшие.

3) А ты уверен, что для этой игры AGP 2X достаточно, а главное что твоя мамка это поддерживает и в БИОС-е включено ? Я уже для себя уяснил, что железо должно быть сбалансировано. Нельзя ждать безглючности, когда железо из разных весовых категорий.




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

Создано: 18 февраля 2010 18:26
· Личное сообщение · #13

1) Я сам себе ремонтник. Плюс ко всей продукции от ATI уже отношусь скептически. NVidia надо проверить.

2) Да, из названия темы можно убрать все про видеоадаптер и оставить реверс драйвера. Люблю копаться. Исследования проблемы могут помочь не только в освоении драйверов, но и выяснить, в чем же проблема на самом деле, в железе или в дровах?

3) Уверен - для двух версий драйверов ошибки разные. Соединить бы два комплекта драйверов в один без ошибок...

-----
IZ.RU





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

Создано: 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:
  1.   0(#DE) - 0008:804dfbff SE 0 32-битный шлюз прерывания
  2.   1(#DB) - 0008:f68f9fe8 SE 3 32-битный шлюз прерывания Syser!KiHookTrap_01
  3.   2(NMI) - 0058:0000112e SE 0 Шлюз задачи
  4.   3(#BP) - 0008:f68fa000 SE 3 32-битный шлюз прерывания Syser!KiHookTrap_03
  5.   4(#OF) - 0008:804e02e0 SE 3 32-битный шлюз прерывания
  6.   5(#BR) - 0008:804e0441 SE 0 32-битный шлюз прерывания
  7.   6(#UD) - 0008:F68FA018 SE 0 32-битный шлюз прерывания Syser!KiHookTrap_06
  8.   7(#NM) - 0008:804E0C33 SE 0 32-битный шлюз прерывания
  9.   8(#DF) - 0050:1188     SE 0 Шлюз задачи
  10.   9      - 0008:804E1060 SE 0 32-битный шлюз прерывания
  11.   A(#TS) - 0008:804E1185 SE 0 32-битный шлюз прерывания
  12.   B(#NP) - 0008:F68FA030 SE 0 32-битный шлюз прерывания Syser!KiHookTrap_0B
  13.   C(#SS) - 0008:F68FA048 SE 0 32-битный шлюз прерывания Syser!KiHookTrap_0C
  14.   D(#GP) - 0008:F68FA060 SE 0 32-битный шлюз прерывания Syser!KiHookTrap_0D
  15.   E(#PF) - 0008:F68F9FB8 SE 0 32-битный шлюз прерывания Syser!KiHookTrap_0E
  16.   F      - 0008:804E225A SE 0 32-битный шлюз прерывания
  17.  10(#MF) - 0008:804E237F SE 0 32-битный шлюз прерывания
  18.  11(#AC) - 0008:804E24BD SE 0 32-битный шлюз прерывания
  19.  12(#MC) - 00a0:804E225A SE 0 Шлюз задачи
  20.  13      - 0008:804E262B SE 0 32-битный шлюз прерывания
  21.  14      - 0008:804E225A SE 0 32-битный шлюз прерывания
  22.  15      - 0008:804E225A SE 0 32-битный шлюз прерывания
  23.  16      - 0008:804E225A SE 0 32-битный шлюз прерывания
  24.  17      - 0008:804E225A SE 0 32-битный шлюз прерывания
  25.  18      - 0008:804E225A SE 0 32-битный шлюз прерывания
  26.  19      - 0008:804E225A SE 0 32-битный шлюз прерывания
  27.  1A      - 0008:804E225A SE 0 32-битный шлюз прерывания
  28.  1B      - 0008:804E225A SE 0 32-битный шлюз прерывания
  29.  1C      - 0008:804E225A SE 0 32-битный шлюз прерывания
  30.  1D      - 0008:804E225A SE 0 32-битный шлюз прерывания
  31.  1E      - 0008:804E225A SE 0 32-битный шлюз прерывания
  32.  1F      - 0008:804E225A SE 0 32-битный шлюз прерывания
  33.  20      - 
  34.  21      - 
  35.  22      - 
  36.  23      - 
  37.  24      - 
  38.  25      - 
  39.  26      - 
  40.  27      - 
  41.  28      - 
  42.  29      - 
  43.  2A      - 0008:804DF417 SE 3 32-битный шлюз прерывания
  44.  2B      - 0008:804DF522 SE 3 32-битный шлюз прерывания
  45.  2C      - 0008:804DF6C7 SE 3 32-битный шлюз прерывания
  46.  2D      - 0008:F68FA078 SE 3 32-битный шлюз прерывания Syser!KiHookTrap_2D
  47.  2E      - 0008:804DEEA6 SE 3 32-битный шлюз прерывания
  48.  2F      - 0008:804E225A SE 0 32-битный шлюз прерывания
  49.  30      - 0008:806F447C SE 0 32-битный шлюз прерывания
  50.  31      - 0008:F68F9FD0 SE 0 32-битный шлюз прерывания Syser!KiHookTrap_31
  51.  32      - 0008:804DE574 SE 0 32-битный шлюз прерывания
  52.  33      - 0008:834D767C SE 0 32-битный шлюз прерывания
  53.  34      - 0008:835FDB94 SE 0 32-битный шлюз прерывания
  54.  35      - 0008:8348166C SE 0 32-битный шлюз прерывания
  55.  36      - 0008:804DE59C SE 0 32-битный шлюз прерывания
  56.  37      - 0008:804DE5A6 SE 0 32-битный шлюз прерывания
  57.  38      - 0008:806ED190 SE 0 32-битный шлюз прерывания
  58.  39      - 0008:8355B48C SE 0 32-битный шлюз прерывания
  59.  3A      - 0008:833BB044 SE 0 32-битный шлюз прерывания
  60.  3B      - 0008:833B9044 SE 0 32-битный шлюз прерывания
  61.  3C      - 0008:F68FA090 SE 0 32-битный шлюз прерывания Syser!KiHookTrap_3C
  62.  3D      - 0008:804DE5E2 SE 0 32-битный шлюз прерывания
  63.  3E      - 0008:837DA954 SE 0 32-битный шлюз прерывания
  64.  3F      - 0008:837D8DD4 SE 0 32-битный шлюз прерывания
  65.  40      - 0008:804DE600 SE 0 32-битный шлюз прерывания


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





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

Создано: 19 февраля 2010 21:47 · Поправил: DenCoder
· Личное сообщение · #15

Таблица дескрипторов.

Code:
  1. 0 -  обязательный нулевой дескриптор
  2. 8 -  00000000 FFFFFFFF 32 P DPL = 0 Code чтение было обращение 
  3. 10 -  00000000 FFFFFFFF 32 P DPL = 0 Data запись было обращение 
  4. 18 -  00000000 FFFFFFFF 32 P DPL = 3 Code чтение было обращение 
  5. 20 -  00000000 FFFFFFFF 32 P DPL = 3 Data запись было обращение 
  6. 28 -  80042000 000020AB 16 P DPL = 0 System  Занятый 32-битный TSS
  7. 30 -  FFDFF000 00001FFF 32 P DPL = 0 Data запись было обращение 
  8. 38 -  00013000 00000FFF 32 P DPL = 3 Data запись было обращение 
  9. 40 -  00000400 0000FFFF 16 P DPL = 3 Data запись 
  10. 48 -  
  11. 50 -  80550B80 00000068 16 P DPL = 0 System  Занятый 32-битный TSS
  12. 58 -  80550BE8 00000068 16 P DPL = 0 System  Свободный 32-битный TSS
  13. 60 -  00022F30 0000FFFF 16 P DPL = 0 Data запись было обращение 
  14. 68 -  000B8000 00003FFF 16 P DPL = 0 Data запись 
  15. 70 -  FFFF7000 000003FF 16 P DPL = 0 Data запись 
  16. 78 -  80400000 0000FFFF 16 P DPL = 0 Code чтение 
  17. 80 -  80400000 0000FFFF 16 P DPL = 0 Data запись 
  18. 88 -  
  19. 90 -  
  20. 98 -  
  21. A0 -  837EF048 00000068 16 P DPL = 0 System  Свободный 32-битный TSS
  22. A8 -  
  23. B0 -  
  24. B8 -  
  25. C0 -  
  26. C8 -  
  27. D0 -  
  28. D8 -  
  29. E0 -  F77AF000 0000FFFF 16 P DPL = 0 Code подчинненный чтение было обращение 
  30. E8 -  00000000 0000FFFF 16 P DPL = 0 Data запись 
  31. F0 -  804D8B28 0003CF7B 16 P DPL = 0 Code было обращение 
  32. F8 -  F7BE0000 0000FFFF 16 P DPL = 0 Data запись было обращение 
  33. 100 -  F77BF000 0000FFFF 32 P DPL = 0 Data запись было обращение 
  34. 108 -  F77BF000 0000FFFF 32 P DPL = 0 Data запись было обращение 
  35. 110 -  F77BF000 0000FFFF 32 P DPL = 0 Data запись было обращение 
  36. 118 -  F780F000 0000FFFF 16 P DPL = 0 Code подчинненный чтение было обращение 
  37. 120 -  F733AFA0 0000FFFF 32 P DPL = 0 Data запись было обращение


P - бит присутствия сегмента
Непонятно, почему у системных дескрипторов разрядность 16, а TSS - 32битные. Также непонятен вызов обработчика #MC через дескриптор A0. Но ошибки нет - парсинг макросом.

-----
IZ.RU





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

Создано: 20 февраля 2010 16:33 · Поправил: DenCoder
· Личное сообщение · #16

HiEndsoft тут неадекватно отозвался о моем блоге... Нельязя так... [09 апреля 2010 г.]ПОТЕРТО - ГОРМОНЫ У ВСЕХ УСПОКОИЛИСЬ

-----
IZ.RU





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 20 февраля 2010 23:08
· Личное сообщение · #17

Если не уймётесь, я обоих в бан отправлю.




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

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





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

Создано: 22 февраля 2010 22:22 · Поправил: DenCoder
· Личное сообщение · #19

Занопил установку хука на 6 исключение и уаля, хотя бы при старте винды комп не вылетает в BSOD.

Но и syser.sys не грузится.
Что-то странное происходит. Обработка любого исключения вызывает рекурсивные #GP(0). Команда вида mov dword ptr ss:Address, r32 вызывает #SS и вслед за ним те же рекурсии с #GP. Бред какой-то...

-----
IZ.RU





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

Создано: 23 февраля 2010 21:01
· Личное сообщение · #20

Ладно, с праздиком тебя! И давай расскажи, что у тебя такое случилось.

-----
IZ.RU





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 23 февраля 2010 22:09
· Личное сообщение · #21

Один понял сообщение, видимо, второй не понял. На 3 дня бан.




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

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




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

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




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

Создано: 27 февраля 2010 17:59
· Личное сообщение · #24

Это кстати от 1185.

В общем ясно - можно исключить 4-ый пункт. Значит какой-то драйвер сбивает селекторы или возникают какие-то условия, при которых выполняется код, в котором сам драйвер их сбивает. Будем искать... Пока отдыхаю.

-----
IZ.RU





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

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

Дистриб опять 1195, взят с форума

Изменил один байт ради интереса в syser.sys. Заменил префикс ss на команду NOP. Теперь вместо первого #SS возникает #GP. Если селекторы сбиты, то так и должно быть...

Нашел дальше в стеке, за адресом возникновения первого исключения, следующее:

Code:
  1. f7be2a50  f53e071d - eip, адрес инструкции, на которой возникло первое #GP (раньше #SS)
  2. f7be2a54  00000008 - cs
  3. f7be2a58  00010097 - EFLAGS
  4. f7be2a5c  833a7044 - обработчик прерывания 3C, см. (1)
  5. f7be2a60  000080e5 - должен быть eip, адрес последней команды
  6. f7be2a64  00000118 - должен быть cs
  7. f7be2a68 00000202 - очень похоже на EFLAGS
  8. f7be2a6c 00f001fa - при межсегментном переключении должно быть esp (в старших 16 битах возможно просто мусор)
  9. f7be2a70  0000530b - при межсегментном переключении должно быть ss
  10. f7be2a74  f7beff40
  11. f7be2a78  f7be2dcc
  12. f7be2a7c  f7be2d74


(1) Проверил каждый установленный сисером обработчик прерываний и нашел для INT 3C:

Code:
  1. f54f4050 6844703a83      push    833A7044h
  2. f54f4055 6812073ef5      push    offset Syser!DllUnload+0x34754 (f53e0712)
  3. f54f405a c3              ret


Это сходится с тем, что в стеке. Команда !address показывает, что это в невыгружаемом пуле, а поиск файла по первым байтам в системной папке находит только ntoskrnl.exe, но смещения для некоторых дальних джампов изменены. Кто-то скопировал полностью обработчик и поправил смещения...

Если теперь сравнить обработчик в сисере (f53acef6) с предположительно виндовым, то можно увидеть, что якобы виндовый приводит сначала селекторы в порядок (фрагменты кода помечены 2 и 3), а потом уже начинает обработку! Этого нет в сисере!!!

Code:
  1.  <b>Обработчик сисера</b>
  2. .text:F53E0712     sub_F53E0712    proc near               ; CODE XREF: .text:F53E0772j
  3. .text:F53E0712                                             ; DATA XREF: .text:F53AD7E5o
  4. .text:F53E0712 000                 cmp     cs:byte_F54F3B05, 1
  5. .text:F53E071A 000                 jz      short loc_F53E0725
  6. .text:F53E071C 000                 nop
  7. .text:F53E071D 000                 mov     dd:byte_F54F612B, 1
  8. .text:F53E0724 000                 retn
  9. .text:F53E0725     ; ---------------------------------------------------------------------- -----
  10. .text:F53E0725
  11. .text:F53E0725     loc_F53E0725:                           ; CODE XREF: .text:F53E071Aj
  12. .text:F53E0725 000                 lea     esp, [esp+4]
  13. .text:F53E0729 -04                 pusha
  14. .text:F53E072A 01C                 pushf
  15. .text:F53E072B 020                 in      al, 64h         ; AT Keyboard controller 8042.
  16. .text:F53E072D 020                 and     eax, 0FFh
  17. .text:F53E0732 020                 mov     byte_F54F613C, al
  18. .text:F53E0737 020                 mov     ebx, eax
  19. .text:F53E0739 020                 in      al, 60h         ; AT Keyboard controller 8042.
  20. .text:F53E073B 020                 mov     byte_F54C15E4, al
  21. .text:F53E0740 020                 call    sub_F53E004C
  22. .text:F53E0745 020                 inc     dword_F54F8290
  23. .text:F53E074B 020                 push    0Ch
  24. .text:F53E074D 024                 call    sub_F53DFC7C
  25. .text:F53E0752 024                 popf
  26. .text:F53E0753 020                 popa
  27. .text:F53E0754 000                 iret
  28. .text:F53E0754     sub_F53E0712    endp ; sp-analysis failed


Code:
  1.  <b>Предположительно виндовый обработчик</b>
  2. 833a7044 54              push    esp
  3. 833a7045 55              push    ebp
  4. 833a7046 53              push    ebx
  5. 833a7047 56              push    esi
  6. 833a7048 57              push    edi
  7. 833a7049 83ec54          sub     esp,54h
  8. 833a704c 8bec            mov     ebp,esp
  9. 833a704e 89442444        mov     dword ptr [esp+44h],eax
  10. 833a7052 894c2440        mov     dword ptr [esp+40h],ecx
  11. 833a7056 8954243c        mov     dword ptr [esp+3Ch],edx
  12. 833a705a f744247000000200 test    dword ptr [esp+70h],20000h
  13. 833a7062 0f852a010000    jne     833a7192
  14. 833a7068 66837c246c08    cmp     word ptr [esp+6Ch],8
  15. 833a706e 7423            je      833a7093
  16. 833a7070 8c642450        mov     word ptr [esp+50h],fs
  17. 833a7074 8c5c2438        mov     word ptr [esp+38h],ds
  18. 833a7078 8c442434        mov     word ptr [esp+34h],es
  19. 833a707c 8c6c2430        mov     word ptr [esp+30h],gs
  20. (2)
  21. 833a7080 bb30000000      mov     ebx,30h
  22. 833a7085 b823000000      mov     eax,23h
  23. 833a708a 668ee3          mov     fs,bx
  24. 833a708d 668ed8          mov     ds,ax
  25. 833a7090 668ec0          mov     es,ax
  26.  
  27. 833a7093 648b1d00000000  mov     ebx,dword ptr fs:[0]
  28. 833a709a 64c70500000000ffffffff mov dword ptr fs:[0],0FFFFFFFFh
  29. 833a70a5 895c244c        mov     dword ptr [esp+4Ch],ebx
  30. 833a70a9 81fc00000100    cmp     esp,10000h
  31. 833a70af 0f82b5000000    jb      833a716a
  32. 833a70b5 c744246400000000 mov     dword ptr [esp+64h],0
  33. 833a70bd fc              cld
  34. 833a70be 8b5d60          mov     ebx,dword ptr [ebp+60h]
  35. 833a70c1 8b7d68          mov     edi,dword ptr [ebp+68h]
  36. 833a70c4 89550c          mov     dword ptr [ebp+0Ch],edx
  37. 833a70c7 c74508000ddbba  mov     dword ptr [ebp+8],0BADB0D00h
  38. 833a70ce 895d00          mov     dword ptr [ebp],ebx
  39. 833a70d1 897d04          mov     dword ptr [ebp+4],edi
  40. 833a70d4 f60550f0dfffff  test    byte ptr ds:[0FFDFF050h],0FFh
  41. 833a70db 750d            jne     833a70ea
  42. 833a70dd bf08703a83      mov     edi,833A7008h
  43. 833a70e2 e97b3c13fd      jmp     nt!KiInterruptDispatch (804dad62)
  44. 833a70e7 8d4900          lea     ecx,[ecx]
  45. 833a70ea f7457000000200  test    dword ptr [ebp+70h],20000h
  46. 833a70f1 7509            jne     833a70fc
  47. 833a70f3 f7456c01000000  test    dword ptr [ebp+6Ch],1
  48. 833a70fa 74e1            je      833a70dd
  49. 833a70fc 0f21c3          mov     ebx,dr0
  50. 833a70ff 0f21c9          mov     ecx,dr1
  51. 833a7102 0f21d7          mov     edi,dr2
  52. 833a7105 895d18          mov     dword ptr [ebp+18h],ebx
  53. 833a7108 894d1c          mov     dword ptr [ebp+1Ch],ecx
  54. 833a710b 897d20          mov     dword ptr [ebp+20h],edi
  55. 833a710e 0f21db          mov     ebx,dr3
  56. 833a7111 0f21f1          mov     ecx,dr6
  57. 833a7114 0f21ff          mov     edi,dr7
  58. 833a7117 895d24          mov     dword ptr [ebp+24h],ebx
  59. 833a711a 894d28          mov     dword ptr [ebp+28h],ecx
  60. 833a711d 33db            xor     ebx,ebx
  61. 833a711f 897d2c          mov     dword ptr [ebp+2Ch],edi
  62. 833a7122 0f23fb          mov     dr7,ebx
  63. 833a7125 648b3d20000000  mov     edi,dword ptr fs:[20h]
  64. 833a712c 8b9ff8020000    mov     ebx,dword ptr [edi+2F8h]
  65. 833a7132 8b8ffc020000    mov     ecx,dword ptr [edi+2FCh]
  66. 833a7138 0f23c3          mov     dr0,ebx
  67. 833a713b 0f23c9          mov     dr1,ecx
  68. 833a713e 8b9f00030000    mov     ebx,dword ptr [edi+300h]
  69. 833a7144 8b8f04030000    mov     ecx,dword ptr [edi+304h]
  70. 833a714a 0f23d3          mov     dr2,ebx
  71. 833a714d 0f23d9          mov     dr3,ecx
  72. 833a7150 8b9f08030000    mov     ebx,dword ptr [edi+308h]
  73. 833a7156 8b8f0c030000    mov     ecx,dword ptr [edi+30Ch]
  74. 833a715c 0f23f3          mov     dr6,ebx
  75. 833a715f 0f23f9          mov     dr7,ecx
  76. 833a7162 e976ffffff      jmp     833a70dd
  77. 833a7167 8d4900          lea     ecx,[ecx]
  78. 833a716a 8b442464        mov     eax,dword ptr [esp+64h]
  79. 833a716e b910000000      mov     ecx,10h
  80. 833a7173 8bd4            mov     edx,esp
  81. 833a7175 c1e010          shl     eax,10h
  82. 833a7178 64031508000000  add     edx,dword ptr fs:[8]
  83. 833a717f 89442464        mov     dword ptr [esp+64h],eax
  84. (3)
  85. 833a7183 668ed1          mov     ss,cx
  86. 833a7186 8be2            mov     esp,edx
  87. 833a7188 8bea            mov     ebp,edx
  88.  
  89. 833a718a e92effffff      jmp     833a70bd


Теперь понятно, почему при первом исключении сисер сохраняет ebp = e1820000... Но что за адрес 118:80e5 ? WinDbg ничего не дает в ответ на этот запрос. Она просто не находит его в известных диапазонах адресов...

Нужен ntoskrnl.exe из папки %SystemRoot%\System32\ от Windows XP Pro SP2 для сравнения со своим. MD5-хэш моего B9D0F564511439E9C64F92387C622222, размер - 2 182 784 байт. Кто может, подсобите, плиз!

-----
IZ.RU




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

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

DenCoder пишет:
Нужен ntoskrnl.exe из папки %SystemRoot%\System32\ от Windows XP Pro SP2 для сравнения со своим. MD5-хэш моего B9D0F564511439E9C64F92387C622222.


--> ntoskrnl.exe <--




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

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





Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 01 марта 2010 13:38
· Личное сообщение · #28

Оптимально - вариант №1, но судя по топу ты воспользуешься №2




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

Создано: 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:
  1. .text:F53AD7DB 014 6A 0C                         push    0Ch
  2. .text:F53AD7DD 018 E8 78 24 03 00                call    sub_F53DFC5A; определяет номер прерывания
  3. .text:F53AD7E2 014 53                            push    ebx; 0
  4. .text:F53AD7E3 018 57                            push    edi; 4
  5. .text:F53AD7E4 01C 56                            push    esi; 0x10
  6. .text:F53AD7E5 020 68 12 07 3E F5                push    offset sub_F53E0712; обработчик прерывания
  7. .text:F53AD7EA 024 50                            push    eax; номер прерывания, у меня 3C
  8. .text:F53AD7EB 028 A3 40 61 4F F5                mov     dword_F54F6140, eax
  9. .text:F53AD7F0 028 E8 81 6B 00 00                call    sub_F53B4376; установщик хука


Код функции определения номера прерывания:

Code:
  1. .text:F53DFC5A     sub_F53DFC5A    proc near               ; CODE XREF: .text:F53AD6D5p
  2. .text:F53DFC5A                                             ; .text:F53AD7DDp
  3. .text:F53DFC5A                                             ; .text:F53E887Dp
  4. .text:F53DFC5A
  5. .text:F53DFC5A     arg_0           = dword ptr  4
  6. .text:F53DFC5A
  7. .text:F53DFC5A     ; FUNCTION CHUNK AT .text:F53DF744 SIZE 00000016 BYTES
  8. .text:F53DFC5A
  9. .text:F53DFC5A 000                 cmp     byte_F54F5890, 0
  10. .text:F53DFC61 000                 jnz     short loc_F53DFC76
  11. .text:F53DFC63 000                 mov     eax, [esp+arg_0]
  12. .text:F53DFC67 000                 cmp     eax, 10h
  13. .text:F53DFC6A 000                 jnb     short loc_F53DFC72
  14. .text:F53DFC6C 000                 add     eax, 30h
  15. .text:F53DFC6F
  16. .text:F53DFC6F     locret_F53DFC6F:                        ; CODE XREF: .text:F53DFC74j
  17. .text:F53DFC6F 000                 retn    4
  18. .text:F53DFC72     ; ---------------------------------------------------------------------- -----
  19. .text:F53DFC72
  20. .text:F53DFC72     loc_F53DFC72:                           ; CODE XREF: .text:F53DFC6Aj
  21. .text:F53DFC72 000                 xor     eax, eax
  22. .text:F53DFC74 000                 jmp     short locret_F53DFC6F
  23. .text:F53DFC76     ; ---------------------------------------------------------------------- -----
  24. .text:F53DFC76
  25. .text:F53DFC76     loc_F53DFC76:                           ; CODE XREF: .text:F53DFC61j
  26. .text:F53DFC76 000                 jmp     loc_F53DF744
  27. .text:F53DFC76     sub_F53DFC5A    endp
  28.  
  29. .text:F53DF744                                   ; START OF FUNCTION CHUNK FOR sub_F53DFC5A
  30. .text:F53DF744
  31. .text:F53DF744                                   loc_F53DF744:           ; CODE XREF: .text:loc_F53DFC76j
  32. .text:F53DF744 000 8B 44 24 04                   mov     eax, [esp+arg_0]
  33. .text:F53DF748 000 8D 44 00 10                   lea     eax, [eax+eax+10h]
  34. .text:F53DF74C 000 50                            push    eax
  35. .text:F53DF74D 004 E8 5C FF FF FF                call    sub_F53DF6AE
  36. .text:F53DF752 000 25 FF 00 00 00                and     eax, 0FFh
  37. .text:F53DF757 000 C2 04 00                      retn    4
  38. .text:F53DF757                                   ; END OF FUNCTION CHUNK FOR sub_F53DFC5A


Алгоритм вычисления этого номера зависит от байтовой переменной (возможно булевой) по адресу F54F5890. Если она равна нулю, номер определяется просто - IntNum = Arg0 + 0x30 = 0x3C.

-----
IZ.RU





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

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

Код функции установщика хука

Code:
  1. .text:F53B4376     sub_F53B4376    proc near               ; CODE XREF: .text:F53AB8F6p
  2. .text:F53B4376                                             ; .text:F53AD6FDp
  3. .text:F53B4376                                             ; .text:F53AD719p
  4. .text:F53B4376                                             ; .text:F53AD72Ap
  5. .text:F53B4376                                             ; .text:F53AD746p
  6. .text:F53B4376                                             ; .text:F53AD762p
  7. .text:F53B4376                                             ; .text:F53AD771p
  8. .text:F53B4376                                             ; .text:F53AD780p
  9. .text:F53B4376                                             ; .text:F53AD78Fp
  10. .text:F53B4376                                             ; .text:F53AD7A6p
  11. .text:F53B4376                                             ; .text:F53AD7C6p
  12. .text:F53B4376                                             ; .text:F53AD7F0p
  13. .text:F53B4376                                             ; .text:F53AD80Ep
  14. .text:F53B4376                                             ; .text:F53AD828p
  15. .text:F53B4376
  16. .text:F53B4376     NewIrql         = byte ptr -1
  17. .text:F53B4376     arg_0           = dword ptr  8
  18. .text:F53B4376     arg_4           = dword ptr  0Ch
  19. .text:F53B4376     arg_8           = dword ptr  10h
  20. .text:F53B4376     arg_C           = dword ptr  14h
  21. .text:F53B4376     arg_10          = dword ptr  18h
  22. .text:F53B4376
  23. .text:F53B4376 000                 push    ebp
  24. .text:F53B4377 004                 mov     ebp, esp
  25. .text:F53B4379 004                 push    ecx
  26. .text:F53B437A 008                 push    ebx
  27. .text:F53B437B 00C                 push    esi
  28. .text:F53B437C 010                 call    ds:KeGetCurrentIrql
  29. .text:F53B4382 010                 mov     cl, 1Fh         ; NewIrql
  30. .text:F53B4384 010                 mov     [ebp+NewIrql], al
  31. .text:F53B4387 010                 call    ds:KfRaiseIrql
  32. .text:F53B438D 010                 pushf
  33. .text:F53B438E 014                 cli
  34. .text:F53B438F 014                 mov     eax, dword_F54C7B1C ; ? Число процессоров
  35. .text:F53B4394 014                 xor     ebx, ebx
  36. .text:F53B4396 014                 inc     ebx
  37. .text:F53B4397 014                 cmp     eax, ebx
  38. .text:F53B4399 014                 jbe     short loc_F53B43E0
  39. .text:F53B439B 014                 xor     esi, esi
  40. .text:F53B439D 014                 test    eax, eax
  41. .text:F53B439F 014                 jbe     short loc_F53B43CE
  42. .text:F53B43A1
  43. .text:F53B43A1     loc_F53B43A1:                           ; CODE XREF: .text:F53B43CCj
  44. .text:F53B43A1 014                 push    [ebp+arg_10]
  45. .text:F53B43A4 018                 mov     eax, off_F54C7B24
  46. .text:F53B43A9 018                 push    [ebp+arg_C]
  47. .text:F53B43AC 01C                 mov     eax, [eax+esi*4]
  48. .text:F53B43AF 01C                 push    [ebp+arg_8]
  49. .text:F53B43B2 020                 mov     eax, [eax+38h]
  50. .text:F53B43B5 020                 push    [ebp+arg_4]
  51. .text:F53B43B8 024                 push    eax
  52. .text:F53B43B9 028                 push    [ebp+arg_0]
  53. .text:F53B43BC 02C                 call    sub_F53B392E
  54. .text:F53B43C1 014                 test    eax, eax
  55. .text:F53B43C3 014                 jz      short loc_F53B4400
  56. .text:F53B43C5 014                 inc     esi
  57. .text:F53B43C6 014                 cmp     esi, dword_F54C7B1C
  58. .text:F53B43CC 014                 jb      short loc_F53B43A1
  59. .text:F53B43CE
  60. .text:F53B43CE     loc_F53B43CE:                           ; CODE XREF: .text:F53B439Fj
  61. .text:F53B43CE                                             ; .text:F53B43FEj
  62. .text:F53B43CE 014                 popf
  63. .text:F53B43CF
  64. .text:F53B43CF     loc_F53B43CF:                           ; CODE XREF: .text:F53B4403j
  65. .text:F53B43CF 010                 mov     cl, [ebp+NewIrql] ; NewIrql
  66. .text:F53B43D2 010                 call    ds:KfLowerIrql
  67. .text:F53B43D8 010                 pop     esi
  68. .text:F53B43D9 00C                 mov     al, bl
  69. .text:F53B43DB 00C                 pop     ebx
  70. .text:F53B43DC 008                 leave
  71. .text:F53B43DD 000                 retn    14h
  72. .text:F53B43E0     ; ---------------------------------------------------------------------- -----
  73. .text:F53B43E0
  74. .text:F53B43E0     loc_F53B43E0:                           ; CODE XREF: .text:F53B4399j
  75. .text:F53B43E0 014                 push    0
  76. .text:F53B43E2 018                 call    sub_F53B3804
  77. .text:F53B43E7 014                 push    [ebp+arg_10]; 0
  78. .text:F53B43EA 018                 push    [ebp+arg_C]; 4
  79. .text:F53B43ED 01C                 push    [ebp+arg_8]; 0x10
  80. .text:F53B43F0 020                 push    [ebp+arg_4]; новый обработчик
  81. .text:F53B43F3 024                 push    eax; база IDT
  82. .text:F53B43F4 028                 push    [ebp+arg_0]; номер прерывания
  83. .text:F53B43F7 02C                 call    sub_F53B392E
  84. .text:F53B43FC 014                 test    eax, eax
  85. .text:F53B43FE 014                 jnz     short loc_F53B43CE
  86. .text:F53B4400
  87. .text:F53B4400     loc_F53B4400:                           ; CODE XREF: .text:F53B43C3j
  88. .text:F53B4400 014                 popf
  89. .text:F53B4401 010                 xor     bl, bl
  90. .text:F53B4403 010                 jmp     short loc_F53B43CF
  91. .text:F53B4403     sub_F53B4376    endp


В переменной dword_F54C7B1C количество процессоров. Т.к. у меня один процессор, то меня интересует только часть этой функции, по адресу F53B43E0. Выясняется, что и сам установщик не здесь, а возможно в sub_F53B392E, которая в случае успеха должна возвращать не 0.

Глянем и первую функцию
Code:
  1. .text:F53B3804     sub_F53B3804    proc near               ; CODE XREF: .text:F53ACB29p
  2. .text:F53B3804                                             ; .text:F53AE2F9p
  3. .text:F53B3804                                             ; .text:F53B3912p
  4. .text:F53B3804                                             ; .text:F53B43E2p
  5. .text:F53B3804                                             ; .text:F53B4FADp
  6. .text:F53B3804                                             ; .text:F53C3319p
  7. .text:F53B3804                                             ; .text:F53E8E48p
  8. .text:F53B3804                                             ; .text:F53EB285p
  9. .text:F53B3804                                             ; .text:F53EE07Cp
  10. .text:F53B3804                                             ; .text:F53FA900p
  11. .text:F53B3804                                             ; .text:F5412C90p
  12. .text:F53B3804
  13. .text:F53B3804     var_8           = word ptr -8
  14. .text:F53B3804     var_6           = dword ptr -6
  15. .text:F53B3804     arg_0           = dword ptr  8
  16. .text:F53B3804
  17. .text:F53B3804 000                 push    ebp
  18. .text:F53B3805 004                 mov     ebp, esp
  19. .text:F53B3807 004                 push    ecx
  20. .text:F53B3808 008                 push    ecx
  21. .text:F53B3809 00C                 push    esi
  22. .text:F53B380A 010                 push    esi
  23. .text:F53B380B 014                 lea     esi, [ebp+var_8]
  24. .text:F53B380E 014                 sidt    fword ptr [esi]
  25. .text:F53B3811 014                 pop     esi
  26. .text:F53B3812 010                 mov     eax, [ebp+arg_0]
  27. .text:F53B3815 010                 test    eax, eax
  28. .text:F53B3817 010                 jz      short loc_F53B381F
  29. .text:F53B3819 010                 movzx   ecx, [ebp+var_8]
  30. .text:F53B381D 010                 mov     [eax], ecx
  31. .text:F53B381F
  32. .text:F53B381F     loc_F53B381F:                           ; CODE XREF: .text:F53B3817j
  33. .text:F53B381F 010                 mov     eax, [ebp+var_6]
  34. .text:F53B3822 010                 pop     esi
  35. .text:F53B3823 00C                 leave
  36. .text:F53B3824 000                 retn    4
  37. .text:F53B3824     sub_F53B3804    endp


Суть ее - определение базы IDT. Параметр функции - указатель, в котором надо сохранить лимит таблицы, у нас 0.

-----
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 » Выход » ЛС
   Для печати Для печати