hook в ring0

Тема в разделе "WASM.WIN32", создана пользователем Boola, 17 авг 2005.

  1. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    Прочитал статью Ms-Rem "Перехват API в NT" 3-ю часть, пытаюсь изобразить написанное там на асме.



    Вот что получилось:



    ;@echo off

    ;goto make



    .386

    .model flat, stdcall

    option casemap:none



    include \masm32\include\w2k\ntstatus.inc

    include \masm32\include\w2k\ntddk.inc

    include \masm32\include\w2k\ntoskrnl.inc

    include \masm32\include\w2k\w2kundoc.inc

    includelib \masm32\lib\w2k\ntoskrnl.lib

    include \masm32\Macros\Strings.mac



    .data

    realaddr dd 0

    CR0Reg dd 0

    Messaga1 db "OpenProcess",0

    Messaga2 db "Driver loaded", 0



    .code

    ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

    local pDeviceObject:PVOID



    pushad

    invoke DbgPrint, addr Messaga2

    mov edi, KeServiceDescriptorTable

    mov edi, [edi]

    mov eax, [edi+(07ah*4)] ;edi+07ah*4 - NtOpenProcess

    mov realaddr, eax



    cli

    mov eax, CR0

    mov CR0Reg, eax

    and eax, -1

    mov cr0, eax

    mov [edi+(07ah*4)], dword ptr offset hookproc

    mov eax, CR0Reg

    mov CR0, eax

    sti



    mov eax, pDriverObject

    assume eax:PTR DRIVER_OBJECT

    mov [eax].DriverUnload, offset DriverUnload

    assume eax:nothing



    popad

    mov eax, STATUS_SUCCESS

    ret

    DriverEntry endp

    ;:::::::::::::::::::::::::::::::::::::::::::::::::::::

    DriverUnload proc pDriverObject:PDRIVER_OBJECT

    pushad

    mov edi, KeServiceDescriptorTable

    mov edi, [edi]



    cli

    mov eax, CR0

    mov CR0Reg, eax

    and eax, -1

    mov cr0, eax



    mov eax, dword ptr realaddr

    mov [edi+(07ah*4)], eax



    mov eax, CR0Reg

    mov CR0, eax

    sti

    popad

    ret

    DriverUnload endp

    ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    hookproc proc

    invoke DbgPrint, addr Messaga1

    jmp dword ptr realaddr

    ; ret

    hookproc endp

    ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    end DriverEntry



    :make

    \masm32\bin\ml /nologo /c /coff tempdrv.bat

    \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:tempdrv.sys /subsystem:native tempdrv.obj



    del tempdrv.obj

    echo.

    pause



    Не получается перехватить функцию NtOpenProcess, управлене на hookproc не передается, возможно я не туда прописываю адрес hookproc, но как сделать по другому я не знаю.
     
  2. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    вот глянь, старый пример, может он мало грамотный, потому, что старый

    [​IMG] _1244867122__sys.zip
     
  3. AB_Celitel

    AB_Celitel New Member

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

    KeServiceDescriptorTable это только указатель на эту переменную, поэтому :

    твоё:

    mov edi, KeServiceDescriptorTable

    mov edi, [edi]



    как надо:

    mov edi, KeServiceDescriptorTable

    mov edi, [edi]

    mov edi, [edi]

    И теперь в edi действительно указатель на массив адресов

    функций.



    P.S. Ты тоже предпочитаешь писать на асме, а не на C.

    Молодец.
     
  4. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    AB_Celitel



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



    Saint German



    Тоже спасибо, погляжу
     
  5. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    AB_Celitel



    Еще вопрос: какие функции ты еще перехватывал? не находил ошибок в номерах вызовов функций (я про приложение к статье)?
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Вот программа, которой эти номера получены.

    http://ms-rem.dot-link.net/files/ntdll_parser.rar
     
  7. Boola

    Boola New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2004
    Сообщения:
    24
    Адрес:
    Russia
    Ms Rem

    спасибо
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ms Rem



    как должен себя вести парсер на машине, где есть касперский?

    Пробовал запускать под касперским (на удаленной машине) - количество сервисов и их номера те же, как и на моей машине (без каспера).

    В то же время слышал мнение, что каспер меняет количество сервисов и их номера.

    Где здесь правда?
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Каспер добавляет новые сервисы, а номера не меняет.

    Так как в ntoskrnl для описания новых сервисов нет места, то он выносит SDT за пределы ядра и дописывает в конец свои сервисы. Посмотреть что стало с SDT можно в айсе.



    А парсер просто сканирует ntdll и выводит номера стандартных виндовых сервисов (о каспере он ничего не знает).
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Каспера нет, айс не прижился :dntknw:

    Может так подскажешь по такой ситуации:


    Код (Text):
    1. mov     eax, KeServiceDescriptorTable
    2. ;указывает ли KeServiceDescriptorTable на новое местоположение таблицы??
    3. mov     eax,[eax]
    4. mov     eax,[eax]
    5. mov     eax,[eax+NNN*4]
    6. ;получу новый валидный адрес сервиса или нет??
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    KeServiceDescriptorTable остается на месте, а вот KeServiceDescriptorTable->ntoskrnl.ServiceTable указывает уже не в секцию .data ядра, а в выделеную память, и в конец этой таблицы приписаны сервисы каспера. Все остальные сервисы остались на месте, поэтому если тебе надо просто похукать функцию через SDT, то беспокоиться неочем.
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Всё понял, спасибо.
     
  13. pmma

    pmma New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    2
    I'm sorry but i'm a newer and a foreigner,i don't know Russian at all,i occured some difficulties,i modified 07ah with 029h,cause i wanna hook ZwCreateProccess on my vm(win2k),and i have checked the service number winth windbg,but it couldn't work,i downloaded another HOOK_SRC written by vc,modified the service number,and it worked very well.I Decomplied the driver(C version),but i can't find the difference……Puzzling,Can anyone help me?

    If necessary,i can send you code



    sorry for my poor english,i registered just by Luck



    i relly don't understand the Russian words,quite puzzling
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    you must modify the dword (address) at memory pointed by service number instead of modify the service number itself
     
  15. pmma

    pmma New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    2
    Thx! Resolved,just as you say! Thank you cresta
     
  16. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Если комуто мнтересно то есть программа SSTMON.

    Она отображает ссмт таблицы как шадов так и обычные.

    Написал её я. Извините конечно за рекламу но помойму с помошью неё гораздо удобней просматривать чем с помошью айса. Скачать её можно по адресу -

    http://dehunters-soft.drmist.ru/my_projects/sstmon_0x1.rar