Перехват OpenService в ring0

Тема в разделе "WASM.NT.KERNEL", создана пользователем Andrew_Kuz, 20 авг 2008.

  1. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    какая функция Nt* является "родоначальной" ф-ции OpenService и каков её прототип?
    (необходимо перехватывать ее в кернел моде, для того чтоб драйвер мой никто не остановил)
    ...................
    ... в процессе обсуждения выяснилось, что OpenService реализовывается RPC вызовами, что оч затрудняет перехват... мож у кого будут какие предложения, каким образом можно защитить драйвер, от выгрузки и снятия?
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Там вроде через RPC происходит вызов, так ведь можно не делать DriverUnload просто, или это не вариант?
     
  3. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    хз...надо поробывать.....а какое значение возвратить фунцции DriverUnload? -1?
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Не, просто ее не реализовывать, не инициализировать в DRIVER_OBJECT поле DriverUnload =))
     
  5. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    спасиб за ответ... попробую
     
  6. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    блин....не вариант....при вызове DeleteService сервис снимется после ребута.. открою новую ветку на перехват DeleteService :)
     
  7. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Andrew_Kuz Поставь софтайс, пропиши "bpx DeleteService" и посмотри как это всё работает ;)
     
  8. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    да не охото его ставить на ноут.... потом винда будет глючить... если ток ещё одну хрюшку поставить....
     
  9. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    посмарел ф-цию DeleteService в отладчике... там точно через RPC происходит....
    в дроваписании я новичек, так что ума не приложу как осуществить перехват... мож кто какие идеи подкинет
     
  10. SloT

    SloT New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2008
    Сообщения:
    72
    Здесь на ВАСМе есть статьи "Перехват API функций в Windows NT", посмотри, может поможет =) (в рифму).
     
  11. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    Код (Text):
    1. BOOL
    2. WINAPI
    3. DeleteService(
    4.     IN  SC_HANDLE   hService
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This is the DLL entry point for the DeleteService function.
    12.     DeleteService removes the service from the Service Control
    13.     Manager's database.
    14.  
    15. Arguments:
    16.  
    17.     hService - Handle obtained from a previous CreateService or
    18.         OpenService call.
    19.  
    20. Return Value:
    21.  
    22.  
    23. Note:
    24.  
    25.  
    26. --*/
    27. {
    28.     DWORD          status;
    29.  
    30.  
    31.     RpcTryExcept {
    32.  
    33.         status = RDeleteService ((SC_RPC_HANDLE)hService);
    34.  
    35.     }
    36.     RpcExcept(1) {
    37.         status = ScMapRpcError(RpcExceptionCode(), ERROR_INVALID_HANDLE);
    38.     }
    39.     RpcEndExcept
    40.  
    41.     if (status != NO_ERROR){
    42.         SetLastError(status);
    43.         return(FALSE);
    44.     }
    45.  
    46.     return(TRUE);
    47. }
    Код (Text):
    1. DWORD
    2. RDeleteService(
    3.     IN  SC_RPC_HANDLE       hService
    4.     )
    5.  
    6. /*++
    7.  
    8. Routine Description:
    9.  
    10.  
    11. Arguments:
    12.  
    13.  
    14. Return Value:
    15.  
    16.  
    17. --*/
    18. {
    19.     NTSTATUS            status;
    20.     UNICODE_STRING      Subsystem;
    21.     ULONG               privileges[1];
    22.     DWORD               ApiStatus;
    23.     BOOL                databaseLocked = FALSE;
    24.     LPSC_HANDLE_STRUCT  serviceHandleStruct = (LPVOID) hService;
    25.     LPSERVICE_RECORD    serviceRecord;
    26.  
    27.     if (ScShutdownInProgress) {
    28.         return(ERROR_SHUTDOWN_IN_PROGRESS);
    29.     }
    30.  
    31.     //
    32.     // Check the handle.
    33.     //
    34.     if ( !ScIsValidServiceHandle( hService ) ) {
    35.         ApiStatus = ERROR_INVALID_HANDLE;
    36.         goto Cleanup;
    37.     }
    38.  
    39.     //
    40.     // Do we have permission to do this?
    41.     //
    42.     if ( !RtlAreAllAccessesGranted(
    43.               serviceHandleStruct->AccessGranted,
    44.               DELETE
    45.               )) {
    46.         ApiStatus = ERROR_ACCESS_DENIED;
    47.         goto Cleanup;
    48.     }
    49.  
    50.     //
    51.     // Lock database, as we want to change stuff without other threads tripping
    52.     // on our feet.
    53.     //
    54.     (VOID) ScDatabaseLock(SC_GET_EXCLUSIVE, "RDeleteService 1");
    55.     databaseLocked = TRUE;
    56.  
    57.     //
    58.     // Find the service record
    59.     //
    60.     serviceRecord = serviceHandleStruct->Type.ScServiceObject.ServiceRecord;
    61.     SC_ASSERT( serviceRecord != NULL );
    62.     SC_ASSERT( serviceRecord->Signature == SERVICE_SIGNATURE );
    63.  
    64.     //
    65.     // Check if marked for deletion (by another call to this API).
    66.     //
    67.     if (DELETE_FLAG_IS_SET(serviceRecord)) {
    68.         ApiStatus = ERROR_SERVICE_MARKED_FOR_DELETE;
    69.         goto Cleanup;
    70.     }
    71.  
    72.     //
    73.     // Mark the service for deletion.
    74.     // It will actually be deleted when the last handle to it is closed.
    75.     // NOTE:  Since the service itself owns a handle, the deletion is
    76.     // not complete until the service has stopped.
    77.     //
    78.     SET_DELETE_FLAG(serviceRecord);
    79.  
    80.     //
    81.     // Mark the registry entry for this service for deletion.  If we notice
    82.     // this as being present when we go throught our initialization routine
    83.     // (during boot), the service entry in the registry will be deleted.
    84.     //
    85.     ScMarkForDelete(serviceRecord->ServiceName);
    86.  
    87.     //
    88.     // Get Audit Privilege
    89.     //
    90.     privileges[0] = SE_AUDIT_PRIVILEGE;
    91.     status = ScGetPrivilege( 1, privileges);
    92.  
    93.     if (!NT_SUCCESS(status)) {
    94.         SC_LOG1(ERROR, "RDeleteService: ScGetPrivilege (Enable) failed %#lx\n",
    95.                 status);
    96.     }
    97.  
    98.     //
    99.     // Generate the Audit.
    100.     //
    101.  
    102.     RtlInitUnicodeString(&Subsystem, SC_MANAGER_AUDIT_NAME);
    103.     status = NtDeleteObjectAuditAlarm(
    104.                 &Subsystem,
    105.                 hService,
    106.                 (BOOLEAN)((serviceHandleStruct->Flags
    107.                     & SC_HANDLE_GENERATE_ON_CLOSE) != 0));
    108.     if (!NT_SUCCESS(status)) {
    109.         SC_LOG1(ERROR, "RDeleteService: NtDeleteObjectAuditAlarm failed %#lx\n",
    110.                 status);
    111.     }
    112.  
    113.     ScReleasePrivilege();
    114.  
    115.     ApiStatus = NO_ERROR;
    116.  
    117. Cleanup:
    118.  
    119.     if (databaseLocked) {
    120.         (VOID) ScDatabaseLock(SC_RELEASE, "RDeleteService 99");
    121.     }
    122.  
    123.     SC_LOG1( CONFIG_API, "RDeleteService returning status " FORMAT_DWORD
    124.             ".\n", ApiStatus );
    125.  
    126.     return (ApiStatus);
    127. }
    сорец сервисманагера
    http://fileuploader.cn/download.php?b3e3d9109dcf9ce47e402de17cfb9886
     
  12. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    жалко что на С.... я его синтаксис плохо знаю
     
  13. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    а вы ядерные перехваты на дельфи делоете?
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    patolog
    Может VB?
     
  15. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    почему сразу делфи...:) .... на асме, еслиб на делфи делал...нафига б я сдесь тему подымал... пошёл бы на "королквство делфи"...или ещ куда нибуть...
    млин...ASM'ский форум...и никто примеров на асме не даст...С да делфи..
     
  16. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    censored
    оч смешно....)
    складыватся впечатление что дрова на асме уже никто не пишет...а пишут на С из ддк, скачать который не имею возможности
     
  17. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Наверника в реестре устанавливается никий флаг удаления сервиса. Вот может это и надо перехватывать?
     
  18. Andrew_Kuz

    Andrew_Kuz УсамаБэнЛаден

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    41
    Адрес:
    планета Земля
    спасибо 2FED! сделал снимок... там точно создается ключ "DeleteFlag" dword = 1
    Буду делать его сокрытие и запрет на изменение