Помогите пожалуйста удалить перехват

Тема в разделе "WASM.NT.KERNEL", создана пользователем WaterGhost, 2 мар 2008.

  1. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Устанавливаю перехват методом замены первых байт функции

    Код (Text):
    1. //--------------------------------------------------------------------------------------
    2. void InsertByte( ULONG Addr, unsigned char Byte )
    3. {
    4.     *((unsigned char*)Addr) = Byte;
    5. }
    6. //--------------------------------------------------------------------------------------
    7. void InsertDword( ULONG Addr, ULONG dWord )
    8. {
    9.     *((PULONG)Addr) = dWord;
    10. }
    11. //--------------------------------------------------------------------------------------
    12. #define SIZEOFJUMP    5
    13. #define ASMNOP        0x90
    14. #define ASMJMP        0xe9
    15.  
    16. void GenJmp(ULONG From, ULONG To)
    17. {    
    18.     InsertDword(From + 1, To - From - 5);    // dst - src - 5
    19.     InsertByte(From, ASMJMP);                // jmp    ...
    20. }
    21. //--------------------------------------------------------------------------------------
    22. //Устанавливает хук
    23. PVOID Hook( PVOID Addr, PVOID NewFunc, PULONG CollectedSpace )
    24. {
    25.     PVOID CallGate, Inst = Addr;
    26.     ULONG Size = 0, CallGateSize = 0;
    27.  
    28.     if (Addr == NULL)
    29.         return 0;
    30.  
    31.     *CollectedSpace = 0;
    32.  
    33.     while (*CollectedSpace < SIZEOFJUMP)
    34.     {
    35.         GetInstLenght(Inst, &Size);
    36.         (ULONG)Inst += Size;
    37.         *CollectedSpace += Size;
    38.     }
    39.    
    40.     CallGateSize = *CollectedSpace + SIZEOFJUMP;
    41.     CallGate = (PVOID)ExAllocatePool(NonPagedPool, CallGateSize);
    42.    
    43.     DbgPrint("Function addr : 0x%.8x\n", Addr);
    44.     DbgPrint("Handler addr : 0x%.8x\n", NewFunc);
    45.     DbgPrint("CallGate at : 0x%.8x; size : %d\n", CallGate, CallGateSize);
    46.  
    47.     memset(CallGate, ASMNOP, CallGateSize);
    48.  
    49.     memcpy(CallGate, Addr, *CollectedSpace);
    50.  
    51.     memset(Addr, ASMNOP, *CollectedSpace);
    52.  
    53.     GenJmp( (ULONG)CallGate + *CollectedSpace, (ULONG)Addr + SIZEOFJUMP );
    54.     GenJmp( (ULONG)Addr, (ULONG)NewFunc );
    55.  
    56.     return CallGate;
    57. }
    58. //--------------------------------------------------------------------------------------
    59. //Устанавливаем ловушки
    60. void InstallHooks(void)
    61. {
    62.     ULONG CR0Reg;
    63.  
    64.     __asm
    65.     {
    66.         cli                    
    67.         mov        eax,cr0
    68.         mov        CR0Reg,eax
    69.         and        eax,0xFFFEFFFF    
    70.         mov        cr0,eax
    71.     }  
    72.  
    73.     OldZwOpenProcess        = ( funcZwOpenProcess )        Hook((PVOID)NTCALL(ZwOpenProcessInfo.FunctionAddress),        NewZwOpenProcess,        &ZwOpenProcessInfo.CollectedSpace        );
    74.     OldNtWriteVirtualMemory = ( funcNtWriteVirtualMemory ) Hook((PVOID)NTCALL(NtWriteVirtualMemoryInfo.FunctionAddress), NewNtWriteVirtualMemory, &NtWriteVirtualMemoryInfo.CollectedSpace );
    75.  
    76.     __asm
    77.     {
    78.         mov        eax,CR0Reg    
    79.         mov        cr0,eax    
    80.         sti                
    81.     }
    82. }
    Снимаю перехват вот так :

    Код (Text):
    1. //Снимаем ловушки
    2. void RemoveHooks(void)
    3. {
    4.     ULONG CR0Reg;
    5.  
    6.     __asm
    7.     {
    8.         cli                    
    9.         mov        eax,cr0
    10.         mov        CR0Reg,eax
    11.         and        eax,0xFFFEFFFF    
    12.         mov        cr0,eax
    13.     }
    14.  
    15.     memcpy( (PVOID)NTCALL(ZwOpenProcessInfo.FunctionAddress),        OldZwOpenProcess,        ZwOpenProcessInfo.CollectedSpace        );
    16.     memcpy( (PVOID)NTCALL(NtWriteVirtualMemoryInfo.FunctionAddress), OldNtWriteVirtualMemory, NtWriteVirtualMemoryInfo.CollectedSpace );
    17.  
    18.     __asm
    19.     {
    20.         mov        eax,CR0Reg    
    21.         mov        cr0,eax    
    22.         sti                
    23.     }
    24. }
    После снятия - БСОД. Что не так делаю. Все вроде верно. Я запоминаю CollectedSpace и копирую это кол-во байт из моего Калгейта на место оригинально функции.
     
  2. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    WaterGhost
    Если просто нужно подменить функцию и метод неважен, то прочти это: http://rootkits.ru/viewtopic.php?id=39&action=new.
    Ключевые слова - SSDT, MDL.
     
  3. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Нет,подмена адреса в таблице мне не годится. Мне необходимо конкретно реализовать этот случай.
    Я никак не могу понять что я делаю не так =\
     
  4. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Тему можно закрывать. Вопрос решен.

    Причина :
    Все верно делал Просто оказывается при выгрузке драйвера забыл снять Routine создания\удаления процессов. После выгрузки обработчик моей Routine уничтожался и при первом же запуске\уничтожении процесса Windows уходила в БСОД обращаясь к несуществующему обработчику.
     
  5. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    WaterGhost раз ты теперь во всем разобрался, можно нубский вопрос? Вот ты, как я понял, защищаешься от разного рода казусов многозадачности с помощью cli и sti, но ведь это запрещает прерывания только на одном процессоре, а что если их несколько?
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Тогда надо перевести все процессоры в DISPATCH_LEVEL
     
  7. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Но ведь можно наверно запретить прерывания на контроллере прерываний

    К тому же несовсем я понял что значит перевести все процессоры в DISPATCH_LEVEL