読者です 読者をやめる 読者になる 読者になる

めいくりぷとのブログ

技術的なことやゲームのことやら・・・

ハードウェアID(PC固有)情報を調べる

Anti-Cheat

Anti-Cheatプロテクターにも HWID BAN というものがありますよね。
今回は、それらを紹介していきたいと思います。


マイナーな手法として、以下のように、NIC(ネットワークインターフェースカード)のGUIDを列挙し、それに対応したMac-Addressを取得するといったものです。

#include "stdafx.h"

#include <NtDDNdis.h>
#include <string>
#include <strsafe.h>
#include <IPHlpApi.h>
#pragma comment(lib, "IPHlpApi.lib")

BOOL WINAPI GetPhysicalMacAddress()
{
	IP_INTERFACE_INFO *pInterface = { 0 };
	HANDLE hDevice;
	DWORD dwLength;

	std::wstring wsBuffer;
	WCHAR szPath[MAX_PATH];
	UCHAR uch[6];
	DWORD dwIoObj = OID_802_3_CURRENT_ADDRESS;

	if (GetInterfaceInfo(pInterface, &dwLength) == ERROR_INSUFFICIENT_BUFFER)
		pInterface = (IP_INTERFACE_INFO *)malloc(dwLength);

	if (GetInterfaceInfo(pInterface, &dwLength) == NO_ERROR)
	{
		for (int i = 0; i < pInterface->NumAdapters; i++)
		{
			wsBuffer = pInterface->Adapter[i].Name;

			StringCchPrintf(szPath, MAX_PATH, TEXT("\\\\.\\%s"), wsBuffer.substr(wsBuffer.size() - 38, 38).c_str());

			hDevice = CreateFile(szPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

			if (hDevice == INVALID_HANDLE_VALUE)
				continue;

			if (!DeviceIoControl(hDevice, IOCTL_NDIS_QUERY_GLOBAL_STATS, &dwIoObj, sizeof(dwIoObj), &uch, sizeof(uch), &dwLength, NULL))
				continue;

			_tprintf(TEXT("%s - %02X:%02X:%02X:%02X:%02X:%02X\n"), 
				szPath, uch[0], uch[1], uch[2], uch[3], uch[4], uch[5]);
		}

		return TRUE;
	}

	return FALSE;
}

int main()
{
	GetPhysicalMacAddress();

	getchar();

    return 0;
}

↑の実行結果
\\.\{XXXXXXXX-AAAA-BBBB-CCCC-YYYYYYYYYYYY} - AA:BB:CC:DD:EE:FF
というようになります。興味がある方は実行してみてください。


他にも、HDDのシリアルナンバーを取得するものがありますが、かなりメジャーな手法ですので、簡単にbypass出来てしまいます。