Blog. Just Blog

Как узнать дату установки Windows

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как узнать дату установки Windows
Как узнать дату установки Windows

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

Дата установки Windows в реестре
Дата установки Windows в реестре

Чтобы не разводить воду, сразу скажу, что дата установки Windows хранится в реестре в REG_DWORD-ключе InstallDate. Путь до этого ключа следующий:

[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
Значение ключа показывает количество секунд, прошедших с полуночи 1 января 1970 года до момента установки операционной системы. Значит вся задача сводится к получению нужного значения из реестра и приведению его в человекопонятный вид. Определяем нужные структуры и строки в сегменте данных:
  1. ; Ветка и ключ реестра
  2. reg_key    db 'SOFTWARE\Microsoft\Windows NT\CurrentVersion',0
  3. ins_key    db 'InstallDate',0
  4.  
  5. phkResult  dd ?
  6. lpdwDisp   dd ?
  7. bufferSize dd ?
  8. result     dd ?
  9.  
  10. ; Структуры для работы с датой и временем
  11. ltime      SYSTEMTIME
  12. ftime      FILETIME
Теперь, собственно, само получение значения из реестра и перевод его в SYSTEMTIME. Код для перевода TIMESTAMP был приведен в одной из предыдущих статей, здесь он немного изменен в соответствии с начальной точкой отсчета времени. Пересчет даты также учитывает временную зону, установленную в системе.
  1. ; Сегмент кода
  2.         KEY_WOW64_64KEY = 0x100
  3.         invoke  RegOpenKeyEx,HKEY_LOCAL_MACHINE,reg_key,NULL,\
  4.                 KEY_QUERY_VALUE+KEY_WOW64_64KEY,phkResult
  5.         mov     dword [bufferSize],4
  6.         mov     dword [lpdwDisp],REG_DWORD
  7.         invoke  RegQueryValueEx,[phkResult],ins_key,0,lpdwDisp,result,bufferSize
  8.         ; [result] = количество секунд, прошедших с 1970-01-01 00:00:00 UTC
  9.         invoke  RegCloseKey,[phkResult]
  10.  
  11.         ; Считаем дату от 1 января 1970 года
  12.         mov     [ltime.wYear],1970
  13.         mov     [ltime.wMonth],1
  14.         mov     [ltime.wDay],1
  15.         mov     [ltime.wHour],0
  16.         mov     [ltime.wMinute],0
  17.         mov     [ltime.wSecond],0
  18.         invoke  SystemTimeToFileTime,ltime,ftime
  19.  
  20.         ; Количество секунд
  21.         mov     eax,[result]
  22.         xor     edx,edx
  23.         mov     ecx,989680h
  24.         mul     ecx
  25.  
  26.         add     [ftime.dwLowDateTime],eax
  27.         adc     [ftime.dwHighDateTime],edx
  28.  
  29.         ; Системное время в локальное
  30.         invoke  FileTimeToLocalFileTime,ftime,ftime
  31.         ; В человекопонятное время
  32.         invoke  FileTimeToSystemTime,ftime,ltime
  33.         ; ltime = дата и время установки Windows
Конечно, никто не мешает открыть редактор реестра и изменить в нем дату установки на произвольное значение. Дополнительно можно свериться с датой создания или модификации системной папки WINDOWS, но и это значение тоже можно поменять. Так что достоверность полученной информации о дате установки системы в любом случае не является абсолютной.

В приложении пример программы с исходным текстом, которая выводит дату установки Windows. Запускать от Администратора.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Windows.Install.Date.Demo.zip (2,181 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 3259 | Комментариев: 32

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
АндрейК (25.01.2017 в 15:51):
Проверить ни у кого нет желания ?

Любопытно ведь.
ManHunter (25.01.2017 в 13:16):
Официальных данных нигде не нашел, но думаю, что именно в этот момент был создан этот ключ реестра.
АндрейК (25.01.2017 в 10:42):
Народ извините за глупый вопрос, но что *именно* происходило в секунду отображаемую "Windows Install Date" ?

Просто смотрю на дату-время директории %windir% и оно отличается на несколько минут.
brute (16.12.2016 в 12:44):
думал, что PB неправильно работает с 'FormatDate', отписал на форум разработчика. В результате узнал, что PB выдаёт результат в UTC (всемирное координационное время), а моссковское отличается от него на +3часа. Это и делается функцией 'FileTimeToLocalFileTime'
denvo (15.12.2016 в 17:09):
ЦитатаПредположу, что дело в изменении системного времени

Скорее всего в этом причина. Время изменилось с летнего на зимнее.
ManHunter (15.12.2016 в 07:43):
Предположу, что дело в изменении системного времени и/или часовых поясов на момент установки системы и на текущий момент.
brute (15.12.2016 в 06:54):
denvo, у меня программа ManHunter'а правильно показывает(как systeminfo), как и моя через Wmic.exe, а вот та, которая PB через FormatDate врёт на 3 часа.. Впрочем, надо посравнивать на разных машинах..
denvo (14.12.2016 в 21:44):
А почему время полученное через systeminfo на один час больше, чем полученное через эту программу?
ManHunter (14.12.2016 в 12:20):
Да, соглашусь, такой разнобой с датами вносит некоторую путаницу. Но после PHP это воспринимается вполне естественным, там даты тоже в TIMESTAMP.
brute (14.12.2016 в 12:10):
у меня сложности возникли с понимаем Unix timestamp(в секундах от 1970г), FILETIME (в наносекундых интервалах от 1601г), POSIX time(в миллисекундах), математическими преобразованиями, которые (если их делать "вручную") работают по-разному на х32/х64, а также с засовыванием "result" в структуру FILETIME (при переводе на PB). Сомневаюсь, что кому-то понадобится asm' вариант, а на 'си' для этого есть функция 'UnixTimeToFileTime'. На PB тоже всё получилось весьма просто: 5 строчек, exe'шник на 5,5кб:)
BufferSize=255
RegOpenKeyEx_(#HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows NT\CurrentVersion",0,#KEY_QUERY_VALUE+256,@Key)
RegQueryValueEx_(Key, "InstallDate", 0, @Type, @Buffer, @BufferSize)
RegCloseKey_(Key)
MessageBox_(0,FormatDate("%mm.%dd.%yyyy, %hh:%ii:%ss",Buffer) ,"windows_installed",0)
ManHunter (13.12.2016 в 11:17):
brute, ну а открыть MSDN на функции SystemTimeToFileTime - https://msdn.microsoft.com/en-...=vs.85).aspx и структуре FILETIME - https://msdn.microsoft.com/en-...=vs.85).aspx ?
Перевести 989680h в десятичное 10000000 - неужели и это вызывает какую-то проблему? Да и не деление там, а умножение. Секунды переводятся в наносекунды.

ЦитатаЕсли освоить парсинг вывода консольных прог, то и systeminfo и кучу других заюзать можно.

Конечно-конечно, особенно на локализованных системах, с разными форматами даты, с разными языками вывода информации, кодировкой текста в консоли и прочими радостями. Куда уж проще.
brute (12.12.2016 в 23:49):
"Код для перевода TIMESTAMP был приведен в одной из предыдущих статей.." - ну, код там может и есть, но нифига не очевидный. Зачем деление на 989680h, и дальнейшие преобразования не допёр - без пояснений проще самому заколхозить на PB. Имхо, если не проще, то очевидней заюзать с параметром hide+Read (скрыть консольное окно) "C:\Windows\System32\wbem\Wmic.exe os get installdate" - уже выдаёт готовое время во второй строке.. Если освоить парсинг вывода консольных прог, то и systeminfo и кучу других заюзать можно.
avp1965 (09.12.2016 в 17:34):
Вот, вроде - мелочь, а приятно (а, то склероз периодический... Спасибочки! (OS W10x64)
ManHunter (08.12.2016 в 13:37):
2.99 доступно
pawel97 (08.12.2016 в 13:35):
Сколько оперативы в свойствах системы? На моём старом ноуте было 2,23 доступно из 4 гб установленных, под x64 - 3,47.
ManHunter (08.12.2016 в 13:32):
Ничего не патчено. 2 гига на виртуалку, 2 гига на хост. На таком окружении даже десятка внутри вари спокойно крутится. В "Крайзис" на максималке уже не поиграешь, конечно, но отладчик и IDA работает. Проверить работоспособность софта на разных системах тоже хватает.
pawel97 (08.12.2016 в 13:19):
По-любому же какой-то костыль юзается, вроде патча ядра? http://www.geoffchappell.com/n...e/memory.htm
Я пробовал патч ядра - обязательно какой-то важный кривой драйвер не даст загрузить комп, ибо не все ведут себя адекватно при включенном патчем PAE.
А с настройками "из коробки" орать начинала хост. система, а не внутри вм.
ManHunter (08.12.2016 в 08:45):
Стоит вмваря на Win7 x86, на ней крутится десяток виртуалок от ReactOS и WinXP до Win10. Ни одна не возмутилась недостатком памяти. ЧЯДНТ?
pawel97 (08.12.2016 в 08:21):
ManHunter, а я x86 ненавижу, за то что виртуалкам VMWare невозможно дать нормальное количество памяти, винда орать начинает, что ей мало. Так можно ненавидеть и весь реверсинг, вместо того чтобы разбираться...
rar (07.12.2016 в 22:37):
Спасибо. Все работает. Windows 10x64
wetal (07.12.2016 в 10:54):
Цитатаупирается в скорость...написаных на c

Вот сейчас так сказал, как будто Си это не компилятор.
Что код на FASM, что на С не исполняются напрямую компьютером, по любому компилируются в машинный код. И хорошо оптимизированный компилятором итоговый код на С может быть быстрее криво написанного кода на ASM, многое зависит от программиста.
doz.me (06.12.2016 в 21:34):
жалко что ассемблер упирается в скорость апи-функций винды написаных на c )
ManHunter (06.12.2016 в 11:43):
Все, теперь работает и на всяких недосистемах. Исходник поправил, статью тоже, архив обновил.
ManHunter (06.12.2016 в 10:57):
А меня еще спрашивают, за что я ненавижу 64-битные системы. Вот из-за подобных закидонов и ненавижу.
Василий (06.12.2016 в 09:54):
Вон оно чё михалыч https://msdn.microsoft.com/ru-...=vs.85).aspx
Василий (06.12.2016 в 09:40):
У меня после вызова RegOpenKey выдаёт результат [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion]
и там InstallDate=0, а в [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion] InstallDate=55ce18e7
(система Win7x64)
ManHunter (06.12.2016 в 08:57):
Захардкодил значение 1440685553 в программу, все прекрасно преобразует:
http://rgho.st/private/8JJqlxx...f5830fffe90e
Так что дело все-таки в невозможности получения данных из реестра. Тут я уже ничем помочь не могу. Антивирус блокирует или еще что - хз.
zdm (06.12.2016 в 06:41):
Я тоже так подумал. И выбрал из контекстного меню "Запуск с правами администратора". Это не помогло. Ну и ладно.
ManHunter (05.12.2016 в 14:59):
Это значит, что у программы недостаточно прав для доступа к реестру.
zdm (05.12.2016 в 14:50):
Не работает. Удивительно. 1 января 1970.
Windows 7 Максимальная sp1
В реестре InstallDate=1440685553
Видимо что-то с преобразованиями.
ManHunter (05.12.2016 в 14:37):
А из приложения ты тоже будешь systeminfo запускать?
иван (05.12.2016 в 13:44):
в командной строке   systeminfo

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0047 сек.) / Память: 4.5 Mb
Наверх