WritePhysicalMemory

Тема в разделе "WASM.NT.KERNEL", создана пользователем AnyKey, 3 фев 2010.

  1. AnyKey

    AnyKey New Member

    Публикаций:
    0
    Регистрация:
    31 янв 2010
    Сообщения:
    2
    Цель: найти и изменить UUID компьютера. Найти оказалось не проблемой. Для этого использовал CrystalDMI (http://crystalmark.info/) и physmem от Марка Руссиновича. Вот он, этот UUID:
    [​IMG]

    Пытаюсь изменить:

    Функция - переходник
    Код (Text):
    1. DWORD WINAPI WritePhysicalMemory(DWORD_PTR address, PBYTE buffer, DWORD count, DWORD unitSize)
    2. {
    3.     HANDLE gHandle = CreateFile(
    4.         _T("\\\\.\\")OLS_DRIVER_ID,
    5.         GENERIC_READ | GENERIC_WRITE,
    6.         0,
    7.         NULL,
    8.         OPEN_EXISTING,
    9.         FILE_ATTRIBUTE_NORMAL,
    10.         NULL
    11.         );
    12.  
    13.     if(gHandle == INVALID_HANDLE_VALUE)
    14.     {
    15.         printf("INVALID_HANDLE_VALUE");
    16.         return 0;
    17.     }
    18.  
    19.     if(buffer == NULL)
    20.     {
    21.         printf("buffer == NULL");
    22.         return 0;
    23.     }
    24.  
    25.     DWORD   returnedLength = 0;
    26.     BOOL    result = FALSE;
    27.     DWORD   size = 0;
    28.     DWORD   rCode = 0;
    29.     OLS_WRITE_MEMORY_INPUT *inBuf;
    30.  
    31.     size = offsetof(OLS_WRITE_MEMORY_INPUT, Data) + count * unitSize;
    32.     inBuf = (OLS_WRITE_MEMORY_INPUT*)malloc(size);
    33.     if(sizeof(DWORD_PTR) == 4)
    34.     {
    35.         inBuf->Address.HighPart = 0;
    36.         inBuf->Address.LowPart = (DWORD)address;
    37.     }
    38.     else
    39.     {
    40.         inBuf->Address.QuadPart = address;
    41.     }
    42.     inBuf->UnitSize = unitSize;
    43.     inBuf->Count = count;
    44.     memcpy(&inBuf->Data, buffer, count * unitSize);
    45.  
    46.     result = DeviceIoControl(
    47.                         gHandle,
    48.                         IOCTL_OLS_WRITE_MEMORY,
    49.                         inBuf,    
    50.                         size,
    51.                         NULL,
    52.                         0,
    53.                         &returnedLength,
    54.                         NULL
    55.                         );
    56.     if(result)
    57.     {
    58.         rCode = count * unitSize;
    59.     }
    60.     else
    61.     {
    62.         rCode = 0;
    63.     }
    64.  
    65.     free(inBuf);
    66.  
    67.     return rCode;
    68. }
    Функция в драйвере
    Код (Text):
    1. NTSTATUS WriteMemory   (void    *lpInBuffer,
    2.             ULONG   nInBufferSize,
    3.             void    *lpOutBuffer,
    4.             ULONG   nOutBufferSize,
    5.             ULONG   *lpBytesReturned)
    6. {
    7.     OLS_WRITE_MEMORY_INPUT *param;
    8.     ULONG size;
    9.     PHYSICAL_ADDRESS address;
    10.     PVOID   maped;
    11.     BOOLEAN error;
    12.  
    13.     if(nInBufferSize < offsetof(OLS_WRITE_MEMORY_INPUT, Data))
    14.     {
    15.         return STATUS_INVALID_PARAMETER;
    16.     }
    17.  
    18.     param = (OLS_WRITE_MEMORY_INPUT *)lpInBuffer;
    19.  
    20.     size = param->UnitSize * param->Count;
    21.     if (nInBufferSize < size + offsetof(OLS_WRITE_MEMORY_INPUT, Data))
    22.     {
    23.         return STATUS_INVALID_PARAMETER;
    24.     }
    25.  
    26.     address.QuadPart = param->Address.QuadPart;
    27.  
    28.     maped = MmMapIoSpace(address, size, FALSE);
    29.  
    30.     error = FALSE;
    31.     switch(param->UnitSize){
    32.         case 1:
    33.             WRITE_REGISTER_BUFFER_UCHAR(maped,
    34.                                         (UCHAR*)&param->Data, param->Count);
    35.             break;
    36.         case 2:
    37.             WRITE_REGISTER_BUFFER_USHORT(maped,
    38.                                         (USHORT*)&param->Data, param->Count);
    39.             break;
    40.         case 4:
    41.             WRITE_REGISTER_BUFFER_ULONG(maped,
    42.                                         (ULONG*)&param->Data, param->Count);
    43.             break;
    44.         default:
    45.             error = TRUE;
    46.             break;
    47.     }
    48.  
    49.     MmUnmapIoSpace(maped, size);
    50.  
    51.     if(error)
    52.     {
    53.         return STATUS_INVALID_PARAMETER;
    54.     }
    55.  
    56.     *lpBytesReturned = 0;
    57.  
    58.     return STATUS_SUCCESS;
    59. }
    Исходники взял отсюда http://openlibsys.org/

    Передаю в качестве адреса 0x000FC3D5, ошибок не выдает, все проходит, только вот там как было так и осталось.

    Слышал, что такого рода данные способны к регенерации, так ли это или я вообще не так делаю?
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Используется "защита от записи". Активируется это дело, по идее, ещё до начала загрузки бутсектора. Вирус в Shadow RAM.
     
  3. AnyKey

    AnyKey New Member

    Публикаций:
    0
    Регистрация:
    31 янв 2010
    Сообщения:
    2
    Спасибо