HWID - что это такое, способы получения

В данной статье показано как получить некоторые HWID вашей системы и как их изменить.

HWID - что это и как с этим работают античиты.

Некоторые пользователи ошибочно считают, что HWID это идентификатор жесткого диска, однако, это не так. HWID - идентификатор любого аппаратного устройства, подключенного к вашему компьютеру. HWID идентифицирует аппаратные компоненты, которые использует система. При каждой перезагрузке, операционная система будет генерировать другой номер HWID и сравнивать его с исходным, чтобы убедиться, что операционная система по-прежнему работает на том же устройстве.

Что такое бан по HWID?

Бан по HWID - бан, который выдается по какому-либо идентификатору оборудования, подключенного к вашему компьютеру. Античиты могут собирать разную информацию: используемая ОС, сведения о процессоре, серийный номер жесткого диска, MAC-адрес и другое. Некоторые античиты хешируют серийные номера перед их отправкой на свой сервер, а другие просто отправляют их в виде обычного текста. После бана HWID заносят в “черный список”, что не позволяет продолжать игру.

Как обойти бан по HWID?

Античиты в разных играх отличаются друг от друга, именно по этой причине, как мы усвоили выше, используемый ими HWID может разный. Для обхода подобного бана необходимо использовать спуфер HWID, однако, перед его использованием стоит убедиться, подходит ли вам он вам, ведь он может менять другую информацию.

Что такое HWID-флаг?

Некоторые античиты, например, BattlEye в Rainbow Six, помечает HWID пользователя для будущей работы с ним. К примеру, если число триггеров для бана обычного пользователя равняется пяти, то в отношении к пользователю с помеченным HWID, это значение будет равняться трем.

Disk Serial Number (DSN) - серийный номер диска.

Открыв дескриптор PhysicalDriveX (где X обозначает целочисленное значение, обычно от 0 до 9), вы можете отправить следующие IOCTL для получения серийных номеров диска:

IOCTL_STORAGE_QUERY_PROPERTY и SMART_RCV_DRIVE_DATA, оба IOCTL отправляются на disk.sys

IOCTL_STORAGE_QUERY_PROPERTY принимает _STORAGE_PROPERTY_QUERY и выводит STORAGE_DEVICE_DESCRIPTOR в SystemBuffer.

SMART_RCV_DRIVE_DATA принимает SENDCMDINPARAMS и возвращает SENDCMDOUTPARAMS.

Пример того, как вы можете подделать оба из них, можно найти в Spoofing the Windows 10 HDD/diskdrive serialnumber from kernel without hooking и Windows driver for spoofing serial number of HDDs.

Другой способ получить серийные номера дисков - открыть дескриптор scsiX: (где x - номер SSD). Примечание: это сработает только для SSD:

Вы можете отправить IOCTL_SCSI_MINIPORT, который принимает и выводит SRB_IO_CONTROL (обратите внимание, что в конце массива SRB_IO_CONTROL находится SENDCMDINPARAMS/SENDCMDOUTPARAMS) с управляющим кодом IOCTL_SCSI_MINIPORT_IDENTIFY. Он выведет SRB_IO_CONTROL с прикрепленным в конце SENDCMDOUTPARAMS, который вы можете подделать следующим образом:

if (buffer_length >= sizeof SRB_IO_CONTROL) {
			SENDCMDOUTPARAMS *pOut =
				(SENDCMDOUTPARAMS *)((PUCHAR)buffer + sizeof(SRB_IO_CONTROL));
			if (pOut->cBufferSize > 0) {
				char serialNumber[64];
				unsigned short* disk_data = (unsigned short*)(pOut->bBuffer);
				ConvertToString(disk_data, 10, 19, serialNumber);
				spoof_serial(serialNumber);
				str_2_diskdata(disk_data, 10, serialNumber);
			}
		
	}
Если вы не хотите подделывать SMART Serials, вы можете отключить их.

Функция в disk.sys, которая отключает SMART:

