?? driverobj.c
字號(hào):
/*
* Copyright (c) 2004 Security Architects Corporation. All rights reserved.
*
* Module Name:
*
* driverobj.c
*
* Abstract:
*
* This module implements various driver object hooking routines.
*
* Author:
*
* Eugene Tsyrklevich 06-Apr-2004
*
* Revision History:
*
* None.
*/
#include "driverobj.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, InitDriverObjectHooks)
#endif
fpZwLoadDriver OriginalNtLoadDriver = NULL;
fpZwUnloadDriver OriginalNtUnloadDriver = NULL;
/*
* HookedNtLoadDriver()
*
* Description:
* This function mediates the NtLoadDriver() system service and checks the
* provided driver object name against the global and current process security policies.
*
* NOTE: ZwLoadDriver loads a device driver. [NAR]
*
* Parameters:
* Those of NtLoadDriver().
*
* Returns:
* STATUS_ACCESS_DENIED if the call does not pass the security policy check.
* Otherwise, NTSTATUS returned by NtLoadDriver().
*/
NTSTATUS
NTAPI
HookedNtLoadDriver
(
IN PUNICODE_STRING DriverServiceName
)
{
PCHAR FunctionName = "HookedNtLoadDriver";
UNICODE_STRING usDriverName;
ANSI_STRING AnsiDriverName;
CHAR DRIVERNAME[MAX_PATH];
HOOK_ROUTINE_ENTER();
if (!VerifyUnicodeString(DriverServiceName, &usDriverName))
{
LOG(LOG_SS_DRIVER, LOG_PRIORITY_DEBUG, ("HookedNtLoadDriver: VerifyUnicodeString(%x) failed\n", DriverServiceName));
HOOK_ROUTINE_EXIT( STATUS_ACCESS_DENIED );
}
if (_snprintf(DRIVERNAME, MAX_PATH, "%S", usDriverName.Buffer) < 0)
{
LOG(LOG_SS_DRIVER, LOG_PRIORITY_DEBUG, ("%s: Driver name '%S' is too long\n", FunctionName, usDriverName.Buffer));
HOOK_ROUTINE_EXIT( STATUS_ACCESS_DENIED );
}
LOG(LOG_SS_DRIVER, LOG_PRIORITY_VERBOSE, ("HookedNtLoadDriver: %s\n", DRIVERNAME));
if (LearningMode == FALSE)
{
POLICY_CHECK_OPTYPE_NAME(DRIVER, OP_REGLOAD);
}
ASSERT(OriginalNtLoadDriver);
rc = OriginalNtLoadDriver(DriverServiceName);
HOOK_ROUTINE_FINISH_OBJECTNAME_OPTYPE(DRIVER, DRIVERNAME, OP_REGLOAD);
}
/*
* HookedNtUnloadDriver()
*
* Description:
* This function mediates the NtUnloadDriver() system service and checks the
* provided driver object name against the global and current process security policies.
*
* NOTE: ZwUnloadDriver unloads a device driver. [NAR]
*
* Parameters:
* Those of NtUnloadDriver().
*
* Returns:
* STATUS_ACCESS_DENIED if the call does not pass the security policy check.
* Otherwise, NTSTATUS returned by NtUnloadDriver().
*/
//XXX cannot mediate this function if we want to be able to unload our own driver
/* uncomment originalfunction pointer code in Init() routine and hookproc.c hook to enable
NTSTATUS
NTAPI
HookedNtUnloadDriver
(
IN PUNICODE_STRING DriverServiceName
)
{
PCHAR FunctionName = "HookedNtUnloadDriver";
UNICODE_STRING usDriverName;
ANSI_STRING AnsiDriverName;
CHAR DRIVERNAME[MAX_PATH];
HOOK_ROUTINE_ENTER();
if (!VerifyUnicodeString(DriverServiceName, &usDriverName))
{
LOG(LOG_SS_DRIVER, LOG_PRIORITY_DEBUG, ("HookedNtUnloadDriver: VerifyUnicodeString failed\n"));
HOOK_ROUTINE_EXIT( STATUS_ACCESS_DENIED );
}
AnsiDriverName.Length = 0;
AnsiDriverName.MaximumLength = MAX_PATH - 1;
AnsiDriverName.Buffer = DRIVERNAME;
if (! NT_SUCCESS(RtlUnicodeStringToAnsiString(&AnsiDriverName, &usDriverName, FALSE)))
{
LOG(LOG_SS_DRIVER, LOG_PRIORITY_DEBUG, ("HookedNtUnloadDriver: RtlUnicodeStringToAnsiString failed\n"));
HOOK_ROUTINE_EXIT( STATUS_ACCESS_DENIED );
}
DRIVERNAME[AnsiDriverName.Length] = 0;
LOG(LOG_SS_DRIVER, LOG_PRIORITY_DEBUG, ("HookedNtUnloadDriver: %s\n", DRIVERNAME));
if (LearningMode == FALSE)
{
POLICY_CHECK_OPTYPE_NAME(DRIVER, OP_UNLOAD);
}
ASSERT(OriginalNtUnloadDriver);
rc = OriginalNtUnloadDriver(DriverServiceName);
HOOK_ROUTINE_FINISH_OBJECTNAME_OPTYPE(DRIVER, DRIVERNAME, OP_UNLOAD);
}
*/
/*
* InitDriverHooks()
*
* Description:
* Initializes all the mediated driver object operation pointers. The "OriginalFunction" pointers
* are initialized by InstallSyscallsHooks() that must be called prior to this function.
*
* NOTE: Called once during driver initialization (DriverEntry()).
*
* Parameters:
* None.
*
* Returns:
* TRUE to indicate success, FALSE if failed.
*/
BOOLEAN
InitDriverObjectHooks()
{
if ( (OriginalNtLoadDriver = (fpZwLoadDriver) ZwCalls[ZW_LOAD_DRIVER_INDEX].OriginalFunction) == NULL)
{
LOG(LOG_SS_DRIVER, LOG_PRIORITY_DEBUG, ("InitDriverHooks: OriginalNtLoadDriver is NULL\n"));
return FALSE;
}
/*
if ( (OriginalNtUnloadDriver = (fpZwUnloadDriver) ZwCalls[ZW_UNLOAD_DRIVER_INDEX].OriginalFunction) == NULL)
{
LOG(LOG_SS_DRIVER, LOG_PRIORITY_DEBUG, ("InitDriverHooks: OriginalNtUnloadDriver is NULL\n"));
return FALSE;
}
*/
return TRUE;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -