You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.3 KiB
124 lines
3.3 KiB
/*++
|
|
|
|
Copyright (c) 2000-2002 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
SierraCartRacing.cpp
|
|
|
|
Abstract:
|
|
|
|
Sierra Cart Racing passes a bad pointer to InitializeSecurityDescriptor which overwrites
|
|
part of the SECURITY_ATTRIBUTES structure and some other stack memory.
|
|
|
|
The original version of this shim would fail the call to InitializeSecurityDescriptor,
|
|
and force a NULL security descriptor to CreateSemaphoreA. To reduce the security risk,
|
|
the shim was modified to only pass a NULL security descriptor to CreateSemaphoreA if
|
|
it detects that the LPSECURITY_ATTRIBUTES was overwritten by InitializeSecurityDescriptor,
|
|
and restores the memory overwritten by InitializeSecurityDescriptor.
|
|
|
|
Notes:
|
|
|
|
This is an app specific shim.
|
|
|
|
History:
|
|
|
|
11/03/1999 linstev Created
|
|
03/15/2002 robkenny Re-created to pass security muster.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(SierraCartRacing)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(CreateSemaphoreA)
|
|
APIHOOK_ENUM_ENTRY(InitializeSecurityDescriptor)
|
|
APIHOOK_ENUM_END
|
|
|
|
BOOL g_BLastSecurityDescriptorSet = FALSE;
|
|
SECURITY_DESCRIPTOR g_LastSecurityDescriptor;
|
|
|
|
/*++
|
|
|
|
Use the default security descriptor.
|
|
|
|
--*/
|
|
|
|
HANDLE
|
|
APIHOOK(CreateSemaphoreA)(
|
|
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
|
|
LONG lInitialCount,
|
|
LONG lMaximumCount,
|
|
LPCSTR lpName
|
|
)
|
|
{
|
|
if (lpSemaphoreAttributes && g_BLastSecurityDescriptorSet)
|
|
{
|
|
// Initialize a security descriptor
|
|
SECURITY_DESCRIPTOR securityDescriptor;
|
|
InitializeSecurityDescriptor(&securityDescriptor, SECURITY_DESCRIPTOR_REVISION);
|
|
|
|
// Check to see if them memory starting at lpSemaphoreAttributes->lpSecurityDescriptor
|
|
// contains the same memory as a security descriptor.
|
|
int compareResult = memcmp(&securityDescriptor,
|
|
&lpSemaphoreAttributes->lpSecurityDescriptor,
|
|
sizeof(securityDescriptor));
|
|
if (compareResult == 0)
|
|
{
|
|
// Restore the overwritten memory
|
|
memcpy(&lpSemaphoreAttributes->lpSecurityDescriptor, &g_LastSecurityDescriptor, sizeof(g_LastSecurityDescriptor));
|
|
|
|
// lpSemaphoreAttributes is bogus
|
|
lpSemaphoreAttributes = NULL;
|
|
}
|
|
}
|
|
|
|
return ORIGINAL_API(CreateSemaphoreA)(
|
|
lpSemaphoreAttributes,
|
|
lInitialCount,
|
|
lMaximumCount,
|
|
lpName);
|
|
}
|
|
|
|
|
|
|
|
/*++
|
|
|
|
Returns false for InitializeSecurityDescriptor. i.e. do nothing so we don't
|
|
touch the stack.
|
|
|
|
--*/
|
|
|
|
BOOL
|
|
APIHOOK(InitializeSecurityDescriptor)(
|
|
PSECURITY_DESCRIPTOR pSecurityDescriptor,
|
|
DWORD dwRevision
|
|
)
|
|
{
|
|
// Save the memory that will be overwritten.
|
|
if (pSecurityDescriptor)
|
|
{
|
|
g_BLastSecurityDescriptorSet = TRUE;
|
|
memcpy(&g_LastSecurityDescriptor, pSecurityDescriptor, sizeof(g_LastSecurityDescriptor));
|
|
}
|
|
return ORIGINAL_API(InitializeSecurityDescriptor)(pSecurityDescriptor, dwRevision);
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
|
|
APIHOOK_ENTRY(KERNEL32.DLL, CreateSemaphoreA)
|
|
APIHOOK_ENTRY(ADVAPI32.DLL, InitializeSecurityDescriptor)
|
|
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|