onst char* pattern_enable_disable_smart = "48 89 5C 24 ? 48 89 74 24 ? 57 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 84 24 ? ? ? ? 48 8B 59 60 48 8B F1 40 8A FA 8B 4B 10";
 
NTSTATUS __fastcall DiskEnableDisableFailurePrediction(__int64 device_extension, char enable)
{
	//..
	
	pDriverData = *(device_extension + 0x60);     // COMMON_DEVICE_EXTENSION.DriverData typecasted to PDISK_DATA
	
	if ( *(pDriverData + 0x10) == 1 )
		return 0;
		
	if ( *(pDriverData + 0x10) != 2 )
	{
		if ( *(pDriverData + 0x10) != 3 )
			return 0xC0000010;
		return 0;
	}
	
	memset(&buffer, 0, 0x3Dui64);
	size = 0x3D;
	LOBYTE(bUnk) = 0;
	LOBYTE(buffer_) = 0;
	
	if ( enable )
	{
		bFeaturesRegister = 0xD8u;                  // ENABLE_SMART
		smart_code = 0x1B0504;                      // IOCTL_SCSI_MINIPORT_ENABLE_SMART
	} else {
		bFeaturesRegister = 0xD9u;                  // SENDCMDINPARAMS.irDriveRegs.bFeaturesReg = DISABLE_SMART;
		smart_code = 0x1B0505;                      // IOCTL_SCSI_MINIPORT_DISABLE_SMART
	}
	
	result = DiskPerformSmartCommand(device_extension, smart_code, 0xB0, bFeaturesRegister, buffer_, bUnk, &buffer, &size);
	
	if ( result >= 0 )
		*(pDriverData + 0x16) = enable;
	
	return result;
}

Другой способ получить SMART Serials - через IOCTL_ATA_PASS_THROUGH.

DSN также можно получить с помощью расширения fdo списка дисковых устройств.

Подробнее:
UNICODE_STRING disk_driver_name =
	RTL_CONSTANT_STRING(L"\\Driver\\Disk");
	PDRIVER_OBJECT disk_driver_object = nullptr;
	auto disk_status = ObReferenceObjectByName
	(
		&disk_driver_name,
		OBJ_CASE_INSENSITIVE,
		nullptr,
		0,
		*IoDriverObjectType,
		KernelMode,
		nullptr,
		reinterpret_cast<PVOID*>(&disk_driver_object)
	);
 
	ULONG DeviceObjectCount = 0;
	status = IoEnumerateDeviceObjectList(disk_driver_object, NULL, 0, &DeviceObjectCount);
 
 
	PDEVICE_OBJECT m_Devices[10];
	status = IoEnumerateDeviceObjectList(disk_driver_object, m_Devices, DeviceObjectCount * sizeof(PDEVICE_OBJECT), &DeviceObjectCount);
 
	for (int i = 0; i < DeviceObjectCount; i++)
	{
		PDEVICE_OBJECT m_Device = m_Devices[i];
 
		if (m_Device)
		{
			PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = reinterpret_cast<PFUNCTIONAL_DEVICE_EXTENSION>(m_Device->DeviceExtension);
			if (fdoExtension)
			{
				PCHAR serialNumber = (PCHAR)fdoExtension->DeviceDescriptor + fdoExtension->DeviceDescriptor->SerialNumberOffset;
			}
		}
	}

Примечания:
Некоторые не будет работать со съемными дисками.
Еще одна вещь, которую следует отметить в отношении спуферов, что некоторые из них охватывают только RaidPort0. Убедитесь, что вы не подделываете серийный номер дважды. Например, с IOCTL_STORAGE_QUERY_PROPERTY вы можете сделать это, проверив, является ли диск несъемным, посмотрев на BusType.

if (buffer->BusType != STORAGE_BUS_TYPE::BusTypeSata && buffer->BusType != STORAGE_BUS_TYPE::BusTypeNvme) // (BusTypeUsb=removable drive).
				spoof_serial(serial);

