Форум по 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 код и процесс убит.
Антивирус не при чем.
Функция:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 добавь строчку:
Код:
1
{$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
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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:25.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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