PEB и подмена инфо о ProductType

Тема в разделе "WASM.WIN32", создана пользователем karabas_barabas, 10 апр 2011.

  1. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    Стоит задача заставить работать одну прожку под всеми виндами, т.к. работает она только под серверными виндами, под другими версиями выскакивает окно и работа прекращается.
    Но не хотелось бы юзать внедрение кода и перехват GetVersionEx , хочу решить задачу через патч PEB , но столкнулся со сложностью и сейчас думаю возможно ли так вообще решить задачу, т.к. определение винды происходит по 3 полям структуры osversionex
    Код (Text):
    1.      
    2.  if ( osvi.dwMajorVersion == 6 )
    3.       {
    4.          if( osvi.dwMinorVersion == 0 )
    5.          {
    6.             if( osvi.wProductType == VER_NT_WORKSTATION )
    7.                 StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));
    8.             else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));
    9.          }
    MajorVersion и MinorVersion легко подменить в PEB , а вот ProductType реально ли ?
    для win7 значение наиболее интересных полей следующее:
    Код (Text):
    1. peb->NtMajorVersion = 6;
    2. peb->NtMinorVersion = 1;
    3. peb->NtBuildNumber = 7601;
    4. peb->NtCSDVersion = 256;
    5. peb->PlatformId = 2;
    6. peb->Subsystem = 2;
    7. peb->MajorSubsystemVersion = 5;
    8. peb->MinorSubsystemVersion = 1;
    9. peb->AffinityMask = 3;
     
  2. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    productType берется из USER_SHARED_DATA. значения которые в пеб заполняются, скорее всего тоже оттуда, для изменения этой памяти нужен драйвер. либо для вашего случая - перехват GetVersionExW
     
  3. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    нашел таки способ обойтись без перехвата - патчем вызываемой итоговой ntdll фунцкии, способ не очень, конечно, но в рамках моей проблемы меня устраивает.
    Заметил что реальный результат берется из DWORD PTR DS:[7FFE0264] на всех виндах по одинаковому смещению , 7FFE000 это я так понимаю и есть usersharedata

    интересует почему не совпадают
    peb->NtMajorVersion = 6;
    и
    peb->MajorSubsystemVersion = 5;

    а также что означают поля
    peb->Subsytem
    peb->NtCSDVersion
    peb->AffinityMask
     
  4. determin1st

    determin1st New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2017
    Сообщения:
    8
    можно использовать appverif для подмены ProductType. например в серверной системе (windows 2008 r2) не отображается опция Сон в Пуске, а после подмены для explorer.exe она появляется. все еще некоторые программы требуют клиентской ОС для установки..

    есть ли решение этой проблемы для системы в целом?
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Код (C):
    1. BOOLEAN
    2. RtlGetNtProductType(
    3.     OUT PNT_PRODUCT_TYPE    NtProductType
    4.     )
    5.  
    6. /*++
    7.  
    8. Routine Description:
    9.  
    10.     Returns the product type of the current system.
    11.  
    12. Arguments:
    13.  
    14.     NtProductType - Returns the product type.  Either NtProductWinNt or
    15.         NtProductLanManNt.
    16.  
    17. Return Value:
    18.  
    19.     TRUE on success, FALSE on failure
    20.     The product type will be set to WinNt on failure
    21.  
    22. --*/
    23.  
    24. {
    25.  
    26.     NTSTATUS Status;
    27.     OBJECT_ATTRIBUTES ObjectAttributes;
    28.     HANDLE KeyHandle;
    29.     PKEY_VALUE_FULL_INFORMATION KeyValueInformation;
    30.     ULONG KeyValueInfoLength;
    31.     ULONG ResultLength;
    32.     UNICODE_STRING KeyPath;
    33.     UNICODE_STRING ValueName;
    34.     UNICODE_STRING Value;
    35.     UNICODE_STRING WinNtValue;
    36.     UNICODE_STRING LanmanNtValue;
    37.     UNICODE_STRING ServerNtValue;
    38.     BOOLEAN Result;
    39.  
    40.     RTL_PAGED_CODE();
    41.  
    42.     //
    43.     // if we are in gui setup mode, product type is read from the registry since
    44.     // gui setup mode is the only time product type can be changed.
    45.     // All other times, the "captured at boot" version of product type is used
    46.     //
    47.  
    48.     if ( USER_SHARED_DATA->ProductTypeIsValid ) {
    49.         *NtProductType = USER_SHARED_DATA->NtProductType;
    50.         return TRUE;
    51.         }
    52.  
    53.     //
    54.     // Prepare default value for failure case
    55.     //
    56.  
    57.     *NtProductType = NtProductWinNt;
    58.     Result = FALSE;
    59.  
    60.     RtlInitUnicodeString( &KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\ProductOptions" );
    61.     RtlInitUnicodeString( &ValueName, L"ProductType" );
    62.  
    63.     InitializeObjectAttributes( &ObjectAttributes,
    64.                                 &KeyPath,
    65.                                 OBJ_CASE_INSENSITIVE,
    66.                                 NULL,
    67.                                 NULL
    68.                               );
    69.     Status = NtOpenKey( &KeyHandle,
    70.                         MAXIMUM_ALLOWED,
    71.                         &ObjectAttributes
    72.                       );
    73.     KeyValueInformation = NULL;
    74.     if (NT_SUCCESS( Status )) {
    75.         KeyValueInfoLength = 256;
    76.         KeyValueInformation = RtlAllocateHeap( RtlProcessHeap(), 0,
    77.                                                KeyValueInfoLength
    78.                                              );
    79.         if (KeyValueInformation == NULL) {
    80.             Status = STATUS_NO_MEMORY;
    81.         } else {
    82.             Status = NtQueryValueKey( KeyHandle,
    83.                                       &ValueName,
    84.                                       KeyValueFullInformation,
    85.                                       KeyValueInformation,
    86.                                       KeyValueInfoLength,
    87.                                       &ResultLength
    88.                                     );
    89.         }
    90.     } else {
    91.         KeyHandle = NULL;
    92.     }
    93.  
    94.     if (NT_SUCCESS( Status ) && KeyValueInformation->Type == REG_SZ) {
    95.  
    96.         //
    97.         // Decide which product we are installed as
    98.         //
    99.  
    100.         Value.Buffer = (PWSTR)((PCHAR)KeyValueInformation + KeyValueInformation->DataOffset);
    101.         Value.Length = (USHORT)(KeyValueInformation->DataLength - sizeof( UNICODE_NULL ));
    102.         Value.MaximumLength = (USHORT)(KeyValueInformation->DataLength);
    103.         RtlInitUnicodeString(&WinNtValue, L"WinNt");
    104.         RtlInitUnicodeString(&LanmanNtValue, L"LanmanNt");
    105.         RtlInitUnicodeString(&ServerNtValue, L"ServerNt");
    106.  
    107.         if (RtlEqualUnicodeString(&Value, &WinNtValue, TRUE)) {
    108.             *NtProductType = NtProductWinNt;
    109.             Result = TRUE;
    110.         } else if (RtlEqualUnicodeString(&Value, &LanmanNtValue, TRUE)) {
    111.             *NtProductType = NtProductLanManNt;
    112.             Result = TRUE;
    113.         } else if (RtlEqualUnicodeString(&Value, &ServerNtValue, TRUE)) {
    114.             *NtProductType = NtProductServer;
    115.             Result = TRUE;
    116.         } else {
    117. #if DBG
    118.             DbgPrint("RtlGetNtProductType: Product type unrecognised <%wZ>\n", &Value);
    119. #endif // DBG
    120.         }
    121.     } else {
    122. #if DBG
    123.         DbgPrint("RtlGetNtProductType: %wZ\\%wZ not found or invalid type\n", &KeyPath, &ValueName );
    124. #endif // DBG
    125.     }
    126.  
    127.     //
    128.     // Clean up our resources.
    129.     //
    130.  
    131.     if (KeyValueInformation != NULL) {
    132.         RtlFreeHeap( RtlProcessHeap(), 0, KeyValueInformation );
    133.     }
    134.  
    135.     if (KeyHandle != NULL) {
    136.         NtClose( KeyHandle );
    137.     }
    138.  
    139.     //
    140.     // Return result.
    141.     //
    142.  
    143.     return(Result);
     
  6. determin1st

    determin1st New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2017
    Сообщения:
    8
    Indy,

    мне нужно подменить ProductType для любой устанавливаемой программы (exe) или установочного пакета (msi), а не получить информацию о текущем состоянии.
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    determin1st,

    Тоесть вам имени ключа не достаточно, оно автоматикой красным цветом даже выделено.

    Если это не сработает, то значит данная инфа зашита в виде константы в ядро.
     
  8. determin1st

    determin1st New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2017
    Сообщения:
    8
    Если изменить значение в реестре, то через секунду оно возвращается в первоначальное состояние. Отладка не моя специализация. в скудной документации по Application Verifier ничего особо не написано.. вот это найдено в интернете:

     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    determin1st,

    Измените и ребутнитесь. Если даже и восстанавливается значение, то верифер это юзер механизм. Тогда можно права доступа к ключу поменять, либо есчо как то отключить изменение ключа. Хотя вы правы, это нужно отлаживать. Кстате верифер просто так не запускается.
     
  10. determin1st

    determin1st New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2017
    Сообщения:
    8
    Indy_, еще раз, значение меняется, но тут же возвращается в исходное. скорее всего это сделано для защиты (финансовой) самой микрософт и тех кто с ней сотрудничает, очередная палка в колесо обычным пользователям(
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    determin1st,

    Зачем вы повторяете, я понял сразу. Используйте системный монитор что бы узнать источник изменений, у Руссиновича были и у мс тоже. Что бы избежать необходимости использовать виндебаг.
     
  12. determin1st

    determin1st New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2017
    Сообщения:
    8
    Indy_, после удаления ключа..

    [​IMG]
     
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    determin1st,

    Я не знаю, я не смотрел, но описал как это сделать. Запустите монитор и посмотрите. Система изменяется и что бы решить задачу нужна куча времени, софта. Сурки же старые - w2k, но судя по нт 10-ки(у меня открыто всегда идой) процедура неизменна.