Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.06.2011, 20:20
TheHavoc TheHavoc вне форума
Прохожий
 
Регистрация: 22.03.2011
Сообщения: 7
Репутация: 10
Сообщение Доступ к процессу

Здравствуйте, уважаемые.
Суть вопроса в следующем:
Пишу простенький диспетчер задач, с функцией вывода информации о процессе(производитель экзешника, путь к файлу) и с функцией убийства процесса.
Думаю, многие из вас сталкивались с ситуацией, когда вредоносными программами(Вирусами) отключался регэдит и диспетчер задач.

Есть 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  
Старый 30.06.2011, 23:32
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Операционка?
Подозреваю, что Win7. Delphi, скорее всего, от админа, а значит, и твоя прога "от имени администратора". А если не из Delphi запускаешь, то от "юзера" запускается, и получаешь свой заслуженный "error code 6".
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 30.06.2011, 23:41
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А может не нужен велосипед, а использовать Process Explorer
Ответить с цитированием
  #4  
Старый 01.07.2011, 00:09
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Нормальное вирьё его тоже заблочит, так что не всегда.
По проблеме: Вероятнее всего именно из-за отсутствия админских прав и не завершается. Тут есть два варианта - где-то видел функцию, проверяющую есть ли права админа у программы, а во-вторых можно подправить манифест и UAC будет сам запрашивать права
Ответить с цитированием
  #5  
Старый 01.07.2011, 08:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

TheHavoc, если используешь TXPManifest, то удали его и из всех uses удали XPMan.
положи в папку с *.dpr файлик Manifest.res и в *.dpr добавь строчку:
Код:
{$R Manifest.res}
после program хотя бы.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 01.07.2011, 17:27
TheHavoc TheHavoc вне форума
Прохожий
 
Регистрация: 22.03.2011
Сообщения: 7
Репутация: 10
По умолчанию

Ось Вин ХР, сижу из-под админа
Компилятор Delphi XE
Изобретать велосипед не надо, но эта возможность мне необходима.
Мне нужно знать, как это работает.
С XP Манифестом попробую поэкспериментировать.

Последний раз редактировалось TheHavoc, 01.07.2011 в 17:29.
Ответить с цитированием
  #7  
Старый 01.07.2011, 17:30
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Код:
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  
Старый 01.07.2011, 17:35
TheHavoc TheHavoc вне форума
Прохожий
 
Регистрация: 22.03.2011
Сообщения: 7
Репутация: 10
По умолчанию

Операция с манифестом и ресурсами не помогла.
Ответить с цитированием
  #9  
Старый 01.07.2011, 17:36
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Цитата:
Компилятор Delphi XE
XE вроде свой манифест сует, так что смена не поможет
Ответить с цитированием
  #10  
Старый 01.07.2011, 17:40
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

На фига вот это вот GetExitCodeProcess(PH, EC);

Просто TerminateProcess(PH, 0);
Ответить с цитированием
  #11  
Старый 01.07.2011, 18:19
TheHavoc TheHavoc вне форума
Прохожий
 
Регистрация: 22.03.2011
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zorkov Igor
На фига вот это вот GetExitCodeProcess(PH, EC);

Просто TerminateProcess(PH, 0);
Для отчетности.
Да, кстати, спасибо вам за код.
Работает
Попробовал завершить csrss.exe - синий экран
Ответить с цитированием
  #12  
Старый 01.07.2011, 18:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от TheHavoc
Операция с манифестом и ресурсами не помогла.
в XP нет UAC, поэтому в ней без разницы из под среды запускать программу или нет.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter