めいくりぷとのブログ

技術的なことをまったりと。

System Service Dispatch Table のアドレスを検索する。

PVOID FindSSDT()
{
	BYTE  KiSystemServiceStartPattern[] = { 0x8B, 0xF8, 0xC1, 0xEF, 0x07, 0x83, 0xE7, 0x20, 0x25, 0xFF, 0x0F, 0x00, 0x00 };
	ULONG uSize, uModuleSize;
	ULONG uOffset;
	PVOID pKernelModule;
	BOOL  bFound;

	pKernelModule = GetKernelModule(&uModuleSize);
	if (pKernelModule != NULL)
	{
		uSize  = sizeof(KiSystemServiceStartPattern);
		bFound = FALSE;

		for (uOffset = 0; uOffset < uModuleSize - uSize; uOffset++)
		{
			if (RtlCompareMemory((PBYTE(pKernelModule) + uOffset), KiSystemServiceStartPattern, uSize) == uSize)
			{
				bFound = TRUE;
				break;
			}
		}

		if (bFound)
		{
			ULONG_PTR uAddress;
			ULONG	  uRelOffset;	
			PVOID	  pSSDT;

			uAddress = reinterpret_cast<ULONG_PTR>(PBYTE(pKernelModule) + uOffset + uSize);
			if (*(BYTE*)(uAddress)	   == 0x4C &&
				*(BYTE*)(uAddress+0x1) == 0x8D &&
				*(BYTE*)(uAddress+0x2) == 0x15)
			{
				uRelOffset = *(ULONG*)(uAddress + 0x3);
				if (uRelOffset != 0)
				{
					pSSDT = reinterpret_cast<PVOID*>(uAddress + uRelOffset + 0x7);
					if (pSSDT != NULL)
					{
						return pSSDT;
					}
				}
			}
		}
	}

	return NULL;
}