Предупреждения: серийные номера дисков также хранятся в реестре, убедитесь, что они соответствуют значениям, которые вы подменили. Убедитесь, что вы правильно подделываете серийные номера SMART, проверяя smartmontools.
Вы можете использовать следующую команду, чтобы проверить, правильно ли вы их подделали.:

smartctl -a /dev/sdX (где X - буква от a до z, обозначающая устройство)
e.g. smartctl -a /dev/sda

Еще одна проблема для SMART Serials заключается в том, что контрольная сумма будет изменена, когда вы их подмените:
Warning! Drive Identity Structure error: invalid SMART checksum.

Другая проблема заключается в том, что команды PowerShell Get-PhysicalDisk и Get-Disk вернут ваши неподдельные серийные номера. Вы можете исправить это, выполнив команду PowerShell:
Reset-PhysicalDisk *

NIC MAC-адрес.

Ваша сетевая карта имеет два типа MAC-адресов: постоянный и текущий. Текущий MAC-адрес можно легко подделать из пользовательского режима, изменив NetworkAddress для подключей в HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\XXXX, где XXXX - это 0000-9999, указывающий подключ, представляемый NIC (сетевой картой).

Вы также можете получить текущий MAC-адрес / GUID адаптера с помощью GetAdaptersInfo, GetAdaptersAddresses или через NetBIOS.

После этого, при отключении и включении устройства, будет использован новый MAC из реестра.

Постоянный MAC-адрес подделать немного сложнее. Вы можете получить его, открыв дескриптор NIC GUID (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) или по пути устройства (\ ?? \ PCI \ …), как показано на EACReversing/mac.c at master · adrianyy/EACReversing. Вы можете просто заставить его вернуть текущий MAC-адрес вместо постоянного для легкой подделки.

Почему сложнее подделать? IOCTL обычно обрабатываются пользовательским сетевым драйвером, отличным от ndis.sys. Кроме того, если у вас несколько сетевых адаптеров, таких как, например, Ethernet и Wi-Fi, ваш сетевой драйвер Ethernet не будет таким, как тот, который используется для Wi-Fi. Так что вам нужно будет подключить оба драйвера.

Конечно, вы можете отключить свой Wi-Fi адаптер в диспетчере устройств и вам нужно будет только подключить драйвер Ethernet.

Еще одна проблема, о которой я должен упомянуть, заключается в том, что GUID адаптера может использоваться для вашей идентификации.

Постоянные MAC-адреса также хранятся в ndis.sys:

0x0012001B обрабатывается nsiproxy.sys
deviceiocontrol->nsiproxy.sys(NsiEnumerateObjectsAllParametersEx)->netio.sys->“something”

0x1010101 и 0x1010102 обрабатываются ndis.sys в конце, однако иногда по какой-то причине они могут обрабатываться специальным драйвером, поэтому, не имеет значения, если он подделан в ndis.sys (кроме случаев, когда вы меняете MAC при инициализации ndis).

MAC лежат внутри атрибутов минипорта ndis.
Обратите внимание, что минипорт ndis - это глобальная переменная.

struct ndis_miniport
{
	//windows only 7-10
	char					pad1[8];					//0
	ndis_miniport			*nextminiport;				//8
	char					pad2[16];					//16
	ndis_driver				*driverhandle;				//32 
	void					*miniportadapterctx;		//40
	UNICODE_STRING			*miniport_name;				//48 "adapter name"  
    ...
 
};
 
 
    ULONG64 MiniportAddress = 0;
	
	MiniportAddress = FindPattern(ndisbase, "40 8A F0 48 8B 05");//win 7-10 
 
    if (!MiniportAddress)
		return false;
 
 
	MiniportAddress += 3;
 
	unsigned int offset = *(unsigned int*)(MiniportAddress + 3);
 
	ndis_miniport* g_pMiniport = *(ndis_miniport**)(MiniportAddress + 7 + offset);
 
	if (!IsValidKernelPtr(g_pMiniport))
		return false;

Спуфинг без подключения драйвера.

Ваш NIC MAC хранится в filter_block-> Miniport-> IfBlock, подделав его, вы можете изменить свой постоянный MAC-адрес, не подключая драйвер.
Примечание: некоторые настраиваемые драйверы могут возвращать собственный постоянный MAC-адрес. Постоянный MAC-адрес также кэшируется в других местах

SMBIOS / SYS ID.

SMBIOS содержит серийные номера материнской платы, оперативной памяти и т.д.

GetSystemFirmwareTable и IoWMIQueryAllData MSSmBios_RawSMBiosTables_GUID могут быть подделаны с помощью Kernelmode SMBIOS Hardware ID Spoofing.

Примечание:
Данные кэшируются WMI, его службой пользовательского режима, поэтому обязательно перезапустите службу WinMgmt (предупреждение: sys_id кэшируется в режиме ядра, но не SMBIOS, который читается непосредственно из физической памяти). SMBIOS также кэшируется в реестре

NVIDIA GPU UUID / Serial Number.

Запуск nvidia-smi -L (который находится в C:\Program Files\NVIDIA Corporation\NVSMI) вернет ваш GPU UUID. Пример:

C:\Users\Admin>nvidia-smi -L
GPU 0: Tesla P100-SXM2-16GB (UUID: GPU-4f91f58f-f3ea-d414-d4ce-faf587c5c4d4)

UUID возвращается непосредственно из драйвера (nvlddmkm.sys) через IOCTL 0x8DE0008 в irp->UserBuffer по смещению 0x1AC. Пример:

#define GPU_SERIAL_OFFSET 0x1AC
		if (memcmp(&buffer[GPU_SERIAL_OFFSET], "GPU-", 4) == 0) {
			spoof_serial_gpu((char*)(&buffer[GPU_SERIAL_OFFSET + 4]));
		}
		else {
			DbgPrint(xorstr_("Bad GPU Serial Offset\r\n"));
			for (ULONG i = 0; i < 0x1FF; i++)
				if (memcmp(&buffer[i], "GPU-", 4) == 0) {
					DbgPrint("gpu serial offset: %X\r\n", i);
					spoof_serial((char*)(&buffer[i + 4]));
				}
		}

ARP - роутер, ноутбуки и другое в вашей сети.

Очень ужасный способ отслеживать пользователей - использовать таблицу ARP, которая содержит ваш маршрутизатор и другие устройства в вашей сети.

Вы также можете использовать SendARP и укажите IP-адрес устройства, после чего вы получите MAC-адрес устройства. Это вызовет NtDeviceIoControlFile с IOCTL 0x12000F для nsiproxy.sys, который вернет MAC-адрес цели в irp->UserBuffer:

if (**(PULONG*)(buffer + 0x10) == 24) { //SendARP Spoof
			buffer += 0x128;
			for (int i = 0; i < 6; i++)
				buffer[i] ^= st[i % sizeof(ULONGLONG)];
		}

Проверено только на Win10, 1803 или 1809.
Я не видел никаких античитов с использованием SendARP, вместо этого они используют GetIpNetTable2.

GetIpNetTable2 вернет таблицу соседних IP-адресов на вашем компьютере, которая содержит сопоставления IP:MAC, включая ваш маршрутизатор и другие устройства в вашей сети.
Он отправит IOCTL 0x0012001B в nsiproxy, который вернет сопоставления где-нибудь в irp->UserBuffer.

Пример спуфинга:
  1. #define NSI_GET_INTERFACE_INFO 1 // this needs to be spoofed too (probably covered by (2))
  2. #define NSI_GET_IP_NET_TABLE 11
  • struct NSI_PARAMS
  1. {
  2. __int64 field_0;
  3. __int64 field_8;
  4. __int64 field_10;
  5. int Type;
  6. int field_1C;
  7. int field_20;
  8. int field_24;
  9. char field_42;
  10. __int64 AddrTable;
  11. int AddrEntrySize;
  12. int field_34;
  13. __int64 NeighborTable;
  14. int NeighborTableEntrySize;
  15. int field_44;
  16. __int64 StateTable;
  17. int StateTableEntrySize;
  18. int field_54;
  19. __int64 OwnerTable;
  20. int OwnerTableEntrySize;
  21. int field_64;
  22. int Count;
  23. int field_6C;
  24. };
  • auto nsi_params = (NSI_PARAMS*)buffer;
  1. if (nsi_params->Type == NSI_GET_IP_NET_TABLE)
  2. for (ULONG i = 0; i < nsi_params->Count; i++)
  3. auto mac = (PUCHAR)(nsi_params->NeighborTable+ i * nsi_params->NeighborTableEntrySize)

