Beispiel #1
3
PLIST_ENTRY 
GetProcCallList()
{
	NTSTATUS status;
	OB_CALLBACK_REGISTRATION obReg;
	OB_OPERATION_REGISTRATION opReg;
	PCALLBACK_NODE obHandle;

	memset(&obReg, 0, sizeof(obReg));
	obReg.Version = ObGetFilterVersion();
	obReg.OperationRegistrationCount = 1;
	obReg.RegistrationContext = NULL;
	RtlInitUnicodeString(&obReg.Altitude, L"CallBack");
	memset(&opReg, 0, sizeof(opReg));//Init Struct
	opReg.ObjectType = PsProcessType;
	opReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
	opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)&PreCall;
	//opReg.PostOperation=(POB_POST_OPERATION_CALLBACK)&PostCall;
	obReg.OperationRegistration = &opReg;
	status = ObRegisterCallbacks(&obReg, &obHandle);
	if(NT_SUCCESS(status)){
		PLIST_ENTRY self = &(obHandle->Entries[0].CallbackList);
		ObUnRegisterCallbacks((PVOID)obHandle);
		return self->Blink;
	}
	else {
		DbgPrint("RegisterCallback failed! errcode:%x", status);
	}
	return NULL;
}
Beispiel #2
2
/// <summary>
/// Starts filtering process and thread access rights.
/// </summary>
NTSTATUS HsRegisterProtector()
{
	NTSTATUS status;
	OB_CALLBACK_REGISTRATION callbackRegistration;
	OB_OPERATION_REGISTRATION operationRegistration[2];

	operationRegistration[0].ObjectType = PsProcessType;
	operationRegistration[0].Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
	operationRegistration[0].PreOperation = HspObPreCallback;
	operationRegistration[0].PostOperation = NULL;

	operationRegistration[1].ObjectType = PsThreadType;
	operationRegistration[1].Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
	operationRegistration[1].PreOperation = HspObPreCallback;
	operationRegistration[1].PostOperation = NULL;

	callbackRegistration.Version = OB_FLT_REGISTRATION_VERSION;
	callbackRegistration.RegistrationContext = NULL;
	callbackRegistration.OperationRegistrationCount = ARRAYSIZE(operationRegistration);
	callbackRegistration.OperationRegistration = operationRegistration;

	RtlInitUnicodeString(&callbackRegistration.Altitude, L"40100.7");

	FltInitializePushLock(&ObCallbackInstance.ProtectedProcessLock);

	RtlInitializeGenericTableAvl(
		&ObCallbackInstance.ProtectedProcesses,
		HspCompareProtectedProcess,
		HsAvlAllocate,
		HsAvlFree,
		NULL);

	status = ObRegisterCallbacks(&callbackRegistration, &ObCallbackInstance.RegistrationHandle);

	if (!NT_SUCCESS(status))
		FltDeletePushLock(&ObCallbackInstance.ProtectedProcessLock);

	return status;
}
Beispiel #3
1
/**
*  装载过滤处理模块
*/
bool loadFilter()
{
	NTSTATUS status;

	UNICODE_STRING ustrAltitude;
	RtlInitUnicodeString(&ustrAltitude, L"326666");

	OB_OPERATION_REGISTRATION  oor = {PsProcessType, OB_OPERATION_HANDLE_CREATE, ObjectPreCallbackFilter, NULL};
	
	OB_CALLBACK_REGISTRATION  ocr = {OB_FLT_REGISTRATION_VERSION, 1, ustrAltitude, NULL, &oor };

	status = ObRegisterCallbacks(&ocr, &g_registerHandle);

	if (!NT_SUCCESS(status))
	{
		switch(status)
		{
		case STATUS_FLT_INSTANCE_ALTITUDE_COLLISION :
			WriteSysLog(LOG_TYPE_DEBUG,L" altitude is already exist!\n");
			break;

		case STATUS_INVALID_PARAMETER: 
			WriteSysLog(LOG_TYPE_DEBUG,L" parameter is error!\n");
			break;
		}
		return false;
	}

	kdP(("obRegisterCallbacks is sucessful!\n"));
	return true;
}
Beispiel #4
0
NTSTATUS
DriverEntry (
	IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath
	)
{
	NTSTATUS status = STATUS_UNSUCCESSFUL;

	OB_OPERATION_REGISTRATION ObOperations[] = {
		{PsProcessType,		OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,		ObCallbackPreProcess,	ObCallbackPostProcess},
		{PsThreadType,		OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,		ObCallbackPreThread,	ObCallbackPostThread}
	};

	OB_CALLBACK_REGISTRATION ObRegistration = {
		OB_FLT_REGISTRATION_VERSION,
		sizeof(ObOperations) / sizeof(OB_OPERATION_REGISTRATION),
		{sizeof(L"320400") - sizeof(WCHAR), sizeof(L"320400"), L"320400"},
		&Globals,
		ObOperations
	};

	PVOID RegistrationHandle = NULL;

	UNREFERENCED_PARAMETER( RegistryPath );

	RtlZeroMemory( &Globals, sizeof(Globals) );

	Globals.m_FilterDriverObject = DriverObject;

	status = ObRegisterCallbacks( &ObRegistration, &RegistrationHandle );

	if (NT_SUCCESS( status ))
	{
		status = PsSetCreateProcessNotifyRoutineEx( cbCreateNotifyEx, FALSE );
		if (NT_SUCCESS( status ))
			Globals.m_RegistrationHandle = RegistrationHandle;
		else
		{
			ObUnRegisterCallbacks( RegistrationHandle );
			DbgBreakPoint();
		}
	}
	else
	{
		DbgBreakPoint();
	}

	return status;
}
NTSTATUS RegisterHandlesOperationsNotifier(IN PHANDLES_NOTIFY_STRUCT HandlesNotifyStruct, OUT PVOID *RegistrationHandle) {
	// Определяем тип операции и задаём сами каллбэки:
	OB_OPERATION_REGISTRATION OperationRegistration;
	OperationRegistration.ObjectType = HandlesNotifyStruct->ObjectType; // PsProcessType / PsThreadType / ExDesktopObjectType
	OperationRegistration.Operations = HandlesNotifyStruct->Operations; // OB_OPERATION_HANDLE_CREATE || OB_OPERATION_HANDLE_DUPLICATE 
	OperationRegistration.PostOperation = HandlesNotifyStruct->PostOperation;
	OperationRegistration.PreOperation  = HandlesNotifyStruct->PreOperation;

	// Определяем "высоту" фильтра в стеке фильтров:
	UNICODE_STRING Altitude;
	RtlInitUnicodeString(&Altitude, L"389020"); // It's a magic!

	// Заполняем структуру регистрации каллбэка:
	OB_CALLBACK_REGISTRATION CallbackRegistration;
	CallbackRegistration.Altitude                   = Altitude;
	CallbackRegistration.OperationRegistration      = &OperationRegistration;
	CallbackRegistration.OperationRegistrationCount = 1;
	CallbackRegistration.RegistrationContext        = HandlesNotifyStruct->RegistrationContext; // Параметр, который будет передан в каллбэк
	CallbackRegistration.Version                    = OB_FLT_REGISTRATION_VERSION;

	// Регистрируем каллбэк:
	return ObRegisterCallbacks(&CallbackRegistration, RegistrationHandle);
}
NTSTATUS TdProtectNameCallback (
    _In_ PTD_PROTECTNAME_INPUT pProtectName
)
{
    NTSTATUS Status = STATUS_SUCCESS;

    if (!pProtectName) {
        DbgPrintEx (
            DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
            "ObCallbackTest: TdProtectNameCallback: name to protect/filter NULL pointer\n"
        );
    }
    else {
        DbgPrintEx (
            DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL,
            "ObCallbackTest: TdProtectNameCallback: entering name to protect/filter %ls\n", pProtectName->Name
        );
    }
    KeAcquireGuardedMutex (&TdCallbacksMutex);

    // Need to copy out the name and then set the flag to filter
    // This will allow process creation to watch for the process to be created and get the PID
    // and then prevent any other process from opening up that PID to terminate

    memcpy(TdwProtectName, pProtectName->Name, sizeof(TdwProtectName));

    DbgPrintEx (
        DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL,
        "ObCallbackTest: name copied     %ls\n", TdwProtectName
    );

    // Need to enable the OB callbacks
    // once the process is matched to a newly created process, the callbacks will protect the process
    if (bCallbacksInstalled == FALSE) {
        DbgPrintEx (
            DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL,
            "ObCallbackTest: TdProtectNameCallback: installing callbacks\n"
        );

        // Setup the Ob Registration calls

        CBOperationRegistrations[0].ObjectType = PsProcessType;
        CBOperationRegistrations[0].Operations |= OB_OPERATION_HANDLE_CREATE;
        CBOperationRegistrations[0].Operations |= OB_OPERATION_HANDLE_DUPLICATE;
        CBOperationRegistrations[0].PreOperation = CBTdPreOperationCallback;
        CBOperationRegistrations[0].PostOperation = CBTdPostOperationCallback;

        CBOperationRegistrations[1].ObjectType = PsThreadType;
        CBOperationRegistrations[1].Operations |= OB_OPERATION_HANDLE_CREATE;
        CBOperationRegistrations[1].Operations |= OB_OPERATION_HANDLE_DUPLICATE;
        CBOperationRegistrations[1].PreOperation = CBTdPreOperationCallback;
        CBOperationRegistrations[1].PostOperation = CBTdPostOperationCallback;


        RtlInitUnicodeString (&CBAltitude, L"1000");

        CBObRegistration.Version                    = OB_FLT_REGISTRATION_VERSION;
        CBObRegistration.OperationRegistrationCount = 2;
        CBObRegistration.Altitude                   = CBAltitude;
        CBObRegistration.RegistrationContext        = &CBCallbackRegistration;
        CBObRegistration.OperationRegistration      = CBOperationRegistrations;


        Status = ObRegisterCallbacks (
            &CBObRegistration,
            &pCBRegistrationHandle       // save the registration handle to remove callbacks later
        );

        if (!NT_SUCCESS (Status))   {
            DbgPrintEx (
                DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
                "ObCallbackTest: installing OB callbacks failed  status 0x%x\n", Status
            );
            KeReleaseGuardedMutex (&TdCallbacksMutex); // Release the lock before exit
            goto Exit;
        }
        bCallbacksInstalled = TRUE;

    }


    KeReleaseGuardedMutex (&TdCallbacksMutex);


    DbgPrintEx (
        DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL,
        "ObCallbackTest: TdProtectNameCallback: name to protect/filter %ls\n", TdwProtectName
    );

Exit:
    DbgPrintEx (
        DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL,
        "ObCallbackTest: TdProtectNameCallback: exiting  status 0x%x\n", Status
    );
    return Status;
}