Как узнать дату установки Windows
Как узнать дату установки Windows
Сегодня я расскажу, как можно узнать дату установки Windows. Я не могу оценить степень полезности этой информации, скорее всего, она находится где-то на уровне спортивного интереса. Ну или если вы задумались, например, не пора ли переустановить систему. В качестве инструмента для решения этой задачи будет использоваться Ассемблер.
Дата установки Windows в реестре
Чтобы не разводить воду, сразу скажу, что дата установки Windows хранится в реестре в REG_DWORD-ключе InstallDate. Путь до этого ключа следующий:
[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
Значение ключа показывает количество секунд, прошедших с полуночи 1 января 1970 года до момента установки операционной системы. Значит вся задача сводится к получению нужного значения из реестра и приведению его в человекопонятный вид. Определяем нужные структуры и строки в сегменте данных:
Code (Assembler) : Убрать нумерацию
- ; Ветка и ключ реестра
- reg_key db 'SOFTWARE\Microsoft\Windows NT\CurrentVersion',0
- ins_key db 'InstallDate',0
- phkResult dd ?
- lpdwDisp dd ?
- bufferSize dd ?
- result dd ?
- ; Структуры для работы с датой и временем
- ltime SYSTEMTIME
- ftime FILETIME
Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- KEY_WOW64_64KEY = 0x100
- invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,reg_key,NULL,\
- KEY_QUERY_VALUE+KEY_WOW64_64KEY,phkResult
- mov dword [bufferSize],4
- mov dword [lpdwDisp],REG_DWORD
- invoke RegQueryValueEx,[phkResult],ins_key,0,lpdwDisp,result,bufferSize
- ; [result] = количество секунд, прошедших с 1970-01-01 00:00:00 UTC
- invoke RegCloseKey,[phkResult]
- ; Считаем дату от 1 января 1970 года
- mov [ltime.wYear],1970
- mov [ltime.wMonth],1
- mov [ltime.wDay],1
- mov [ltime.wHour],0
- mov [ltime.wMinute],0
- mov [ltime.wSecond],0
- invoke SystemTimeToFileTime,ltime,ftime
- ; Количество секунд
- mov eax,[result]
- xor edx,edx
- mov ecx,989680h
- mul ecx
- add [ftime.dwLowDateTime],eax
- adc [ftime.dwHighDateTime],edx
- ; Системное время в локальное
- invoke FileTimeToLocalFileTime,ftime,ftime
- ; В человекопонятное время
- invoke FileTimeToSystemTime,ftime,ltime
- ; ltime = дата и время установки Windows
В приложении пример программы с исходным текстом, которая выводит дату установки Windows. Запускать от Администратора.
Просмотров: 3334 | Комментариев: 32
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(25.01.2017 в 13:16):
Официальных данных нигде не нашел, но думаю, что именно в этот момент был создан этот ключ реестра.
АндрейК
(25.01.2017 в 10:42):
Народ извините за глупый вопрос, но что *именно* происходило в секунду отображаемую "Windows Install Date" ?
Просто смотрю на дату-время директории %windir% и оно отличается на несколько минут.
Просто смотрю на дату-время директории %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)
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 - неужели и это вызывает какую-то проблему? Да и не деление там, а умножение. Секунды переводятся в наносекунды.
Конечно-конечно, особенно на локализованных системах, с разными форматами даты, с разными языками вывода информации, кодировкой текста в консоли и прочими радостями. Куда уж проще.
Перевести 989680h в десятичное 10000000 - неужели и это вызывает какую-то проблему? Да и не деление там, а умножение. Секунды переводятся в наносекунды.
Конечно-конечно, особенно на локализованных системах, с разными форматами даты, с разными языками вывода информации, кодировкой текста в консоли и прочими радостями. Куда уж проще.
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.
А с настройками "из коробки" орать начинала хост. система, а не внутри вм.
Я пробовал патч ядра - обязательно какой-то важный кривой драйвер не даст загрузить комп, ибо не все ведут себя адекватно при включенном патчем 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):
Вот сейчас так сказал, как будто Си это не компилятор.
Что код на 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)
и там 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
Так что дело все-таки в невозможности получения данных из реестра. Тут я уже ничем помочь не могу. Антивирус блокирует или еще что - хз.
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
Видимо что-то с преобразованиями.
Windows 7 Максимальная sp1
В реестре InstallDate=1440685553
Видимо что-то с преобразованиями.
ManHunter
(05.12.2016 в 14:37):
А из приложения ты тоже будешь systeminfo запускать?
иван
(05.12.2016 в 13:44):
в командной строке systeminfo
Добавить комментарий
Заполните форму для добавления комментария
Любопытно ведь.