Другой способ получить MAC-адреса - IOCTL_TCP_QUERY_INFORMATION_EX to \Device \Tcp

Registry keys.

Есть много ключей, которые можно использовать для вашего отслеживания.
Я разделю их на разные части, так как некоторые из этих серийных номеров могут быть связаны с другими методами их получения (например, SMBIOS и серийные номера дисков также хранятся в реестре).

Серийный номер монитора.

Данные монитора хранятся в формате EDID, они расположены под подразделом в:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\
 
e.g. the key might look like:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\DISPLAY\Default_Monitor\4&574af1d&0&80872100&00&22\Device Parameters

Они будут расположены в значении «EDID» (REG_BINARY).
Есть также:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration
which has subkeys with unique ids and those subkeys also contain a "Timestamp" (REG_QWORD) value.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity
also has the same subkeys, but it doesn't have the timestamp value.

SMBIOS.

Копию вашей таблицы SMBIOS можно найти в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mssmbios\Data под значением “SMBiosData” (REG_BINARY).

Серийный номер диска.

Серийные номера дисков расположены под ключом HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port X\Scsi Bus X\Target Id 0\Logical Unit Id 0 в значении SerialNumber (REG_SZ).

UUID материнской платы.

HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig -> "LastConfig" value (REG_SZ)
HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig\XXX which is a subkey with the motherboard UUID
HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\Common\\ClientTelemetry -> MotherboardUUID 
HKEY_USERS\\.DEFAULT\\Software\\Microsoft\\Office\\Common\\ClientTelemetry -> MotherboardUUID
HKEY_USERS\\S-1-5-18\\Software\\Microsoft\\Office\\Common\\ClientTelemetry -> MotherboardUUID

NVIDIA UUID.

HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Global:
ClientUUID (REG_SZ)
PersistenceIdentifier (REG_SZ)
HKEY_LOCAL_MACHINE\\SOFTWARE\\NVIDIA Corporation\\Global\\CoProcManager:
ChipsetMatchID (REG_SZ)

Volume GUID.

/*
	Вы также можете увидеть все GUID тома для каждого тома, который ОС когда-либо видела, в разделе реестра:
	HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
	--
	Я вызвал DeviceIoControl(IOCTL_MOUNTDEV_QUERY_UNIQUE_ID) и получил строку, аналогичную формату пути к интерфейсу устройства, но она просто отличается от 4-х символов префикса, а затем сохранена в реестре \HKLM\SYSTEM\MountedDevices.
	*/
	SHDeleteKey(HKEY_LOCAL_MACHINE, L"SYSTEM\\MountedDevices"); //e.g.: \??\Volume{<REDACTED>}
	SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket\\Volume");
	SHDeleteValue(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket", L"LastEnum");
	SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2\\CPC\\Volume");
	SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2");
	SHDeleteKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Dfrg\\Statistics");

OfflineUniqueIDRandomSeed.

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\TPM\\ODUID -> RandomSeed (REG_BINARY)

Другое.

HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography -> MachineGuid (REG_SZ)
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001 -> HwProfileGuid (REG_SZ)
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate:
SusClientId
SusClientIdValidation
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SystemInformation:
ComputerHardwareId
ComputerHardwareIds
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Internet Explorer\\Migration:
"IE Installed Date" (REG_BINARY)
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\SQMClient:
MachineId (REG_SZ) (id that you can see when viewing "view your pc name")
WinSqmFirstSessionStartTime (REG_QWORD)
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\OneSettings\\WSD\\UpdateAgent\\QueryParameters:
deviceId (related to above)
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\OneSettings\\WSD\\Setup360\\QueryParameters:
deviceId (related to above)
 
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion:
InstallTime (REG_QWORD)
InstallDate (REG_DWORD)
BuildLab/BuildLabEx (REG_SZ, non unique but logged by ACs)
DigitalProductId
DigitalProductId4
 
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}\\0001:
NetworkInterfaceInstallTimestamp (REG_QWORD)
 
SHDeleteKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Diagnostics\\DiagTrack\\SettingsRequests"); //telemetry.ASM-WindowsDefault, etc contain windows hardware id in "ETagQueryParameters", "ETag" may also contain unique value?
 
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack\SevilleEventlogManager "LastEventlogWrittenTime"
 
HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows Activation Technologies\\AdminObject\\Store:
MachineId (REG_SZ, very important as logged by ACs)
 
HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SoftwareProtectionPlatform\\Activation", L"ProductActivationTime"
 
SHDeleteValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SoftwareProtectionPlatform", L"BackupProductKeyDefault"); //<REDACTED>
	SHDeleteValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SoftwareProtectionPlatform", L"actionlist");
	SHDeleteValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SoftwareProtectionPlatform", L"ServiceSessionId");
 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist:
used by anti-cheats, not sure how.

Неуникальные:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}\\0000 -> DriverDesc(REG_SZ) for gpu
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}\\0001:
DriverDesc (REG_SZ) -> for network adapter name
 
SHDeleteKey(HKEY_CURRENT_USER, xorstr_(L"Software\\Hex-Rays\\IDA\\History"));
	SHDeleteKey(HKEY_CURRENT_USER, xorstr_(L"Software\\Hex-Rays\\IDA\\History64"));
 
clean up your ida history^

Дополнительные уникальные серийники из реестра.

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Win32kWPP\Parameters ->  WppRecorder_TraceGuid
(Credits: Object9999)
 
HKEY_LOCAL_MACHINE\HARDWARE\UEFI\ESRT\<RANDOM_KEY_UUID> 
 
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\VIDEO:
\Device\Video0
\Device\Video1
\Device\Video2
\Device\Video3
\Device\Video4
(contains value with unique id)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video
the 2 subkeys which match the values stored in the keys above.

UUID файловой системы.

Примечание: если у вас только один диск, и вы переформатируете его после каждого бана, вам, вероятно, не придется беспокоиться ни о чем из следующего.

Если у вас несколько дисков, которые вы не часто форматируете, вы можете заметить, что существуют уникальные идентификаторы, которые могут использоваться для вашей идентификации.

Volume GUIDs:

Enumerating Volume GUID Paths - Win32 apps | Microsoft Docs

Они отправляются на устройство, расположенное в MOUNTMGR_DEVICE_NAME
IOCTL_MOUNTMGR_QUERY_POINTS/IOCTL_MOUNTDEV_QUERY_UNIQUE_ID оба возвращают структуру MOUNTDEV_UNIQUE_ID в SystemBuffer. Вам нужно будет подделать:
MOUNTDEV_UNIQUE_ID::UniqueId

Если я правильно помню, уникальный идентификатор диска извлекается:
IOCTL_DISK_GET_PARTITION_INFO_EX/IOCTL_DISK_GET_DRIVE_LAYOUT_EX
который обрабатывается PartmgrControl (также обрабатывается FLTMGR на более высоком уровне).

for IOCTL_DISK_GET_PARTITION_INFO_EX you check if PARTITION_INFORMATION_EX::PartitionStyle == PARTITION_STYLE_GPT
and if so you spoof PARTITION_INFORMATION_EX::Gpt.PartitionId.

for IOCTL_DISK_GET_DRIVE_LAYOUT_EX you do pretty much the same as above, except for each partition.

Это будет подделывать uniqueid | Microsoft Docs

DISKPART> list disk
 
  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          465 GB      0 B        *
  Disk 1    Online          465 GB  1024 KB        *
  Disk 2    Online          953 GB      0 B        *
  Disk 3    Online         3725 GB      0 B        *
 
DISKPART> select disk 0
 
Disk 0 is now the selected disk.
 
DISKPART> uniqueid disk
 
Disk ID: {SERIAL}
 
DISKPART>

Уникальный идентификатор поддельного диска не будет отображаться до тех пор, пока вы не отправите IOCTL_DISK_UPDATE_PROPERTIES на диск.

Вы можете подделать уникальный идентификатор диска из пользовательского режима с помощью IOCTL_DISK_SET_PARTITION_INFO_EX, но вы никогда не должны делать это для диска, на котором установлена ОС или основная загрузочная запись.

Volume SN.

vol c:
 Volume in drive C is LABEL
 Volume Serial Number is XXXX-XXXX

Его можно получить с помощью GetVolumeInformation, я не могу вспомнить точный IOTCL (он начинался с FSCTL_XXX), но вы можете легко подделать его из пользовательского режима, выполнив следующее.

EFI UUID.

Вы можете вызвать ZwQuerySystemEnvironmentValueEx для регистрации переменной OfflineUniqueIDRandomSeed. Однако, существует раздел реестра, который содержит случайное начальное значение OfflineUniqueIDRandomSeed.

Способ получения этой переменной может отличаться в вашей системе:

2-3 different devices it can send an ioctl to, ioctl codes:
0x568004 ioctl w/ IRP_MJ_DEVICE_CONTROL
 
0x520004 ioctl w/ IRP_MJ_INTERNAL_DEVICE_CONTROL
 
or it can call HalGetEnvironmentVariableEx which is what my system uses

Монитор и его серийный номер.

Вы можете получить серийный номер с помощью I2C или через ключ реестра, это описано в Registry keys.

Кэшированные серийные номера USB.

Если воспользоваться USBDeview, то можно заметить, что некоторые USB устройства имеют свои серийные номера. Коврики для мыши с RGB-подсветкой, флешки, наушники - все это может иметь уникальный серийный номер.

Даже когда вы извлекаете флэш-накопитель, его серийный номер будет кэшироваться в реестре для использования с SetupAPI (например, через SetupDiGetClassDevs GUID_DEVINTERFACE_DISK и любое USB-устройство с флагом CM_DEVCAP_UNIQUEID).

Я не уверен, как вы можете запросить их серийный номер в обычном режиме, но они кэшируются в реестре.

У меня также были проблемы с подделкой серийных номеров, когда устройство все еще подключено, но я не углублялся в это, так как вы можете просто удалить устройство и очистить реестр.

Время создания/изменения файлов.

Некоторые античиты собирают информацию о времени создания или изменения нескольких системных файлов и файлов игры. Вы можете просто использовать SetFileTime для подмены времени.

Примечание:
Системные файлы принадлежат TrustedInstaller, вы должны стать временным владельцем и установить права для своей учетной записи, подделать время файла, а затем восстановить.

Файлы с серийными номерами.

C:\Windows\System32\restore\MachineGuid.txt содержит UUID, который используется античитами.
X:$Recycle.Bin может содержать папки с SID учетных записей.

%windir%\INF\setupapi.dev.log - may contain usb serials.
%windir%\INF\setupapi.setup.log - also may contain usb serials.

Системные копии.

Я заметил, что системные копии могут содержать уникальные идентификаторы, чтобы удалить их, вы можете просто запустить команду:
vssadmin delete shadows /All
Я не думаю, что какой-либо AC использует их. Имейте в виду, что вы удаляете точки восстановления своей системы.

Universal Plug and Play (UPnP) / SSDP.

Если на вашем маршрутизаторе включен UPnP, он может отображать серийный номер и уникальный идентификатор:


Просто отключите UPnP в своем маршрутизаторе, чтобы этого не произошло. Другие устройства, поддерживающие UPnP, также могут потребовать проверки.

Еще один способ - использовать SSDP согласно draft-cai-ssdp-v1-03:
Подробнее…

Античит может сделать запрос SSDP и зарегистрировать USN в вашей сети.

