资源简介

经过N多辗转和持续验证,终于搞定了在驱动程序中同时保护进程和文件(经持久测试后,避免了导致系统蓝屏的情况),重点
1)拒绝通过进程管理器关闭进程,同时又允许某些进程可以管理
2)通过比较文件名,截获被保护的文件操作

资源截图

代码片段和文件信息

#ifndef CXX_PROTECTPROCESSX64_H
#    include “ProtectProcessx64.h“
#endif

#include 
#include 

#include 

#define TRACE ATLTRACE

//进程保护CallBackHandle
PVOID processCallBackHandle = NULL; //定义一个void*类型的变量,它将会作为ObRegisterCallbacks函数的第二个参数。
PEPROCESS parentsProtectedProcess; //被保护进程的父进程(来自该进程的处理,被排外)

//文件保护
PVOID  fileCallBackHandle = NULL;

//驱动入口
NTSTATUS
DriverEntry(IN PDRIVER_object pDriverObj IN PUNICODE_STRING pRegistryString)
{
DbgPrint(“begin to load driver...\n“);
KdPrint((“begin to load driver...\n“));

//OutputDebugString(“begin to load driver...\n“);
NTSTATUS status = STATUS_SUCCESS;
PLDR_DATA_TABLE_ENTRY64 ldr;

pDriverObj->DriverUnload = DriverUnload;
// 绕过MmVerifyCallbackFunction
ldr = (PLDR_DATA_TABLE_ENTRY64)pDriverObj->DriverSection;
ldr->Flags |= 0x20;

DbgPrint(“begin to ProtectProcess...\n“);
//保护线程回调
ProtectProcess(TRUE);

//保护文件
ProtectFileByObRegisterCallbacks();

return STATUS_SUCCESS;
}

#define MY_MAX_PATH 256
BOOLEAN UnicodeStringToChar(char* DestinationString PUNICODE_STRING SourceString)
{
    ANSI_STRING v1;
    NTSTATUS    Status;
    char*       v2 = NULL;
    __try
    {
        Status = RtlUnicodeStringToAnsiString(&v1 SourceString TRUE);
        if (v1.Length < MY_MAX_PATH)
        {
            v2 = (PCHAR)v1.Buffer;
            strcpy(DestinationString _strupr(v2));
        }
        RtlFreeAnsiString(&v1);
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        return FALSE;
    }
    return TRUE;
}

void MyUpper(char *s)
{
while((*s)!=0){
if((*s)>=‘a‘&&(*s)<=‘z‘)
(*s)+=(‘A‘-‘a‘);
s++;
}
}

OB_PREOP_CALLBACK_STATUS FilePreCallBack(PVOID RegistrationContext POB_PRE_OPERATION_INFORMATION OperationInformation)
{
    UNICODE_STRING uniDosName;
uniDosName.Length = 0;

ACCESS_MASK oldCreateDesiredAccess = 0;
ACCESS_MASK oldDuplicateDesiredAccess = 0;

//参数检查
if(NULL == OperationInformation)
return OB_PREOP_SUCCESS;

    PFILE_object Fileobject = (PFILE_object)OperationInformation->object;
    HANDLE CurrentProcessId = PsGetCurrentProcessId();

UNREFERENCED_PARAMETER(RegistrationContext);

//有效性检查
if(NULL == Fileobject)
return OB_PREOP_SUCCESS;

//(1)屏蔽非IoFileobjectType类型的处理
    if( OperationInformation->objectType!=*IoFileobjectType)
    {
        return OB_PREOP_SUCCESS;
    }

    //(2)过滤无效指针
    if(    Fileobject->FileName.Buffer==NULL              || 
        !MmIsAddressValid(Fileobject->FileName.Buffer)    ||
        Fileobject->Deviceobject==NULL                    ||
        !MmIsAddressValid(Fileobject->Deviceobject)        )
    {
        return OB_PREOP_SUCCESS;
    }

//(3)过滤无效路径 否则使用RtlVolumeDeviceToDosName获取盘符会蓝屏
/**/
if( !_wcsicmp(Fileobject->FileName.BufferL“\\Endpoint“) ||
!_wcsicmp(Fileobject->FileName.BufferL“?“) ||
!_wcsicmp(Fileobject->FileName.BufferL“\\.\\.“) ||
!_wcsicmp(Fileobject->Fi

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      13414  2020-02-11 08:47  ProtectProcessx64.cpp

     文件       4348  2020-02-11 08:45  ProtectProcessx64.h

----------- ---------  ---------- -----  ----

                17762                    2


评论

共有 条评论