Цель: найти и изменить UUID компьютера. Найти оказалось не проблемой. Для этого использовал CrystalDMI (http://crystalmark.info/) и physmem от Марка Руссиновича. Вот он, этот UUID: Пытаюсь изменить: Функция - переходник Код (Text): DWORD WINAPI WritePhysicalMemory(DWORD_PTR address, PBYTE buffer, DWORD count, DWORD unitSize) { HANDLE gHandle = CreateFile( _T("\\\\.\\")OLS_DRIVER_ID, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if(gHandle == INVALID_HANDLE_VALUE) { printf("INVALID_HANDLE_VALUE"); return 0; } if(buffer == NULL) { printf("buffer == NULL"); return 0; } DWORD returnedLength = 0; BOOL result = FALSE; DWORD size = 0; DWORD rCode = 0; OLS_WRITE_MEMORY_INPUT *inBuf; size = offsetof(OLS_WRITE_MEMORY_INPUT, Data) + count * unitSize; inBuf = (OLS_WRITE_MEMORY_INPUT*)malloc(size); if(sizeof(DWORD_PTR) == 4) { inBuf->Address.HighPart = 0; inBuf->Address.LowPart = (DWORD)address; } else { inBuf->Address.QuadPart = address; } inBuf->UnitSize = unitSize; inBuf->Count = count; memcpy(&inBuf->Data, buffer, count * unitSize); result = DeviceIoControl( gHandle, IOCTL_OLS_WRITE_MEMORY, inBuf, size, NULL, 0, &returnedLength, NULL ); if(result) { rCode = count * unitSize; } else { rCode = 0; } free(inBuf); return rCode; } Функция в драйвере Код (Text): NTSTATUS WriteMemory (void *lpInBuffer, ULONG nInBufferSize, void *lpOutBuffer, ULONG nOutBufferSize, ULONG *lpBytesReturned) { OLS_WRITE_MEMORY_INPUT *param; ULONG size; PHYSICAL_ADDRESS address; PVOID maped; BOOLEAN error; if(nInBufferSize < offsetof(OLS_WRITE_MEMORY_INPUT, Data)) { return STATUS_INVALID_PARAMETER; } param = (OLS_WRITE_MEMORY_INPUT *)lpInBuffer; size = param->UnitSize * param->Count; if (nInBufferSize < size + offsetof(OLS_WRITE_MEMORY_INPUT, Data)) { return STATUS_INVALID_PARAMETER; } address.QuadPart = param->Address.QuadPart; maped = MmMapIoSpace(address, size, FALSE); error = FALSE; switch(param->UnitSize){ case 1: WRITE_REGISTER_BUFFER_UCHAR(maped, (UCHAR*)¶m->Data, param->Count); break; case 2: WRITE_REGISTER_BUFFER_USHORT(maped, (USHORT*)¶m->Data, param->Count); break; case 4: WRITE_REGISTER_BUFFER_ULONG(maped, (ULONG*)¶m->Data, param->Count); break; default: error = TRUE; break; } MmUnmapIoSpace(maped, size); if(error) { return STATUS_INVALID_PARAMETER; } *lpBytesReturned = 0; return STATUS_SUCCESS; } Исходники взял отсюда http://openlibsys.org/ Передаю в качестве адреса 0x000FC3D5, ошибок не выдает, все проходит, только вот там как было так и осталось. Слышал, что такого рода данные способны к регенерации, так ли это или я вообще не так делаю?
Используется "защита от записи". Активируется это дело, по идее, ещё до начала загрузки бутсектора. Вирус в Shadow RAM.