|
#1
|
|||
|
|||
Доступ к процессу
Здравствуйте, уважаемые.
Суть вопроса в следующем: Пишу простенький диспетчер задач, с функцией вывода информации о процессе(производитель экзешника, путь к файлу) и с функцией убийства процесса. Думаю, многие из вас сталкивались с ситуацией, когда вредоносными программами(Вирусами) отключался регэдит и диспетчер задач. Есть PID процесса, есть функция, убивающая процесс. Процесс можно убить почти любой.(не получалось убить только avp.exe - каспер) Но, это при запуске программы из-под компилятора.(кнопка F9 - Run) Если скомпилировать, и запустить - то некоторые процессы убить не получается. Подозреваю, что отказано в доступе. error code: 6 Если запускать из компилятора - то функцией возвращается 0 код и процесс убит. Антивирус не при чем. Функция: Код:
function KillProcess(PID: Integer): Integer; var PH, EC: Cardinal; begin Result:= 0; PH:= OpenProcess(PROCESS_ALL_ACCESS, True, PID); GetExitCodeProcess(PH, EC); if (PH = 0) then Result:= GetLastError else begin if not TerminateProcess(PH, EC) then Result:= GetLastError; CloseHandle(PH); end; end; Вопросы: 1) Коим образом можно извлечь информацию о производителе?(майкрософт, адоб, и.т.п.) // Это не столь важно 2) Коим образом можно получить необходимый доступ к процессу, не зависимо от компилятора? |
#2
|
||||
|
||||
Операционка?
Подозреваю, что Win7. Delphi, скорее всего, от админа, а значит, и твоя прога "от имени администратора". А если не из Delphi запускаешь, то от "юзера" запускается, и получаешь свой заслуженный "error code 6". Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#3
|
||||
|
||||
А может не нужен велосипед, а использовать Process Explorer
|
#4
|
|||
|
|||
Нормальное вирьё его тоже заблочит, так что не всегда.
По проблеме: Вероятнее всего именно из-за отсутствия админских прав и не завершается. Тут есть два варианта - где-то видел функцию, проверяющую есть ли права админа у программы, а во-вторых можно подправить манифест и UAC будет сам запрашивать права |
#5
|
||||
|
||||
TheHavoc, если используешь TXPManifest, то удали его и из всех uses удали XPMan.
положи в папку с *.dpr файлик Manifest.res и в *.dpr добавь строчку: Код:
{$R Manifest.res} Пишу программы за еду. __________________ |
#6
|
|||
|
|||
Ось Вин ХР, сижу из-под админа
Компилятор Delphi XE Изобретать велосипед не надо, но эта возможность мне необходима. Мне нужно знать, как это работает. С XP Манифестом попробую поэкспериментировать. Последний раз редактировалось TheHavoc, 01.07.2011 в 17:29. |
#7
|
|||
|
|||
Код:
type TVersionInfo = record CompanyName: WideString; FileDescription: WideString; FileVersion: WideString; InternalName: WideString; LegalCopyright: WideString; LegalTradeMarks: WideString; OriginalFilename: WideString; ProductName: WideString; ProductVersion: WideString; Comments: WideString; Language: WideString; Translation: WideString; FileVersionMajor: Word; FileVersionMinor: Word; FileVersionRelease: Word; FileVersionBuild: Word; ProductVersionMajor: Word; ProductVersionMinor: Word; ProductVersionRelease: Word; ProductVersionBuild: Word; end; function GetFileVersionInfo(FileName: WideString; var VersionInfo: TVersionInfo): Boolean; var Handle, Len, Size: Cardinal; Translation: WideString; Data: PWideChar; Buffer: Pointer; FixedFileInfo: PVSFixedFileInfo; begin Result := False; Size := GetFileVersionInfoSizeW(PWideChar(FileName), Handle); if Size > 0 then begin try GetMem(Data, Size); except Exit; end; try if GetFileVersionInfow(PWideChar(FileName), Handle, Size, Data) then begin if VerQueryValue(Data, '\', Pointer(FixedFileInfo), Len) then begin VersionInfo.FileVersionMajor := HiWord(FixedFileInfo^.dwFileVersionMS); VersionInfo.FileVersionMinor := LoWord(FixedFileInfo^.dwFileVersionMS); VersionInfo.FileVersionRelease := HiWord(FixedFileInfo^.dwFileVersionLS); VersionInfo.FileVersionBuild := LoWord(FixedFileInfo^.dwFileVersionLS); VersionInfo.ProductVersionMajor := HiWord(FixedFileInfo^.dwProductVersionMS); VersionInfo.ProductVersionMinor := LoWord(FixedFileInfo^.dwProductVersionMS); VersionInfo.ProductVersionRelease := HiWord(FixedFileInfo^.dwProductVersionLS); VersionInfo.ProductVersionBuild := LoWord(FixedFileInfo^.dwProductVersionLS); VersionInfo.FileVersion := IntToStr(HiWord(FixedFileInfo^.dwFileVersionMS)) + '.' + IntToStr(LoWord(FixedFileInfo^.dwFileVersionMS)) + '.' + IntToStr(HiWord(FixedFileInfo^.dwFileVersionLS)) + '.' + IntToStr(LoWord(FixedFileInfo^.dwFileVersionLS)) end; if VerQueryValueW(Data, '\VarFileInfo\Translation', Buffer, Len) then begin Translation := IntToHex(PDWORD(Buffer)^, 8); Translation := Copy(Translation, 5, 4) + Copy(Translation, 1, 4); VersionInfo.Translation := '$' + Copy(Translation, 1, 4); SetLength(VersionInfo.Language, 64); SetLength(VersionInfo.Language, VerLanguageNameW(StrToIntDef('$' + Copy(Translation, 1, 4), $0409), PWideChar(VersionInfo.Language), 64)); end; if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\CompanyName'), Buffer, Len) then VersionInfo.CompanyName := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\FileDescription'), Buffer, Len) then VersionInfo.FileDescription := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\FileVersion'), Buffer, Len) then VersionInfo.FileVersion := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\InternalName'), Buffer, Len) then VersionInfo.InternalName := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\LegalCopyright'), Buffer, Len) then VersionInfo.LegalCopyright := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\LegalTradeMarks'), Buffer, Len) then VersionInfo.LegalTradeMarks := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\OriginalFilename'), Buffer, Len) then VersionInfo.OriginalFilename := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\ProductName'), Buffer, Len) then VersionInfo.ProductName := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\ProductVersion'), Buffer, Len) then VersionInfo.ProductVersion := PWideChar(Buffer); if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\Comments'), Buffer, Len) then VersionInfo.Comments := PWideChar(Buffer); Result := True; end; finally FreeMem(Data); end; end; end; function AdjustProcessPrivilege(PrivilegeName: WideString): Boolean; var TokenHandle: Cardinal; TokenPrivileges: TTokenPrivileges; ReturnLength: Cardinal; begin Result := False; try if Windows.OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then begin try LookupPrivilegeValueW(nil, PWideChar(PrivilegeName), TokenPrivileges.Privileges[0].Luid); TokenPrivileges.PrivilegeCount := 1; TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; if AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, 0, nil, ReturnLength) then Result := True; finally CloseHandle(TokenHandle); end; end; except Exit; end; end; procedure TForm1.FormCreate(Sender: TObject); var VersionInfo: TVersionInfo; begin AdjustProcessPrivilege('SeDebugPrivilege'); GetFileVersionInfo('C:\Windows\Explorer.EXE', VersionInfo); Form1.Caption:= VersionInfo.CompanyName; end; 1) Использовать GetFileVersionInfo 2) Получить DebugPrivilege для своего процесса |
#8
|
|||
|
|||
Операция с манифестом и ресурсами не помогла.
|
#9
|
|||
|
|||
Цитата:
|
#10
|
|||
|
|||
На фига вот это вот GetExitCodeProcess(PH, EC);
Просто TerminateProcess(PH, 0); |
#11
|
|||
|
|||
Цитата:
Да, кстати, спасибо вам за код. Работает Попробовал завершить csrss.exe - синий экран |
#12
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |