Hi, thanks for the notes.
I’ll post here part of the code that is relevant, and you’ll understand why it didn’t work.
The code:
OB_PREOP_CALLBACK_STATUS
ObjectPreCallback(
IN PVOID RegistrationContext,
IN POB_PRE_OPERATION_INFORMATION OperationInformation
)
{
UNREFERENCED_PARAMETER(RegistrationContext);
if (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE)
{
if ((OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_CREATE_PROCESS) == PROCESS_CREATE_PROCESS)
{
//Create the process suspended
OperationInformation->Parameters->CreateHandleInformation.DesiredAccess |= PROCESS_SUSPEND_RESUME;
//The line abode didn’t work.
}
}
return OB_PREOP_SUCCESS;
}
VOID
ObjectPostCallback(
IN PVOID RegistrationContext,
IN POB_POST_OPERATION_INFORMATION OperationInformation
)
{
UNREFERENCED_PARAMETER(OperationInformation);
UNREFERENCED_PARAMETER(RegistrationContext);
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, “PostCallback. \n”);
}
NTSTATUS
RegisterCallbackZwCreateProcess(VOID)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING Altitude;
USHORT filterVersion = ObGetFilterVersion();
USHORT registrationCount = 1;
OB_OPERATION_REGISTRATION RegisterOperation;
OB_CALLBACK_REGISTRATION RegisterCallBack;
REG_CONTEXT RegistrationContext;
memset(&RegisterOperation, 0, sizeof(OB_OPERATION_REGISTRATION));
memset(&RegisterCallBack, 0, sizeof(OB_CALLBACK_REGISTRATION));
memset(&RegistrationContext, 0, sizeof(REG_CONTEXT));
RegistrationContext.ulIndex = 1;
RegistrationContext.Version = 120;
if (filterVersion == OB_FLT_REGISTRATION_VERSION) {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, “Filter Version is correct.\n”);
RegisterOperation.ObjectType = PsProcessType;
RegisterOperation.Operations = OB_OPERATION_HANDLE_CREATE;
RegisterOperation.PreOperation = ObjectPreCallback;
RegisterOperation.PostOperation = ObjectPostCallback;
RegisterCallBack.Version = OB_FLT_REGISTRATION_VERSION;
RegisterCallBack.OperationRegistrationCount = registrationCount;
RtlInitUnicodeString(&Altitude, L"XXXXXXX");
RegisterCallBack.Altitude = Altitude;
RegisterCallBack.RegistrationContext = &RegistrationContext;
RegisterCallBack.OperationRegistration = &RegisterOperation;
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, “Register Callback Function Entry.\n”);
ntStatus = ObRegisterCallbacks(&RegisterCallBack, &hCallbacks);
if (ntStatus == STATUS_SUCCESS) {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, “Register Callback Function Successful.\n”);
}
else {
if (ntStatus == STATUS_FLT_INSTANCE_ALTITUDE_COLLISION) {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, “Status Filter Instance Altitude Collision.\n”);
}
if (ntStatus == STATUS_INVALID_PARAMETER) {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, “Status Invalid Parameter.\n”);
}
if (ntStatus == STATUS_ACCESS_DENIED) {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, “The callback routines do not reside in a signed kernel binary image.\n”);
}
if (ntStatus == STATUS_INSUFFICIENT_RESOURCES) {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, “Status Allocate Memory Failed.\n”);
}
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, “Register Callback Function Failed with 0x%08x\n”, ntStatus);
}
}
else {
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, “Filter Version is not supported.\n”);
}
return ntStatus;
}
–
Two problems actually:
Somehow, the code flow started to get to STATUS_ACCESS_DENIED and the registration can’t complete.
Furthermore, before I started debugging the driver (I have no idea, but after I connected the first time with WinDbg - it began with the ACCESS_DENIED problems), the registration completed successfully. But, PROCESS_SUSPEND_RESUME doesn’t seem to do what I want (I know that the callback previously registered fine because of other code run in the ObjectPreCallback).
How can I create every process with its thread suspended?
Thanks