Внешняя KeServiceDescriptorTable

Тема в разделе "WASM.NT.KERNEL", создана пользователем Vilco, 5 мар 2007.

  1. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Если несложно, скажите плз как импортировать KeServiceDescriptorTable в драйвер режима ядра (асм)?
    И вообще было бы неплохо увидеть минимальный код перехвата native api на асме =\
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    посмотри в KmdKit. Там есть про KeServiceDescriptorTable.
     
  3. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Vilco
    Тут на сайте Ms-Rem свои статьи выкладывал (перехват АПИ)
    Всего вроде 3 статьи. Как раз подробно объясняется, как перехватить и обработать АПИшку в р3 и р0.
    Код проверенный и рабочий. Так что сразу в компилятор и тестируй :)

    напрямую... imp__*****
    *-что импортируешь....
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хотя бы тот же сплайсинг.

    Код (Text):
    1. mov cl, 1fh
    2. call KfRaiseIrql
    3. cli
    4.  
    5. mov byte ptr [FunctionOffset], 0e9h
    6. mov dword ptr [FunctionOffset+1], <смещение_к_адресу_хука>
    7.  
    8. sti
    9. mov cl, 0
    10. call KfLowerIrql
     
  5. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Извиняюсь, наверное, неправильно выразил. Статьи прочитал, но они на паскале. Хотелось бы реализовать тоже самое на асме, но не получается. Во-первых не могу понять как импортировать вышеуказанную переменную. Подключил ntoskrnl из kmd. Все равно не работает. Если несложно, выложите то же самое, только на асме (т.е. перехват подменой адреса в таблицах ядра...)
    И ещё вопрос, немного не в тему, как напечатать число? Ибо я пишу так
    Код (Text):
    1. mov eax, KeServiceDescriptorTable
    2. invoke DbgPrint, $CTA0("KeServiceDescriptorTable: %d"), eax
    и показывает отрицательное число o_O
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    не знаю, есть ли в масм cinvoke, но нужно использовать его.
    invoke передает переменные исходя из stdcall-соглашения. А тебе нужно C.
     
  7. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Thx, а как насчет первого пункта?=\
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    может лучше не %d, а %08x ?
    Системные адреса - выше 0x80000000, целые знаковые числа такого диапазона интерпретируются как отрицаиельные.
    %x ставь

    Это как раз насчет первого пункта. Насчет второго я отписал
     
  9. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Хотелось бы увидеть подобное, но подменой адреса в таблице..
    Заранее спасибо
     
  10. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Воть пишу
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3. ;----------------------------------------------------------------------
    4. ;end of pre-self-building
    5. ;----------------------------------------------------------------------
    6. ;----------------------------------------------------------------------
    7. ;my api)int driver
    8. ;----------------------------------------------------------------------
    9. ;pc routine
    10. ;----------------------------------------------------------------------
    11. .386
    12. .model flat, stdcall
    13. option casemap:none
    14. ;----------------------------------------------------------------------
    15. ;inc files
    16. ;EXTRN KeServiceDescriptorTable: DWORD
    17. ;----------------------------------------------------------------------
    18. includelib \masm32\LIB\wxp\ntoskrnl.lib
    19. include \masm32\INCLUDE\wxp\ntstatus.inc
    20. include \masm32\INCLUDE\wxp\ntddk.inc
    21. include \masm32\INCLUDE\wxp\ntoskrnl.inc
    22. include \masm32\INCLUDE\wxp\ntint.inc
    23. ;----------------------------------------------------------------------
    24. include \masm32\MACROS\Strings.mac
    25. ;----------------------------------------------------------------------
    26. ;code
    27. ;----------------------------------------------------------------------
    28. .data
    29. PKeServiceDescriptorTable   PSERVICE_DESCRIPTOR_TABLE       ?
    30. TrueNtOpenProcess       PVOID                   ?
    31. FalsNtOpenProcess       PVOID                   ?
    32. func_id             ULONG                   7Ah
    33. gs_tt               DWORD                   0
    34. ;----------------------------------------------------------------------
    35. ; Intercepted function:
    36. ; NTSTATUS NtOpenProcess (
    37. ;    OUT PHANDLE ProcessHandle,
    38. ;    IN ACCESS_MASK DesiredAccess,
    39. ;    IN POBJECT_ATTRIBUTES ObjectAttributes,
    40. ;    IN PCLIENT_ID ClientId OPTIONAL)
    41. .code
    42. DriverULoad proc pDriverObject:PDRIVER_OBJECT
    43.   local CR0Reg:ULONG
    44.      push ECX
    45.      push EBX
    46.      push EDX
    47.      push func_id
    48.      call NtProcAddr
    49.      cli                     ;// запрещаем прерывания
    50.      mov EBX, cr0
    51.      mov CR0Reg,EBX
    52.      and EBX,0FFFEFFFFh     ;// сбросить WP bit
    53.      mov cr0, EBX
    54.      mov ECX, TrueNtOpenProcess
    55.      mov dword ptr [EAX], ECX
    56.      mov eax, CR0Reg    
    57.      mov cr0, eax            ;// востановить содержимое CR0
    58.      sti
    59.      pop EDX
    60.      pop EBX
    61.      pop ECX
    62.      ret
    63. DriverULoad endp
    64. ;----------------------------------------------------------------------
    65. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    66.   local CR0Reg:ULONG
    67.      mov PKeServiceDescriptorTable,  KeServiceDescriptorTable
    68.      invoke DbgPrint, $CTA0("enter p_int")
    69.      mov EAX, offset KeServiceDescriptorTable
    70.      invoke DbgPrint, $CTA0("KeSerDesT offset: %x"), PKeServiceDescriptorTable
    71.      invoke DbgPrint, $CTA0("KeSetDesT      : %x"), KeServiceDescriptorTable
    72.      push EBX
    73.      push ECX
    74.      push func_id
    75.      call NtProcAddr
    76.      mov gs_tt,EAX
    77.      invoke DbgPrint, $CTA0("NeededProcOffset: %x"), gs_tt
    78.      sub EAX, KeServiceDescriptorTable
    79.      mov gs_tt,EAX
    80.      invoke DbgPrint, $CTA0("Subjenction: %x"), gs_tt
    81.      mov ECX, DWORD PTR [EAX] ;saved
    82.      mov EBX, ECX
    83.      mov TrueNtOpenProcess, ECX
    84.      mov FalsNtOpenProcess, offset NewNtOpenProcess
    85.      cli
    86.      mov EBX, cr0
    87.      mov CR0Reg,EBX
    88.      and EBX,0FFFEFFFFh      ;сбросить WP bit
    89.      mov cr0, EBX
    90.      mov ECX, FalsNtOpenProcess
    91.      mov dword ptr [EAX], ECX
    92.      mov EBX, CR0Reg    
    93.      mov cr0, EBX            ;востановить содержимое CR0
    94.      sti
    95.      pop ECX
    96.      pop EBX*
    97.      mov EAX, pDriverObject
    98.      assume EAX:PDRIVER_OBJECT
    99.      mov [EAX].DriverUnload, offset DriverULoad
    100.      assume EAX:nothing
    101.      mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    102.      ret
    103. DriverEntry endp
    104. ;----------------------------------------------------------------------
    105. NtProcAddr proc fnum: ULONG                   ;EAX=ptr to proc addr  
    106.      push EBX
    107.      push ECX
    108.      push EDX
    109.      mov EDX, fnum
    110.      invoke DbgPrint, $CTA0("Proc number: %x"), fnum
    111.      xor EAX, EAX
    112.      shl EDX,1
    113.      shl EDX,1                  ;MULx4=massiv offset
    114.      mov gs_tt, EDX
    115.      invoke DbgPrint, $CTA0("Proc offset at KE: %x"), gs_tt
    116.      mov EBX, PKeServiceDescriptorTable
    117.      invoke DbgPrint, $CTA0("PKeServiceDescriptorTable again: %x"), PKeServiceDescriptorTable
    118.      assume EBX:PSERVICE_DESCRIPTOR_TABLE
    119.      mov ECX,[EBX].ntoskrnl.ServiceTable  ;в ECX - массив из PVOID
    120.      mov gs_tt, ECX
    121.      invoke DbgPrint, $CTA0("Service table addr: %x"), gs_tt
    122.      mov EAX,ECX              
    123.      add EAX, EDX
    124.      mov gs_tt, EAX
    125.      invoke DbgPrint, $CTA0("Proc addr_abs: %x"), gs_tt
    126.      mov ECX, DWORD PTR [EAX]
    127.      mov gs_tt, ECX
    128.      invoke DbgPrint, $CTA0("PTR TO NEEDED Proc : %x"), gs_tt
    129.      assume EBX:nothing
    130.      pop EDX
    131.      pop ECX
    132.      pop EBX
    133.      ret
    134. NtProcAddr endp    
    135. ;----------------------------------------------------------------------
    136. NewNtOpenProcess proc ProcessHandle:PHANDLE, DesiredAccess:ACCESS_MASK, ObjectAttributes:POBJECT_ATTRIBUTES,
    137.  
    138. ClientId:PCLIENT_ID
    139.      invoke DbgPrint, $CTA0("Intercepted_success")
    140.      push ClientId
    141.      push ObjectAttributes
    142.      push DesiredAccess
    143.      push ProcessHandle
    144.      call TrueNtOpenProcess
    145.      ret
    146. NewNtOpenProcess endp
    147. ;----------------------------------------------------------------------
    148. ;end
    149. ;----------------------------------------------------------------------
    150. end DriverEntry
    151. ;----------------------------------------------------------------------
    152. ;self-building
    153. ;----------------------------------------------------------------------
    154. :make
    155. \masm32\bin\ml /nologo /c /coff simplest.bat
    156. \masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:proc_int.sys /subsystem:native simplest.obj
    157. del simplest.obj
    158. echo.
    159. pause
    Компилится и либо bsod, либо просто ни черта не делает. Подскажите чё тут не так
     
  11. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    Напиши сразу после начала процедура запуска драйвера инструкцию int 3, скомпиль и запускай, не забудь SoftIce включить, а то BSoD будет. А вообще поищи по форуму, я не давно на ASM код выкладывал, перехват NtOpenProcess из статьи «Перехват API функций в Windows NT (часть 3). Нулевое кольцо. [Ms-Rem]», переписанный на ASM.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    SoftIce в лапы и вперед и с песней =)
     
  13. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    А ссылочку можно плз?
     
  14. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
  15. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Времени не хватает.
    Тем более что то в той теме я не нашел кода на асме)
    Просто недавно на форуме, где чё куда тыкать? Где он там?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Vilco
    Поиск-то?) http://www.wasm.ru/forum/search.php
     
  17. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
  18. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Все спасибо, нашел
     
  19. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Скажите пожалуйста, если я знаю имя функции, могу ли я узнать где нибудь список параметров для неё? И что должна возвращать... И конешно, желательно смысл каждого параметра ^_^
    Рассматривается множество функций Native API
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Как правило нет, но можно продизасмить её, и вывести параметры самостоятельно, можно посмотреть в сорцах wrk, win2k, ROS.