めいくりぷとのブログ

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

ウィンドウ検出のBypass

	BOOL Detour_GetWindowThreadProcessId()
	{
		static decltype(&GetWindowThreadProcessId) _GetWindowThreadProcessId = GetWindowThreadProcessId;

		decltype(&GetWindowThreadProcessId) GetWindowThreadProcessId_Hook = [](
			_In_      HWND    hWnd,
			_Out_opt_ LPDWORD lpdwProcessId) -> DWORD
		{
			HMODULE	hModule;
			DWORD	dwStatus;
			DWORD	dwTemp;

			GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast<LPCWSTR>(_ReturnAddress()), &hModule);
			if (hModule == GetModuleHandle(TARGET_MODULE) ||
				hModule == NULL)
			{
				dwStatus = _GetWindowThreadProcessId(hWnd, &dwTemp);
				if (dwTemp != GetCurrentProcessId())
					dwTemp = GetCurrentProcessId();

				return dwStatus;
			}

			return _GetWindowThreadProcessId(hWnd, lpdwProcessId);
		};

		return DetourFunction(TRUE, reinterpret_cast<LPVOID*>(&_GetWindowThreadProcessId), GetWindowThreadProcessId_Hook);
	}