Загрузочный UUID / bcdedit UUIDs.

Если вы запустите bcdedit от имени администратора, вы заметите, что в следующих полях есть уникальные идентификаторы:
identifier.
resumeobject.
displayorder (только для менеджера загрузки, содержит все идентификаторы загрузчиков).
Ваш загрузочный UUID в настоящее время извлекается античитами с помощью ZwQuerySystemInformation SystemBootEnvironmentInformation(0x5a).

Пример.
void get_boot_uuid()
{
	
	NTSTATUS status = STATUS_SUCCESS;
	ULONG neededSize = 0;
 
	neededSize = 8 * 1024 * 1024;
 
	PSYSTEM_BOOT_ENVIRONMENT_INFORMATION pBootInfo;
 
	if (pBootInfo = (decltype(pBootInfo))ExAllocatePoolWithTag(NonPagedPool, neededSize, POOL_TAG)) {
 
		NTSTATUS r;
		if (NT_SUCCESS(r = ZwQuerySystemInformation(SystemBootEnvironmentInformation, pBootInfo, neededSize, 0))) {
			DbgPrint("boot GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X\n", pBootInfo->BootIdentifier.Data1, pBootInfo->BootIdentifier.Data2, pBootInfo->BootIdentifier.Data3, pBootInfo->BootIdentifier.Data4[0], pBootInfo->BootIdentifier.Data4[1], pBootInfo->BootIdentifier.Data4[2], pBootInfo->BootIdentifier.Data4[3], pBootInfo->BootIdentifier.Data4[4], pBootInfo->BootIdentifier.Data4[5], pBootInfo->BootIdentifier.Data4[6], pBootInfo->BootIdentifier.Data4[7]);
			ExFreePoolWithTag(pBootInfo, POOL_TAG);
		}
		else
			DbgPrint("r = %x\n", r);
	}
}

Идентификатор журнала USN.

Я обнаружил, что один античит использует идентификатор журнала USN в качестве механизма HWID. Это делается путем отправки IOTCL FSCTL_QUERY_USN_JOURNAL to \\.\X: где X - буква диска. Вы можете получить структуру USN_JOURNAL_DATA, которая содержит DWORDLONG UsnJournalID;
Вы можете принудительно установить новый идентификатор журнала, выполнив:

		system("fsutil usn deletejournal /n c:");
		system("fsutil usn deletejournal /n D:");
		system("fsutil usn deletejournal /n E:");
		system("fsutil usn deletejournal /n F:");

Прочее.

Steam UserData содержит ваш Steam id64 в некоторых файлах, которые могут быть использованы для вашей идентификации, некоторые AC используют это.

Windows SIDs и ваш IP-адрес также могут использоваться для отслеживания.

Некоторые античиты могут также создавать отслеживаемые файлы/ключи/системные переменные в вашей системе, которые будут содержать уникальный идентификатор.

Некоторые античиты запрашивают данные WMI из режима ядра с помощью IoWMIQueryAllData.
MoveFile(L"C:\\Windows\\System32\\spp\\store", L"C:\\Windows\\System32\\spp\\storex"); //disable slmgr /dlv (and the WMI path for it), CMID

Другое, отслеживаемое античитами:

GPU name
processor name
disk names
network adapter names
processor features(ntoskrnl!ExIsProcessorFeaturePresent reads from 0x0FFFFF78000000274ull which anti-cheats also do)
bios vendor release #
bios vendor name
Примечание

Приветствую. Статья переведена и дополнена мной с англоязычного форума и будет обновляться/дополняться в процессе появления новой информации. Если вы найдете здесь ошибки или захотите дополнить статью, пожалуйста, воспользуйтесь личными сообщениями на форуме и проинформируйте меня.

1 Like

А вот я написал программу. меняет абсолютно все
СМЕНА HWID это я Специально писал программу. меняет все что надо При запросе скину скрин. я сам программист. по цене договоримся. @VisualSCPP
сразу скажу это не реклама мог бы выложить. для каждой игры допилю.