136 lines
2.7 KiB
C++
136 lines
2.7 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
NFLBlitz.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
NFL Blitz has 2 problems:
|
||
|
|
||
|
1. It keeps linked lists on it's stack and somehow the stack pointer
|
||
|
is changed to allow altered FindFirstFile to corrupt it. We don't hit
|
||
|
this on win9x because FindFirstFile doesn't use any app stack space.
|
||
|
|
||
|
2. Autorun and the main executable are synchronized using a mutex that is
|
||
|
freed only on process termination. The sequence of events is:
|
||
|
|
||
|
a. Autorun creates a mutex
|
||
|
b. Autorun creates a new process
|
||
|
c. Autorun terminates thus freeing the mutex in (a).
|
||
|
d. New process checks if it's already running by examining the
|
||
|
mutex created in (a).
|
||
|
|
||
|
This fails when (c) and (d) are exchanged which happens all the time
|
||
|
on NT, but apparently very seldom on win9x.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is an app specific shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
02/10/2000 linstev Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(NFLBlitz)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(CreateMutexA)
|
||
|
APIHOOK_ENUM_ENTRY(CreateProcessA)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
HANDLE g_hMutex = NULL;
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Store the handle to the mutex we're interested in.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HANDLE
|
||
|
APIHOOK(CreateMutexA)(
|
||
|
LPSECURITY_ATTRIBUTES lpMutexAttributes,
|
||
|
BOOL bInitialOwner,
|
||
|
LPCSTR lpName
|
||
|
)
|
||
|
{
|
||
|
HANDLE hRet = ORIGINAL_API(CreateMutexA)(
|
||
|
lpMutexAttributes,
|
||
|
bInitialOwner,
|
||
|
lpName);
|
||
|
|
||
|
DWORD dwErrCode = GetLastError();
|
||
|
|
||
|
if (lpName && _tcsicmp(lpName, "NFL BLITZ") == 0)
|
||
|
{
|
||
|
g_hMutex = hRet;
|
||
|
}
|
||
|
|
||
|
SetLastError(dwErrCode);
|
||
|
|
||
|
return hRet;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Close the mutex.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(CreateProcessA)(
|
||
|
LPCSTR lpApplicationName,
|
||
|
LPSTR lpCommandLine,
|
||
|
LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
||
|
LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
||
|
BOOL bInheritHandles,
|
||
|
DWORD dwCreationFlags,
|
||
|
LPVOID lpEnvironment,
|
||
|
LPCSTR lpCurrentDirectory,
|
||
|
LPSTARTUPINFOA lpStartupInfo,
|
||
|
LPPROCESS_INFORMATION lpProcessInformation
|
||
|
)
|
||
|
{
|
||
|
if (g_hMutex)
|
||
|
{
|
||
|
ReleaseMutex(g_hMutex);
|
||
|
CloseHandle(g_hMutex);
|
||
|
g_hMutex = NULL;
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(CreateProcessA)(
|
||
|
lpApplicationName,
|
||
|
lpCommandLine,
|
||
|
lpProcessAttributes,
|
||
|
lpThreadAttributes,
|
||
|
bInheritHandles,
|
||
|
dwCreationFlags,
|
||
|
lpEnvironment,
|
||
|
lpCurrentDirectory,
|
||
|
lpStartupInfo,
|
||
|
lpProcessInformation);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, CreateMutexA)
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, CreateProcessA)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|