Помогите с hookapi в ring0 на асме

Тема в разделе "WASM.WIN32", создана пользователем AB_Celitel, 12 июл 2005.

  1. AB_Celitel

    AB_Celitel New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2005
    Сообщения:
    72
    Адрес:
    Россия, г.Иваново
    Приветствую всех!

    Я меня прблема, написал драйвер перехватчик из статьи, но на асме.

    Работает нормально, но не передаётся управление на мою перехватчик-функцию.

    Ниже привожу кусок кода из моего драйвера, где я думаю возможно ошибка.


    Код (Text):
    1. .data
    2. true_addr dd 0
    3. dbg_mes_sethk db "set hook",0
    4. dbg_mes_fromhook db "from hookproc",0
    5. dbg_mes_delhk db "del hook",0
    6.  
    7. DriverEntry proc
    8.  
    9. local CR0Reg:dword
    10.  
    11.   ...
    12.   ...
    13.   ...
    14.  
    15.      ; Set Hook
    16.         mov eax,CR0
    17.         mov CR0Reg,eax
    18.         and eax,0FFFEFFFFh
    19.         mov CR0,eax
    20.  
    21.         mov edx,KeServiceDescriptorTable  
    22.         mov eax,dword ptr [edx]            ; ntoskrnl.ServiceTable
    23.  
    24.         mov ecx,dword ptr [eax+(7ah*4h)]   ; true_addr =
    25.         mov true_addr,ecx                  ; = KeServiceDescriptorTable->
    26.                                            ;             ->ntoskrnl.ServiceTable[7Ah]
    27.  
    28.         mov ecx,offset hookprocapi         ; KeServiceDescriptorTable->
    29.         mov dword ptr [eax+(7ah*4h)],ecx   ;           ->ntoskrnl.ServiceTable[7Ah] =
    30.                                            ;                       = hookprocapi
    31.      
    32.         mov eax,CR0Reg
    33.         mov CR0,eax
    34.  
    35. invoke DbgPrint, addr dbg_mes_sethk
    36.   ...
    37.   ...
    38. DriverEntry endp
    39.  
    40. ;****** Функция-перехватчик******
    41. hookprocapi proc      
    42.   invoke DbgPrint, addr dbg_mes_fromhook
    43.  
    44.   jmp dword ptr [true_addr]
    45.  
    46.  ret
    47. hookprocapi endp
    48. ;**********************
    49.  
    50.  
    51. DriverUnload proc
    52.  
    53. local CR0Reg:dword
    54.  
    55.        ; del Hook
    56.         mov eax,CR0
    57.         mov CR0Reg,eax
    58.         and eax,0FFFEFFFFh
    59.         mov CR0,eax
    60.  
    61.         mov edx,KeServiceDescriptorTable
    62.         mov edx,dword ptr [edx]
    63.         mov ecx,true_addr
    64.         mov dword ptr [edx+(7ah*4h)],ecx
    65.  
    66.  
    67.  
    68.        mov eax,CR0Reg
    69.        mov CR0,eax
    70.  
    71. invoke DbgPrint, addr dbg_mes_delhk
    72.  
    73.         ...
    74.         ...
    75.         ...
    76.  
    77.    
    78.     ret
    79.  
    80. DriverUnload endp




    Так вот, проблема в том, что на hookprocapi вызов не приходит.

    Если кто-нибудь знает причину (или хотя бы догадывается) прошу написать.

    Заранее спасибо.
     
  2. AB_Celitel

    AB_Celitel New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2005
    Сообщения:
    72
    Адрес:
    Россия, г.Иваново
    Хочу сделать небольшое пояснение.

    Если перехват писать на C, то получаться

    следующие структуры:



    typedef struct _SYSTEM_SERVICE_TABLE

    {

    PNTPROC ServiceTable;

    PDWORD CounterTable;

    ULONG ServiceLimit;

    PBYTE ArgumentTable;

    }



    typedef struct _SERVICE_DESCRIPTOR_TABLE {

    SYSTEM_SERVICE_TABLE ntoskrnl; //SST для ntoskrnl.exe

    SYSTEM_SERVICE_TABLE win32k; //SST для win32k.sys

    SYSTEM_SERVICE_TABLE unused1; //не используется

    SYSTEM_SERVICE_TABLE unused2; //не используется

    }





    На SERVICE_DESCRIPTOR_TABLE указывает экспортируемая

    переменная KeServiceDescriptorTable.

    Но по строению этих структур можно увидеть, что

    KeServiceDescriptorTable вроде как указывает прямо на

    SERVICE_DESCRIPTOR_TABLE.ntoskrnl.ServiceTable

    в котором находится указатель на массив указателей

    ф-ций ядра.

    Т.е. если писать на асме :



    получаем в eax указатель на массив указатель ф-ций

    mov edx,KeServiceDescriptorTable

    mov eax,dword ptr [edx]



    Затем ,к примеру, берём адрес NtOpenProcess из этого массива

    (NtOpenProcess в WinXp - 7Ah)

    mov ecx,dword ptr [eax+(7ah*4h)]

    mov true_addr,ecx ; сохраняем его



    Затем заменяем адрес NtOpenProcess на адрес своей ф-ции

    mov ecx,offset hookprocapi

    mov dword ptr [eax+(7ah*4h)],ecx



    Вроде как всё сделано правильно, а на свою ф-цию hookprocapi

    вызов не приходит, и NtOpenProcess нормально исполняется.

    Но самое интересное, что даже BSOD не вылетает.

    Поэтому, если кто знает в чем ошибочка большая просьба написать.

    Заранее спасибо.