sdt-хук NtOpenProcess, BSOD [windows 7]

Тема в разделе "WASM.NT.KERNEL", создана пользователем float, 7 янв 2010.

  1. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Самое интересное, что DriverEntry выполняется как бы без ошибок, да еще и адреса верные пишет/читает (проверил на wmvare+windbg). До моей загрушки my_nt_open_process не доходит, до OnUnload тоже.
    Код.
    Код (Text):
    1. format PE DLL native 4.0 at 10000h
    2.  
    3. include 'WIN32A.INC'
    4. include 'TYPES.INC'
    5. include 'WINDEFS.INC'
    6. include 'DDK/IMPORT32.INC'
    7. include 'DDK/NTDEF_RZ.INC'
    8. include 'DDK/NTSTATUS_RZ.INC'
    9. include 'DDK/NTDDK_RZ.INC'
    10. include 'DDK/NTDDKK.INC'
    11. include 'PROCS32.INC'
    12.  
    13. entry DriverEntry
    14. section '.text' code readable writeable executable notpageable
    15. xx db "%.8X",0
    16. yy db "Unloaded",0
    17. zz db "Called",0
    18. old_nt_open_process dd ?
    19. cr0reg dd ?
    20. addrb dd ?
    21.  
    22. proc OnUnload lpDriverObject
    23.         cli
    24.         mov eax, cr0
    25.         mov dword [cr0reg],eax
    26.         and eax,0xFFFEFFFF
    27.         mov cr0, eax
    28.        
    29.         mov eax, dword [old_nt_open_process]
    30.         mov edx,dword [addrb]
    31.         mov dword [edx],eax
    32.        
    33.         mov eax, dword [cr0reg]    
    34.         mov cr0, eax
    35.         sti  
    36.        
    37.         mov eax,STATUS_SUCCESS
    38. ret
    39. endp
    40. proc DriverEntry lpDriverObject, usRegistryPath    
    41.         mov eax, [lpDriverObject]
    42.         lea edx, [OnUnload]
    43.         mov [eax + V_DRIVER_OBJECT.DriverUnload], edx ;put callback
    44.        
    45.         mov eax,[ZwOpenProcess]
    46.         mov ebx,dword[eax+1] ;ebx=number of NtOpenProcess in sdt
    47.        
    48.         mov eax,[KeServiceDescriptorTable]
    49.         mov eax,[eax]
    50.         lea edx,[eax+ebx*4] ;edx=addr of addr of NtOpenProcess in sdt
    51.         mov eax,[edx] ;eax=addr of NtOpenProcess
    52.         mov dword [old_nt_open_process],eax ;backup addr of NtOpenProcess
    53.        
    54.         cli
    55.         mov eax, cr0
    56.         mov dword [cr0reg],eax
    57.         and eax,0xFFFEFFFF
    58.         mov cr0, eax
    59.        
    60.         mov dword [edx],my_nt_open_process
    61.        
    62.         mov eax, dword [cr0reg]    
    63.         mov cr0, eax
    64.         sti
    65.        
    66.         mov dword [addrb],edx
    67.        
    68.        
    69.         mov eax,STATUS_SUCCESS
    70.         ret
    71. endp
    72.  
    73. my_nt_open_process:
    74. ;int3
    75. jmp [old_nt_open_process]
    76.  
    77. section '.import' import data readable writeable notpageable
    78. library ntoskrnl,'ntoskrnl.exe'
    79. import  ntoskrnl,DbgPrint,'DbgPrint',\
    80. ZwOpenProcess,'ZwOpenProcess',\
    81. NtOpenProcess,'NtOpenProcess',\
    82. KeServiceDescriptorTable,'KeServiceDescriptorTable'
    83.  
    84. section '.reloc' fixups data discardable notpageable
     
  2. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Ты не создаешь объект-устройство и драйвер выгружается сразу после DriverEntry.
     
  3. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    ЛОЛШТО???
     
  4. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Cr4sh
    Упс...
    Молчу :)
     
  5. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Cr4sh
    Хотя нет... я в чем-то ошибаюсь уже полгода минимум ?
     
  6. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Cr4sh
    Сорри. Конкретно затупил.
    Как неделю назад когда сидя на висте думал что раньше Program files писалось слитно...
    Еще раз сорри (ибо для такого случая одног раза мало) :)
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    драйвер выгружается после ентри только если вернуть статус ошибки
     
  8. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    Great
    Пасиб. Я уже Cr4sh'а достал :)
    Но всеравно проверил на всякий пожарный. Надо же... ни разу без DeviceObject не пробовал (за исключением инжекта через overflow) ибо был уверен что выгрузится.

    float
    Фффу. Пока скачал WDK... установил VMWare...
    Вобщем на WinXP работает :)
    Код (Text):
    1. #include "stdafx.h"
    2. extern "C"
    3. {
    4. #include "D:\Development\Study\DriverDevelopment\Baal\Модули\KrnlUndcmt\KrnlUndcmt.h"
    5. }
    6.  
    7. DWORD32 old_nt_open_process;
    8. DWORD32 cr0reg;
    9. DWORD32 addrb;
    10.  
    11. void OnUnload(IN PDRIVER_OBJECT DriverObject)
    12. {
    13.     _asm
    14.     {
    15.         cli;
    16.         mov eax, cr0;
    17.         mov dword ptr [cr0reg], eax;
    18.         and eax,0xFFFEFFFF;
    19.         mov cr0, eax;
    20.        
    21.         mov eax, dword ptr [old_nt_open_process];
    22.         mov edx,dword ptr[addrb];
    23.         mov dword ptr[edx],eax;
    24.        
    25.         mov eax, dword ptr[cr0reg];
    26.         mov cr0, eax;
    27.         sti;
    28.     }
    29. }
    30.  
    31. _declspec(naked) void my_nt_open_process(void)
    32. {
    33.     _asm
    34.     {      
    35.         jmp dword ptr [old_nt_open_process];
    36.     }
    37. }
    38.  
    39. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
    40. {
    41.     /*
    42.     mov eax, [DriverObject];
    43.     lea edx, [OnUnload];
    44.     mov [eax->DriverUnload], edx;
    45.     */
    46.     DriverObject->DriverUnload = OnUnload;
    47.     _asm
    48.     {
    49.         mov eax, [ZwOpenProcess]; 804dd724 ZwOpenProcess{mov eax,7Ah}
    50.         mov ebx,dword ptr[eax+1] ; 7Ah
    51.  
    52.         mov eax,[KeServiceDescriptorTable];
    53.         mov eax,[eax]; [eax+ebx*4] = f81f57b0 {sub esp,0Ch; push    esi; push    edi}
    54.         lea edx,[eax+ebx*4]; 81a7a9d8
    55.         mov eax,[edx]; f81f57b0
    56.         mov dword ptr [old_nt_open_process],eax;       
    57.  
    58.         cli
    59.         mov eax, cr0
    60.         mov dword ptr [cr0reg],eax
    61.         and eax,0xFFFEFFFF
    62.         mov cr0, eax
    63.        
    64.         mov eax, my_nt_open_process; f9d14030
    65.         mov dword ptr[edx], eax;
    66.        
    67.         mov eax, dword ptr[cr0reg]    
    68.         mov cr0, eax
    69.         sti
    70.     }  
    71.     return STATUS_SUCCESS;
    72. }
    OnUnload выбрасывает ошибку. Не разбирался.
     
  9. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    Спасибо за ответ, на WinXP у меня тоже норм, БСОД когда вызывается NtOpenProcess из любого процесса (например открываю диспетчер задач). Я вообще думаю, что природа этого бсода в win7 схожа с бсодом в XP, возможно кто-то сразу же после загрузки драйвера пытается вызвать эту функцию. Но странность в том, что int3 в моей заглушке не срабатывает почему-то.
     
  10. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    А analyze -v ?
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    мб аварийный дамп посмотреть..
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Если делаете асм вставки, советую сохранять регистры которые изменяете, и потом восстанавливать. На будущее это. (в вашем случае - регистр edx). И вообще, будьте предельно аккуратны.
     
  13. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    я это понял 5 минут назад, потрудившись простепать 2 команды после выхода из DriverEntry, и как раз собирался написать про это)) в общем всё понятно, всем спасибо за ответы, вопрос решен.