Vova_2581 писал(а):Логично предположить, что если служба получает такую информацию, значит, есть какая-то функция или класс, которые определяют, что система полностью загружена и останавливают этот самый «секундомер». Так вот что это за функция??? Подскажите, пожалуйста.
bon818 писал(а):Есть только GetTickCount().
Vova_2581 писал(а):Появилась идея: для получения времени загрузки, просто воспользоваться этой функцией данной, надеюсь, Native Dll библиотеки.
Вопрос теперь в том, как мне ее задекларировать в VB и получить описание IN/OUT параметров??? Подскажите, пожалуйста.
Vova_2581 писал(а):GetSystemLoadTime
Хакер писал(а):Глянуть под отладчиком, как она вызывается, что передаётся, что возвращается. Или просто разреверсить её и отвязаться от DLL.
Vova_2581 писал(а):Мне не совсем понятно как слово, так и сам механизм, как вы назвали - "разреверсить". Немного почитал Гугл из которого стало ясно, что это что-то типа дезасемблирования, но я в ассемблере не силен, к тому же в инете пишут, что можно нарваться на обфускацию кода - сейчас это модно.
Vova_2581 писал(а):Вы имеете ввиду, что можно проверять загрузку CPU процесса lsass.exe и если она упала до "плинтуса" в этот момент снять показания GetTickCount() - это и будет время загрузки??? Я правильно Вас понимаю???
Teranas писал(а):Обычно использую проверку загрузку процессора, если она ниже 10%, значит можно запускать свою фигню.
Vova_2581 писал(а):что все таки отображают время загрузки???
Vova_2581 писал(а):Да... и вы так и не ответили, что значит "разреверсить"?? Для этого процесса нужны какие-то дополнительные хакерские программы??
Vova_2581 писал(а):Для этого процесса нужны какие-то дополнительные хакерские программы??
Хакер писал(а):...это количество времени, которое потребовалось на осуществление загрузки?
Хакер писал(а):Да, нужен какой-нибудь отладчик. Вариантов множество, включая написание своего собственного, но наиболее удачным выбором (особенно для начинающего) будет OllyDbg.
Vova_2581 писал(а):Именно так!
Хакер писал(а):...непонятно, что считать моментом конца загрузки, непонятно также считать, что считать моментом начала.
Private Declare Function GetSystemLoadTime Lib "BootTime.dll" () As Long
Private Sub Form_Load()
MsgBox GetSystemLoadTime
End Sub
Option Explicit
MsgBox GetBootTime()
Function GetBootTime()
Const HKEY_LOCAL_MACHINE = &H80000002
Dim objSWbemServices, objSWbemObjectSet, blnKeyCreated
'Путь в реестре, где необходимо создать раздел
Const REGISTRY_KEY = "SYSTEM\CurrentControlSet\Services\EventLog\Microsoft-Windows-Diagnostics-Performance/Operational"
'Объект для подключения к WMI
Set objSWbemServices = CreateObject("WbemScripting.SWbemLocator").ConnectServer()
With objSWbemServices.Get("StdRegProv")
'Проверка существования ключа в реестре
If .EnumKey(HKEY_LOCAL_MACHINE,REGISTRY_KEY) <> 0 Then
'Если ключа нет, то создаём
If .CreateKey(HKEY_LOCAL_MACHINE,REGISTRY_KEY) = 0 Then
blnKeyCreated = True
Else
'Если не создался, значит печаль тоска
Err.Raise vbObjectError + 1, "GetBootTime", "Not enough privileges"
End if
End if
'Выполняем поиск нужного события в логах
With objSWbemServices.ExecQuery("SELECT * FROM Win32_NtLogEvent WHERE Logfile='Microsoft-Windows-Diagnostics-Performance/Operational' AND EventCode = 100")
If .Count > 0 Then GetBootTime = .ItemIndex(0).InsertionStrings(5)
End With
'Если ключик был создан нами, то чистим его по концу работы
If blnKeyCreated Then .DeleteKey HKEY_LOCAL_MACHINE, REGISTRY_KEY
End With
End Function
Вы кажется та сама "соломинка" за которую мы все хотим ухватится.
Код работает! И без прав админа...
Только я не совсем понял, зачем предварительно нужно делать запись в реестр, если ставится задача по идее прочесть уже существующие данные в реестре??? Че-та я вообще запутался.
как понять, что система загрузилась? Может что-то сможет нам сказать могучий WMI???
wevtutil qe Microsoft-Windows-Diagnostics-Performance/Operational /rd:true /c:1 /f:xml /q:"* [System [(EventID = 100)]]" /e:Events
Всегда поражался теми, кто в совершенстве владеет технологиями WMI, WSH и т.д. По Вашим кодам можно учится!
. А если Count <=0, то что ?? У Функции не задан тип возвращаемых данных. Почему константа объявлена внутри функции ? Для переменных внутри функции не заданы типы. В коде используется позднее связывание, единственная ошибка, которая генерится в функции по условию совершенно не отражает реальную причину несрабатывания кода.... В общем facepalm !If .Count > 0 Then GetBootTime = .ItemIndex(0).InsertionStrings(5)
Подозреваю, что у вас отключен UAC
Vova_2581 писал(а):и так же китайскую утилиту Glary – они все показываю время загрузки Windows, а это автоматически означает, что есть некая временнАя «точка A», которая берется (условно) за начало отсчета и есть условная «точка Б», которая берется за конец отсчета. То есть, система начала загрузку в «A» момент времени, и система уже загрузилась в «Б» момент времени.
Ну, а дальше Б - A = С миллисекунд. Вот что это за точки, непонятны даже Хакеру.
Пилот бортинженеру: Приборы?
Бортинженер пилоту: 140!
Пилот бортинженеру: Что «140!»?
Бортинженер пилоту: А что «приборы»?
Vova_2581 писал(а):Как показало «вскрытие» библиотеки BootTime.dll из пакета Glary, и как говорилось тут другими участниками, экспортируемая функция GetSystemLoadTime этой библиотеки, возвращающая время загрузки, отслеживает завершение загрузки процесса авторизации lsass.exe.
Vova_2581 писал(а):Как только загрузка завершилась, снимаем показания GetTickCount и запоминаем их – это будет наша «точка A».
Хакер писал(а):GetTickCount переполняется каждые 49 дней, так что это способ в любом случае имеет врождённый потенциал к устраиванию проблем.
Function GetTimeLoadWorktable() As Single
Dim ti As NOTIFYICONDATA
ti.cbSize = Len(ti)
ti.uId = GetModuleHandle(ByVal 0)
'--------
While Shell_NotifyIcon(NIM_ADD, ti) = 0
Sleep 1000
Wend
'--------
Call Shell_NotifyIcon(NIM_DELETE, ti)
GetTimeLoadWorktable = GetTickCount()
End Function
bon818 писал(а):Не переживайте, что именно Я поставил последнею точку "Б" в этом топике.
Mikle писал(а):Разве это проблема? Просто отслеживаем случаи, когда счётчик на выходе меньше, чем на входе, и вносим поправку.
...
While Shell_NotifyIcon(NIM_ADD, ti) = 0
Sleep 1000
Wend
msgbox «У нас все получилось, и мы не лузеры!»
Хакер писал(а):Каким образом этот код позволяет узнать время точки «Б», если код запустить через день после загрузки системы?
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Private Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
Private Const NIM_ADD = &H0
Private Const NIM_DELETE = &H2
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Load()
On Error Resume Next
Dim strTime, strDate As String
Dim GetTime, TotalTime, FixTime, DrobnayaChast, SecTime As Long
strDate = GetSetting(App.Title, "DateLoad", "strDate", Default:=vbNullString)
If Date <> CDate(strDate) Then
GetTime = GetTimeLoadWorktable
TotalTime = Format((GetTime / 1000 / 60), "##.##") 'Общее время
FixTime = Fix(TotalTime) 'Целая часть
DrobnayaChast = TotalTime - Int(TotalTime) 'Дробная часть
'Вычисляем секунды от дробной части...
SecTime = DrobnayaChast * 60
MsgBox "Система загружается за: " & FixTime & " мин. и " & SecTime & " сек.", _
vbInformation, "Время загрузки системы"
SaveSetting App.Title, "TimeLoad", "strTime", GetTime
SaveSetting App.Title, "DateLoad", "strDate", Date
Else
strTime = GetSetting(App.Title, "TimeLoad", "strTime", Default:="0")
TotalTime = Format((strTime / 1000 / 60), "##.##")
FixTime = Fix(TotalTime)
DrobnayaChast = TotalTime - Int(TotalTime)
SecTime = DrobnayaChast * 60
MsgBox "Система загружается за: " & FixTime & " мин. и " & SecTime & " сек.", _
vbInformation, "Время загрузки системы"
End If
End
End Sub
Function GetTimeLoadWorktable() As Single
Dim ti As NOTIFYICONDATA
ti.cbSize = Len(ti)
ti.uID = GetModuleHandle(ByVal 0)
'--------
While Shell_NotifyIcon(NIM_ADD, ti) = 0
Sleep 1000
Wend
'--------
Call Shell_NotifyIcon(NIM_DELETE, ti)
GetTimeLoadWorktable = GetTickCount()
End Function
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11