Непонятки с поиском Shadow Table

Тема в разделе "WASM.NT.KERNEL", создана пользователем Twister, 2 июл 2007.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Пытаюсь найти ServiceDescriptorTableShadow анализом кода функции KeAddSystemServiceTable на предмет инструкции
    Код (Text):
    1. lea     ecx, _KeServiceDescriptorTableShadow[eax]
    . Код выглядит вот так:
    Код (Text):
    1. GetShadowTable PROC
    2.     push    esi
    3.     mov esi, dword ptr[KeAddSystemServiceTable + 2]
    4.     mov esi, dword ptr[esi]
    5.   _loop:
    6.     push    esi
    7.     call    MmIsAddressValid
    8.     test    eax, eax
    9.     jz      _brk
    10.     call    VirXasm32 ;Узнаем длину инструкции
    11.     .if (eax == 1) && (word ptr[esi] == 0C3h)
    12.         dec     eax
    13.         jmp     _brk
    14.     .endif
    15.     .if (word ptr[esi] == 888Dh)
    16.         mov eax, dword ptr[esi + 2]
    17.         mov eax, dword ptr[eax]
    18.         jmp _brk
    19.     .endif
    20.     add esi, eax
    21.     jmp _loop
    22.   _brk:
    23.     pop esi
    24.     ret
    25. GetShadowTable EndP
    Вся фишка в том, что функция находит не Shadow таблицу, а обычную!
    К примеру, у меня на работе (WinXP home sp2) она возвращает 804E2D20h. Командуем айсу "d KeServiceDescriptorTable" и лицезреем тот же самый адрес. Из всякой дряни на компе стоит только NOD32.

    Скажите, я перегрелся?
     
  2. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Это же массив таблиц. Твоя шадоу будет под номером 1, а обычная по 0
     
  3. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Да, я точно перегрелся - ошибка была в ДНК. Если кому надо, вот готовый и рабочий код:
    Код (Text):
    1. GetShadowTable PROC
    2.     push    esi
    3.     mov esi, dword ptr[KeAddSystemServiceTable + 2]
    4.     mov esi, dword ptr[esi]
    5.   _loop:
    6.     push    esi
    7.     call    MmIsAddressValid
    8.     test    eax, eax
    9.     jz      _brk
    10.     call    VirXasm32
    11.     .if (eax == 1) && (word ptr[esi] == 0C3h)
    12.         dec     eax
    13.         jmp     _brk
    14.     .endif
    15.     .if (word ptr[esi] == 888Dh)
    16.         mov eax, dword ptr[esi + 2]
    17.         add     eax, 16
    18.         mov eax, dword ptr[eax]
    19.         jmp _brk
    20.     .endif
    21.     add esi, eax
    22.     jmp _loop
    23.   _brk:
    24.     pop esi
    25.     ret
    26. GetShadowTable EndP