Перехват ZwCreateThread

Тема в разделе "WASM.BEGINNERS", создана пользователем Active, 16 май 2007.

  1. Active

    Active New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2007
    Сообщения:
    38
    Доброго времени суток. Пытался оформить сплайсинг ZwCreateThread, руководствуясь этой статьей. Я не использовал библиотеку, но код перехвата функции и перехватчик оформлены примерно так же. В качестве теста, перехватчик просто восстанавливает функцию, запускает ее с оригинальными параметрами, возвращает выдаваемое оригинальной ZwCreateThread значение. Столкнулся с такой проблемой: любая попытка процесса-жертвы создать новый процесс заканчивается либо его вылетом без каких-либо сообщений об ошибках, либо ничем - причем независимо от содержимого перехватчика (даже int 3h). С адресами вроде не напутал - 1-е 6 байт заменяются jmp'ом на правильный адрес перехватчика. В чем может заключаться проблема?
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    ZwCreateThread ты сплайсишь...? Дык...может есть сенс через SDT перехватить...?
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    jmp, если моя память мне ни с кем не изменяет, занимает 5 байт, а не 6. Может, в этом и глюк?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MSoft
    Лучше сплайсить CC байтом, предварительно похукав в IDT третий вектор.. безопаснее
     
  5. Active

    Active New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2007
    Сообщения:
    38
    Писать драйвер?:/ - нет, я не ленивый, просто далеко не профессионал. Но ведь данный способ должен хоть как-то работать?
    Прошу прощения - мой косяк, запутался. Именно 6 байт, так как переход выглядит так:

    Код (Text):
    1. db  68h ;push
    2. Hooker1  dd 0 ;Адрес перехватчика
    3. db  0c3h ;ret
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Уууу.. да так до бсода недалеко, если ты в ринг0 хукаешь =\
     
  7. Active

    Active New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2007
    Сообщения:
    38
    Хукаю в ring3 :)

    Спасибо, попробую..........но всетаки в чем здесь может быть загвоздка?
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    лучше не надо, ибо IDT не исправишь из r3 :)
    Лучше бы код показал.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Видимо у него есть своя методика :P
    +1
     
  10. Active

    Active New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2007
    Сообщения:
    38
    Да, идиот, знаю :)


    Код перехода
    Код (Text):
    1. code9:
    2.     db 68h
    3.     Hooker9 dd 0
    4.     db 0c3h
    Перехват (в ebx дельта смещение)
    Код (Text):
    1.    
    2.     push 0
    3.     push 6
    4.     mov ecx, offset Old_CodeZwCreateThread
    5.     add ecx,ebx
    6.     push ecx
    7.     push [ebx + offset RealAddrZwCreateThread]
    8.     push [ebx+ offset Mhandle]    
    9.     mov eax, [offset _ReadProcessMemory+ebx]
    10.     call eax
    11.     mov ecx,ebx
    12.  
    13.     add ecx,offset HookerZwCreateThread
    14.     mov [ebx+offset Hooker9], ecx
    15.  
    16.     push 0
    17.     push 6
    18.     mov ecx,ebx
    19.     add ecx,offset code9
    20.     push ecx    
    21.     push [ebx + offset RealAddrZwCreateThread]
    22.     push [ebx+ offset Mhandle]    
    23.     mov eax, [offset _WriteProcessMemory+ebx]
    24.     call eax
    Перехватчик

    Код (Text):
    1. HookerZwCreateThread proc ThreadHandle1: DWORD, DesiredAccess: DWORD, \
    2.                         ObjectAttributes: DWORD, ProcessHandle: DWORD, ClientId: DWORD, \
    3.                         ThreadContext: DWORD, UserStack: DWORD, CreateSuspended: DWORD
    4.  
    5.     call GetCurrPosition  
    6.     add ecx, 5h
    7.     jmp @F
    8.   code9:
    9.       db 68h
    10.       Hooker9_1 dd 0
    11.       db 0c3h
    12.     @@:    
    13.  
    14.    call delta
    15. delta:
    16.    pop ebx
    17.    sub ebx,delta
    18.  
    19.  
    20.    push 0
    21.    push 6
    22.    mov ecx,ebx
    23.    add ecx,offset Old_CodeZwCreateThread
    24.    push ecx    
    25.    push [ebx + offset RealAddrZwCreateThread]
    26.    push [ebx+ offset Mhandle]    
    27.    mov eax, [offset _WriteProcessMemory+ebx]
    28.    call eax  
    29.  
    30.  
    31.  
    32.    push TRUE
    33.    push UserStack
    34.    push ThreadContext
    35.    push ClientId
    36.    push ProcessHandle
    37.    push ObjectAttributes
    38.    push DesiredAccess
    39.    push ThreadHandle1
    40.    mov eax,[ebx+offset RealAddrZwCreateThread]
    41.    call eax
    42.    
    43.    push eax
    44.  
    45.    mov ecx,ebx
    46.    add ecx,offset HookerZwCreateThread
    47.    mov [ebx+offset Hooker9_1], ecx
    48.  
    49.    mov ecx,ebx
    50.    add ecx,offset HookerZwCreateThread
    51.    mov [ebx+offset Hooker9_1], ecx
    52.    push 0
    53.    push 6
    54.    mov ecx,ebx
    55.    add ecx,offset code9
    56.    push ecx    
    57.    push [ebx + offset RealAddrZwCreateThread]
    58.    push [ebx + offset Mhandle]    
    59.    mov eax, [offset  _WriteProcessMemory+ebx]
    60.    call eax  
    61.    pop eax
    62.    ret                      
    63. HookerZwCreateThread endp
    GetCurrPosition proc
    mov ecx, [esp]
    ret
    GetCurrPosition endp
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    А ты отладчиком не пробовал пользоваться? Посмотри, что появляется вместо первых 6 байт настоящей функции после установки перехвата. Посмотри, правильный ли адрес обработчика указан. Находится ли обработчик по этому адресу. Если все правильно, поставь бряк на этот обработчик. После остановки на бряке, посмотри, правильные ли байты восстанавливаются. Посмотри, правильно ли ты передаешь управление... Вобщем, Олли тебе в руки

    И нафига ты вызываешь GetCurrPosition, если ecx ты потом нигде не пользуешь и затираешь его mov ecx,ebx???