какая функция Nt* является "родоначальной" ф-ции OpenService и каков её прототип? (необходимо перехватывать ее в кернел моде, для того чтоб драйвер мой никто не остановил) ................... ... в процессе обсуждения выяснилось, что OpenService реализовывается RPC вызовами, что оч затрудняет перехват... мож у кого будут какие предложения, каким образом можно защитить драйвер, от выгрузки и снятия?
Там вроде через RPC происходит вызов, так ведь можно не делать DriverUnload просто, или это не вариант?
блин....не вариант....при вызове DeleteService сервис снимется после ребута.. открою новую ветку на перехват DeleteService
да не охото его ставить на ноут.... потом винда будет глючить... если ток ещё одну хрюшку поставить....
посмарел ф-цию DeleteService в отладчике... там точно через RPC происходит.... в дроваписании я новичек, так что ума не приложу как осуществить перехват... мож кто какие идеи подкинет
Здесь на ВАСМе есть статьи "Перехват API функций в Windows NT", посмотри, может поможет =) (в рифму).
Код (Text): BOOL WINAPI DeleteService( IN SC_HANDLE hService ) /*++ Routine Description: This is the DLL entry point for the DeleteService function. DeleteService removes the service from the Service Control Manager's database. Arguments: hService - Handle obtained from a previous CreateService or OpenService call. Return Value: Note: --*/ { DWORD status; RpcTryExcept { status = RDeleteService ((SC_RPC_HANDLE)hService); } RpcExcept(1) { status = ScMapRpcError(RpcExceptionCode(), ERROR_INVALID_HANDLE); } RpcEndExcept if (status != NO_ERROR){ SetLastError(status); return(FALSE); } return(TRUE); } Код (Text): DWORD RDeleteService( IN SC_RPC_HANDLE hService ) /*++ Routine Description: Arguments: Return Value: --*/ { NTSTATUS status; UNICODE_STRING Subsystem; ULONG privileges[1]; DWORD ApiStatus; BOOL databaseLocked = FALSE; LPSC_HANDLE_STRUCT serviceHandleStruct = (LPVOID) hService; LPSERVICE_RECORD serviceRecord; if (ScShutdownInProgress) { return(ERROR_SHUTDOWN_IN_PROGRESS); } // // Check the handle. // if ( !ScIsValidServiceHandle( hService ) ) { ApiStatus = ERROR_INVALID_HANDLE; goto Cleanup; } // // Do we have permission to do this? // if ( !RtlAreAllAccessesGranted( serviceHandleStruct->AccessGranted, DELETE )) { ApiStatus = ERROR_ACCESS_DENIED; goto Cleanup; } // // Lock database, as we want to change stuff without other threads tripping // on our feet. // (VOID) ScDatabaseLock(SC_GET_EXCLUSIVE, "RDeleteService 1"); databaseLocked = TRUE; // // Find the service record // serviceRecord = serviceHandleStruct->Type.ScServiceObject.ServiceRecord; SC_ASSERT( serviceRecord != NULL ); SC_ASSERT( serviceRecord->Signature == SERVICE_SIGNATURE ); // // Check if marked for deletion (by another call to this API). // if (DELETE_FLAG_IS_SET(serviceRecord)) { ApiStatus = ERROR_SERVICE_MARKED_FOR_DELETE; goto Cleanup; } // // Mark the service for deletion. // It will actually be deleted when the last handle to it is closed. // NOTE: Since the service itself owns a handle, the deletion is // not complete until the service has stopped. // SET_DELETE_FLAG(serviceRecord); // // Mark the registry entry for this service for deletion. If we notice // this as being present when we go throught our initialization routine // (during boot), the service entry in the registry will be deleted. // ScMarkForDelete(serviceRecord->ServiceName); // // Get Audit Privilege // privileges[0] = SE_AUDIT_PRIVILEGE; status = ScGetPrivilege( 1, privileges); if (!NT_SUCCESS(status)) { SC_LOG1(ERROR, "RDeleteService: ScGetPrivilege (Enable) failed %#lx\n", status); } // // Generate the Audit. // RtlInitUnicodeString(&Subsystem, SC_MANAGER_AUDIT_NAME); status = NtDeleteObjectAuditAlarm( &Subsystem, hService, (BOOLEAN)((serviceHandleStruct->Flags & SC_HANDLE_GENERATE_ON_CLOSE) != 0)); if (!NT_SUCCESS(status)) { SC_LOG1(ERROR, "RDeleteService: NtDeleteObjectAuditAlarm failed %#lx\n", status); } ScReleasePrivilege(); ApiStatus = NO_ERROR; Cleanup: if (databaseLocked) { (VOID) ScDatabaseLock(SC_RELEASE, "RDeleteService 99"); } SC_LOG1( CONFIG_API, "RDeleteService returning status " FORMAT_DWORD ".\n", ApiStatus ); return (ApiStatus); } сорец сервисманагера http://fileuploader.cn/download.php?b3e3d9109dcf9ce47e402de17cfb9886
почему сразу делфи... .... на асме, еслиб на делфи делал...нафига б я сдесь тему подымал... пошёл бы на "королквство делфи"...или ещ куда нибуть... млин...ASM'ский форум...и никто примеров на асме не даст...С да делфи..
censored оч смешно....) складыватся впечатление что дрова на асме уже никто не пишет...а пишут на С из ддк, скачать который не имею возможности
спасибо 2FED! сделал снимок... там точно создается ключ "DeleteFlag" dword = 1 Буду делать его сокрытие и запрет на изменение