이미 알고 계신분들이 많으시겠지만 Windows XP SP2이상부터 MS 핫패칭 기능이 들어가 있습니다.
따라서 이에 대해 특정 함수에 대한 기계어 코드를 검사함으로써 Windows XP SP2이상인지 확인 할 수 있습니다.
다음은 해당 코드입니다.
#include <Windows.h>
BOOL IsWindowsXpSp2AndLater()
{
HMODULE hModule;
UCHAR *pBitBltAddress;
hModule = ::LoadLibrary(_T("GDI32.DLL"));
if (hModule == NULL)
{
return FALSE;
}
pBitBltAddress = (UCHAR *)::GetProcAddress(hModule, "BitBlt");
if (pBitBltAddress == NULL)
{
return FALSE;
}
//
// MS HotPatching이 Windows XP SP2 이상부터 적용되었으므로 이에 대한 기계어 코드를 확인합니다.
//
if (((*(pBitBltAddress - 5)) == 0x90) && // nop
((*(pBitBltAddress - 4)) == 0x90) && // nop
((*(pBitBltAddress - 3)) == 0x90) && // nop
((*(pBitBltAddress - 2)) == 0x90) && // nop
((*(pBitBltAddress - 1)) == 0x90) && // nop
((*pBitBltAddress) == 0x8B) && ((*(pBitBltAddress + 1)) == 0xFF) // mov edi, edi
)
{
return TRUE;
}
return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (IsWindowsXpSp2AndLater() == TRUE)
{
printf("버전이 Windows XP SP2 이상입니다. ( 또는 Windows 2003 Server 이상 )\n");
}
else
{
printf("버전이 Windows XP SP2 아래에 운영체제입니다.\n");
}
return 0;
}
해당 함수가 이미 훅킹을 당했을 경우 코드에 변조가 있을 수 있으므로 주의해야합니다.
GDI32.DLL에서 체크하는 방식이네요~
취약점이 있는 버전을 사용중인지 체크도 가능하겠군요.