как программно остановить системное время в XP?

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 14 ноя 2004.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Вот собственно и мой вопрос?

    Смею предположить, что нет api-функции для этого?
     
  2. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    В цикле юзать SetSystemTime :), хотя это не способ... А так действительно не видел апишек точно
     
  3. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    А что если перехватывать GetSystemTime и возвращать нужное значение?
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Написать драйвер подсмотрев как это делает SoftIce :derisive:
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Возможно можно заюзать ZwSetSystemInformation с классом SystemTimeAdjustment, установив отрицательные значение (хотя вряд ли это возможно), но в два раза быстрее, наверное, можно сделать чтоб тикало :)



    Вот ещё по теме. Может кому пригодится... Что-то форум в 2010 году меня не признает. Пришлось назад вернуться ;)




    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    6. ;                                  I N C L U D E   F I L E S                                        
    7. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    8.  
    9. include \masm32\include\kernel32.inc
    10. include \masm32\include\user32.inc
    11. include \masm32\include\w2k\ntdll.inc
    12. include \masm32\include\w2k\ntddk.inc
    13. include \masm32\include\w2k\ntstatus.inc
    14.  
    15. includelib \masm32\lib\kernel32.lib
    16. includelib \masm32\lib\user32.lib
    17. includelib \masm32\lib\w2k\ntdll.lib
    18.  
    19. include \masm32\macros\Strings.mac
    20.  
    21. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    22. ;                                    E Q U A T E S                                                  
    23. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    24.  
    25. MB_OK           equ 0
    26. MB_YESNO        equ 4
    27. IDYES           equ 6
    28. MB_DEFBUTTON2   equ 100h
    29.  
    30. SystemTimePrivilege     equ 12
    31.  
    32. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    33. ;                                       C O D E                                                    
    34. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    35.  
    36. .code
    37.  
    38. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    39. ;                                         start                                                    
    40. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    41.  
    42. start proc
    43.  
    44. local liSystemTime:LARGE_INTEGER
    45. local liLocalTime:LARGE_INTEGER
    46. local tf:TIME_FIELDS
    47.  
    48. local buffer[512]:CHAR
    49.  
    50.     push ecx
    51.     invoke RtlAdjustPrivilege, SystemTimePrivilege, \
    52.                                 TRUE, \                 ; Enable
    53.                                 FALSE, \                ; Use client's token
    54.                                 esp                     ; WasEnabled
    55.     pop ecx
    56.  
    57.     ; Get time
    58.  
    59.     invoke ZwQuerySystemTime, addr liSystemTime
    60.     invoke RtlSystemTimeToLocalTime, addr liSystemTime, addr liLocalTime
    61.     invoke RtlTimeToTimeFields, addr liLocalTime, addr tf
    62.  
    63.     CTA "Year:\t\t%d\n", g_szFmt
    64.     CTA "Month:\t\t%d\n"
    65.     CTA "Day:\t\t%d\n"
    66.     CTA "Hour:\t\t%d\n"
    67.     CTA "Minute:\t\t%d\n"
    68.     CTA "Second:\t\t%d\n"
    69.     CTA "Milliseconds:\t%d\n"
    70.     CTA "Weekday:\t%d\n\n"
    71.     CTA0 "Would you like to change it to 01 Januar 2010?"
    72.  
    73.     xor eax, eax
    74.     mov ax, tf.Weekday
    75.     push eax
    76.     mov ax, tf.Milliseconds
    77.     push eax
    78.     mov ax, tf.Second
    79.     push eax
    80.     mov ax, tf.Minute
    81.     push eax
    82.     mov ax, tf.Hour
    83.     push eax
    84.     mov ax, tf.Day
    85.     push eax
    86.     mov ax, tf.Month
    87.     push eax
    88.     mov ax, tf.Year
    89.     push eax
    90.  
    91.     lea eax, g_szFmt
    92.     push eax
    93.    
    94.     lea eax, buffer
    95.     push eax
    96.  
    97.     call wsprintf
    98.    
    99.     add esp, 10 * sizeof DWORD
    100.  
    101.     invoke MessageBox, NULL, addr buffer, $CTA0("Your current time"), MB_YESNO + MB_DEFBUTTON2
    102.    
    103.     .if eax == IDYES
    104.                    
    105.         ; Set time
    106.  
    107.         mov tf.Year, 2010
    108.         mov tf.Month, 01
    109.         mov tf.Day, 01
    110.         mov tf.Hour, 00
    111.         mov tf.Minute, 00
    112.         mov tf.Second, 00
    113.         mov tf.Milliseconds, 000
    114.         ; tf.Weekday ignored
    115.  
    116.         invoke RtlTimeFieldsToTime, addr tf, addr liLocalTime
    117.         invoke RtlLocalTimeToSystemTime,  addr liLocalTime, addr liSystemTime
    118.         invoke ZwSetSystemTime, addr liSystemTime, NULL
    119.        
    120.         invoke MessageBox, NULL, $CTA0("Happy New Year ;\}"), $CTA0("Time changed"), MB_OK
    121.            
    122.     .endif
    123.  
    124.     invoke ExitProcess, 0
    125.     ret
    126.  
    127. start endp
    128.  
    129. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    130. ;                                                                                                  
    131. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    132.  
    133. end start




    [​IMG] 1876123355__ZwSetSystemTime.rar
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ну что? Так никто и не попробовал со временем поиграться? А я вот попробовал - работает :) Единственно, недопёр я с полем TimeSynchronization. Когда изначально Query делаешь, оно равно TRUE. Когда делаешь Set, то он делается только если TimeSynchronization установить в FALSE. Но потом его назад уже не вернуть. Вобщем, надоело играться. Пример заcтавляет часики тикать в 4 раза быстрее. Замедлить тоже можно. Как говорится: "Use it at your own risk!".


    Код (Text):
    1.  
    2. .386
    3. .model flat, stdcall
    4. option casemap:none
    5.  
    6. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    7. ;                                  I N C L U D E   F I L E S                                        
    8. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    9.  
    10. include \masm32\include\kernel32.inc
    11. include \masm32\include\user32.inc
    12. include \masm32\include\w2k\ntdll.inc
    13. include \masm32\include\w2k\ntddk.inc
    14. include \masm32\include\w2k\ntstatus.inc
    15.  
    16. includelib \masm32\lib\kernel32.lib
    17. includelib \masm32\lib\user32.lib
    18. includelib \masm32\lib\w2k\ntdll.lib
    19.  
    20. include \masm32\Macros\Strings.mac
    21.  
    22. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    23. ;                                    E Q U A T E S                                                  
    24. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    25.  
    26. MB_OK           equ 0
    27. MB_YESNO        equ 4
    28. IDYES           equ 6
    29. MB_DEFBUTTON2   equ 100h
    30.  
    31. SystemTimeAdjustment    equ 28
    32.  
    33. SYSTEM_QUERY_TIME_ADJUSTMENT STRUCT     ; Information Class 28
    34.     TimeAdjustment      DWORD   ?
    35.     MaximumIncrement    DWORD   ?
    36.     TimeSynchronization BOOLEAN ?
    37.                         db 3 dup(?)     ; padding
    38. SYSTEM_QUERY_TIME_ADJUSTMENT ENDS
    39. PSYSTEM_QUERY_TIME_ADJUSTMENT typedef ptr SYSTEM_QUERY_TIME_ADJUSTMENT
    40.  
    41. SYSTEM_SET_TIME_ADJUSTMENT STRUCT       ; Information Class 28
    42.     TimeAdjustment      DWORD   ?
    43.     TimeSynchronization BOOLEAN ?
    44.                         db 3 dup(?)     ; padding
    45. SYSTEM_SET_TIME_ADJUSTMENT ENDS
    46. PSYSTEM_SET_TIME_ADJUSTMENT typedef ptr SYSTEM_SET_TIME_ADJUSTMENT
    47.  
    48. SystemTimePrivilege     equ 12
    49.  
    50. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    51. ;                                       C O D E                                                    
    52. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    53.  
    54. .code
    55.  
    56. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    57. ;                                         start                                                    
    58. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    59.  
    60. start proc uses esi edi ebx
    61.  
    62. local sqta:SYSTEM_QUERY_TIME_ADJUSTMENT
    63. local ssta:SYSTEM_SET_TIME_ADJUSTMENT
    64.  
    65.     invoke ZwQuerySystemInformation, SystemTimeAdjustment, \
    66.                                             addr sqta, sizeof SYSTEM_QUERY_TIME_ADJUSTMENT, NULL
    67.  
    68.     .if eax == STATUS_SUCCESS;  &&  sqta.TimeSynchronization != FALSE
    69.  
    70.         CTA "Would you like to adjust the time to move faster 4 times?\n\n", g_szMessage
    71.         CTA0 "It will be reverted back after this application exits."
    72.                    
    73.         invoke MessageBox, NULL, addr g_szMessage, \
    74.                     $CTA0("Time adjustment confirmation"), MB_YESNO + MB_DEFBUTTON2
    75.    
    76.         .if eax == IDYES
    77.  
    78.             push ecx
    79.             invoke RtlAdjustPrivilege, SystemTimePrivilege, \
    80.                                         TRUE, \                 ; Enable
    81.                                         FALSE, \                ; Use client's token
    82.                                         esp                     ; WasEnabled
    83.             pop ecx
    84.  
    85.             mov eax, sqta.TimeAdjustment
    86.             shl eax, 2
    87.             mov ssta.TimeAdjustment, eax
    88.  
    89.             mov ssta.TimeSynchronization, FALSE
    90.  
    91.             invoke ZwSetSystemInformation, SystemTimeAdjustment, \
    92.                                                     addr ssta, sizeof SYSTEM_SET_TIME_ADJUSTMENT
    93.  
    94.             .if eax == STATUS_SUCCESS
    95.            
    96.                 invoke MessageBox, NULL, \
    97.                         $CTA0("Now you are living faster 4 times?\n\nPress OK to revert back."), \
    98.                         $CTA0("Time adjustment changed"), MB_OK
    99.  
    100.                 ; Revert all back
    101.  
    102.                 mov eax, sqta.TimeAdjustment
    103.                 mov ssta.TimeAdjustment, eax
    104.  
    105.                 mov ssta.TimeSynchronization, FALSE
    106.  
    107.                 invoke ZwSetSystemInformation, SystemTimeAdjustment, \
    108.                                                     addr ssta, sizeof SYSTEM_SET_TIME_ADJUSTMENT
    109.                
    110.             .else
    111.  
    112.                 invoke MessageBox, NULL, $CTA0("Sorry, time adjustment failed."), NULL, MB_OK          
    113.            
    114.             .endif
    115.            
    116.         .endif
    117.  
    118.     .endif
    119.  
    120.     invoke ExitProcess, 0
    121.     ret
    122.  
    123. start endp
    124.  
    125. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    126. ;                                                                                                  
    127. ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
    128.  
    129. end start
    130.  




    [​IMG] 782614906__SystemTimeAdjustment.rar
     
  7. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Если достаточно остановить время внутри одного процесса - то

    1. пропатчить нахрен ядро прямо в памяти

    или

    2. найти прогу "Hall of the Mountain king" - она сама время остановит, где попросишь
     
  8. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    найти код, который порты 70h и 71h юзает, да и порезать его, как то я задавался таким вопросом уже давно, нашёл это дело в ядре, резал. Всё было как надо. Ну, правда метод туповат.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Тут неожиданно возник смежный вопрос..

    Откуда функция GetTickCount берет инфу, по ходу видно что из какой-то ячейки памяти с атрибутом READONLY, что это за структура, и можно ли как-то повлиять на нее из юзера,

    т.е. нужно чтоб GetTickCount возвращала либо одно и то же либо то что нужно.
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Из "последней" страницы юзер памяти процесса (на w2ksp4 например 0x7FFE0000), видимо она динамически проецируется из памяти ядра, к тому же постоянно изменяется ядром, и записать в неё скорее неполучится, там кстати таких страниц несколько, когда-то мы говорили, что в одной из них спроецированы "все окна", которые были созданы с момента загрузки ОС
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    GetLocalTime тоже оттуда берет, можно его результат подменять плагином для лоадера Rustem'а , или ты это для своего плагина ?
     
  12. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Asterix

    т.е. нужно чтоб GetTickCount возвращала либо одно и то же либо то что нужно.



    Я такое делал - опять же для одного процесса. Дизассемблировал, потом GetProcAddress и пропатчил ядро нахрен в памяти.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _KeTickCount. Это переменная из ядра.





    Она обновляется вызовом KeUpdateSystemTime.
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    CyberManiac



    Т.е. ты предлагаешь поставить хук на GetTickCount и вернуть то что мне нужно, или пропатчить саму эту API, но она ведь может даже не использоваться в явном виде, например протектор скопирует ее код куда-нибудь в выделенную память и выполнит :-(



    Скоро протекторы начнут сбрасывать мои хуки нахрен :derisive:



    А драйвер здесь может помочь?



    bogrus

    > или ты это для своего плагина ?



    Да :derisive:
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Кое что нашёл:
    Код (Text):
    1. ZwGetTickCount retrieves the number of milliseconds that have elapsed since the system
    2. booted.
    3.   NTSYSAPI
    4.   ULONG
    5.   NTAPI
    6.   ZwGetTickCount(
    7.       VOID
    8.       );
    9. [b]Parameters[/b]
    10.   None.
    11. [b]Return Value[/b]
    12.   Returns the number of milliseconds that have elapsed since the system was booted.
    13. [b]Related Win32 Functions[/b]
    14.   None.
    15. [b]Remarks[/b]
    16.   GetTickCount reads from the KUSER_SHARED_DATA page.This page is mapped read-only
    17.   into the user mode range of the virtual address and read-write in the kernel range.
    18.   The system clock tick updates the system tick count, which is stored in this page
    19.   directly. Reading the tick count from this page is faster than calling
    20.   ZwGetTickCount. The KUSER_SHARED_DATA structure is defined in the Windows 2000
    21.   versions of ntddk.h.
     
  16. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Сам себя цитирую ;)



    Драйверы режима ядра. Часть 9 : Базовая техника: Работа с памятью. Разделяемая память



    "Т.о. раз в секунду драйвер помещает на разделяемую страницу текущее время, обращаясь при этом по виртуальному адресу в системном адресном пространстве, а программа управления, также раз в секунду, забирает эту информацию, обращаясь при этом по виртуальному адресу в пользовательском адресном пространстве. Но физически разделяется одна страница памяти. Т.о. часы "тикают" каждую секунду. Кстати, функция KeQuerySystemTime получает текущее время также обращаясь к разделяемой между ядром и режимом пользователя странице, которая в режиме ядра спроецирована по адресу 0FFDF0000h, а в режиме пользователя по адресу 7FFE0000h (пользовательская функция GetSystemTime читает те же самые байты что и функция ядра KeQuerySystemTime) и описывается структурой KUSER_SHARED_DATA (см. ntddk.inc). Даже по названию этой структуры видно, что она разделяется ядром и режимом пользователя."


    Код (Text):
    1. ;
    2. ; Define data shared between kernel and user mode.
    3. ;
    4. ; N.B. User mode has read only access to this data
    5. ;
    6.  
    7. KUSER_SHARED_DATA STRUCT                                        ; sizeof = 02D8h
    8.  
    9.     ; Current low 32-bit of tick count and tick count multiplier.
    10.     ;
    11.     ; N.B. The tick count is updated each time the clock ticks.
    12.  
    13.     TickCountLow                    DWORD           ?           ; 0000h
    14.     TickCountMultiplier             DWORD           ?           ; 0004h
    15.  
    16.     . . .
    17.  
    18. KUSER_SHARED_DATA ENDS
    19. PKUSER_SHARED_DATA typedef ptr KUSER_SHARED_DATA
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Four-F



    Это прочитал, и сам тутор прочитал, вот только не понял что делать чтоб справиться с ситуацией %)
     
  18. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Asterix

    Т.е. ты предлагаешь поставить хук на GetTickCount



    Хук нужен только чтобы засунуть свою DLL в чужое адресное пространство. Можно и через CreateRemoteThread, но я ее не люблю :) А переходники патчить - это не то, о чем я всю жизнь мечтал.



    Asterix

    или пропатчить саму эту API



    Именно.



    Asterix

    но она ведь может даже не использоваться в явном виде, например протектор скопирует ее код куда-нибудь в выделенную память и выполнит :-(



    Они сволочи, они могут :-( Скопировать - это еще полбеды: можно засунуть свой код в ядро раньше, чем они это сделают, а вот воспроизвести "на пальцах" код GetTickCount (это сработает, я сам проверял) - это уже хуже. С другой стороны, пусть тебя согревает мысль, что НИКТО не знает, прокатит ли такой фокус в Longhorn'е (а что - встанут с левой ноги да и подвинут адрес соответствующей ячейки на пару байтиков), а потому авторы защит не рискнут использовать заведомо ненадежный код.



    Asterix

    Скоро протекторы начнут сбрасывать мои хуки нахрен :derisive:



    С моими изделиями тоже плохо обращаются - то окно убьют почем зря, то по ключам из реестра в "хакерский софт" определят, то к Касперу в вирлист внесут. Но ты поверь - это совсем не больно :)



    Asterix

    А драйвер здесь может помочь?



    Драйвер - вещь хорошая. С ним можно что угодно куда угодно писать. Но изготовить подходящий драйвер будет заметно сложнее - тебе наверное нужно только один процесс обмануть, а не всю систему стоящим таймером заглючить?
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    CyberManiac

    <font color="blue]></font><!--color--> Хук нужен только чтобы засунуть свою DLL в чужое адресное пространство.



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



    <font color="blue]></font><!--color--> можно засунуть свой код в ядро раньше, чем они это сделают



    Ну возьмут код этой API из другого процесса, где он не испорчен..



    <font color="blue]></font><!--color--> а потому авторы защит не рискнут использовать заведомо ненадежный код.



    Это вполне надежно, к сожалению :-(



    <font color="blue]></font><!--color--> тебе наверное нужно только один процесс обмануть, а не всю систему стоящим таймером заглючить?



    Для одного, но наиболее надёжным способом :derisive:
     
  20. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Asterix

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



    Теперь понял, про какой хук речь. Я сначала думал, что про тот, который на сообщения ставят.



    Asterix

    Ну возьмут код этой API из другого процесса, где он не испорчен..



    Так из чужого процесса можно хоть черта лысого достать. Например, ту же переменную, где тики щелкают. И мы плавно приходим к идеям

    1. Патчить ядро на винте (я знаю, что это - гнусный изврат)

    2. Написать драйвер и изнасиловать соответствующую DLL в рамках всей системы (что после этого случится - одному Гейтсу известно)

    3. Изуродовать не только GetTickCount, но вообще все функции, которые могут хоть как-то вылезти за пределы процесса



    После чего порадоваться успешному залому всех конечностей 20-баксовой утилите и подать объявление в газету "Избавлю от мух, клопов, тараканов при помощи термоядерной бомбы".



    Asterix

    Это вполне надежно, к сожалению :-(



    Мне так не кажется. MS на неизменность потрохов своих изделий гарантийный талон не выдает, так что могут и поменять, если у них будет повод.



    Asterix

    Для одного, но наиболее надёжным способом :derisive:



    Надежный способ там только один: использовать свое собственное ядро. Если ReactOS доведут до кондиции, оно у нас будет. Главное, чтобы всякие недоумники защит от запуска под не-MS Windows не понаставили, а то их ведь ломать придется :)