hook в ring0

Discussion in 'WASM.WIN32' started by Boola, Aug 17, 2005.

  1. Boola

    Boola New Member

    Blog Posts:
    0
    Joined:
    Dec 28, 2004
    Messages:
    24
    Location:
    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

    Blog Posts:
    0
    Joined:
    Sep 13, 2003
    Messages:
    222
    вот глянь, старый пример, может он мало грамотный, потому, что старый

    [​IMG] _1244867122__sys.zip
     
  3. AB_Celitel

    AB_Celitel New Member

    Blog Posts:
    0
    Joined:
    Jul 9, 2005
    Messages:
    72
    Location:
    Россия, г.Иваново
    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

    Blog Posts:
    0
    Joined:
    Dec 28, 2004
    Messages:
    24
    Location:
    Russia
    AB_Celitel



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



    Saint German



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

    Boola New Member

    Blog Posts:
    0
    Joined:
    Dec 28, 2004
    Messages:
    24
    Location:
    Russia
    AB_Celitel



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

    Ms Rem New Member

    Blog Posts:
    0
    Joined:
    Apr 17, 2005
    Messages:
    1,057
    Location:
    С планеты "Земля"




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

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

    Boola New Member

    Blog Posts:
    0
    Joined:
    Dec 28, 2004
    Messages:
    24
    Location:
    Russia
    Ms Rem

    спасибо
     
  8. cresta

    cresta Active Member

    Blog Posts:
    0
    Joined:
    Jun 13, 2004
    Messages:
    2,257
    Ms Rem



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

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

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

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

    Ms Rem New Member

    Blog Posts:
    0
    Joined:
    Apr 17, 2005
    Messages:
    1,057
    Location:
    С планеты "Земля"
    Каспер добавляет новые сервисы, а номера не меняет.

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



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

    cresta Active Member

    Blog Posts:
    0
    Joined:
    Jun 13, 2004
    Messages:
    2,257
    Каспера нет, айс не прижился :dntknw:

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


    Code (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

    Blog Posts:
    0
    Joined:
    Apr 17, 2005
    Messages:
    1,057
    Location:
    С планеты "Земля"


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

    cresta Active Member

    Blog Posts:
    0
    Joined:
    Jun 13, 2004
    Messages:
    2,257
    Всё понял, спасибо.
     
  13. pmma

    pmma New Member

    Blog Posts:
    0
    Joined:
    Mar 23, 2006
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Jun 13, 2004
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Mar 23, 2006
    Messages:
    2
    Thx! Resolved,just as you say! Thank you cresta
     
  16. DeHunter

    DeHunter New Member

    Blog Posts:
    0
    Joined:
    Feb 25, 2005
    Messages:
    80
    Location:
    Ukraine/Kiev
    Если комуто мнтересно то есть программа SSTMON.

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

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

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