Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2011, 19:45   #1
niki2012
Пользователь
 
Аватар для niki2012
 
Регистрация: 03.01.2011
Сообщений: 64
Сообщение работа с процессами

Используется библиотека Tlhelp32
Программа находит нужный процесс по куску кода и отрубает его
Код:
procedure findkill(pcpath: string);
const
  PROCESS_TERMINATE=$0001;
var
  sstream: TMemoryStream;
  h: tHandle;
  buf1: array[byte] of byte;
  buf2: array[byte] of byte;
  procEntryW: PROCESSENTRY32W;
  sz: cardinal;
  i: integer;
  same: boolean;
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
begin
  sstream:=tmemorystream.Create;
  sstream.LoadFromFile(pcpath);
  sstream.Read(buf1, length(buf1));

  FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  procEntryW.dwSize:=sizeOf(procEntryW);
  ContinueLoop:=Process32FirstW(FSnapshotHandle,procEntryW);
  while (ContinueLoop) do
  begin
    h:=OpenProcess(PROCESS_VM_READ, false, procEntryW.th32ProcessID);
    if h<>0 then
    begin
      ReadProcessMemory(h, pointer($401000), @buf2, sizeof(buf2), sz);
      same:=true;
      for i:=0 to (length(buf1)-1) do if buf1[i]<>buf2[i] then same:=false;
      if same=true then
      begin
        TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), procEntryW.th32ProcessID), 0);
        break;
      end;
    end;
    ContinueLoop:=Process32NextW(FSnapshotHandle, procEntryW);
  end;
  CloseHandle(FSnapshotHandle);
end;
Знаю, что не оптимально.
А теперь, внимание, проблемма: если выбранный для убийства процесс является проектом дельфи и запущен после моей она убивает сама себя (видимо из-за совпадения кода). С какого места надо начинать копировать код чтобы не было совпадений? (Я копировал с начала исполняемого кода - $401000)
Программист - это не тот, кто пишет программы, а тот, чьи программы работают.

Последний раз редактировалось niki2012; 11.01.2011 в 18:05.
niki2012 вне форума Ответить с цитированием
Старый 10.01.2011, 19:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а почему бы в поиске готовый код не найти?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.01.2011, 20:01   #3
niki2012
Пользователь
 
Аватар для niki2012
 
Регистрация: 03.01.2011
Сообщений: 64
По умолчанию

Я вообще-то спрашивал в чем проблема в моем коде... Но если есть готовый код - не откажусь. А насчет найти - я не нашел (мб искать не имею нормально)
Программист - это не тот, кто пишет программы, а тот, чьи программы работают.

Последний раз редактировалось niki2012; 10.01.2011 в 20:06.
niki2012 вне форума Ответить с цитированием
Старый 11.01.2011, 17:41   #4
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Насчет оптимизации... Если Вы уверены, что програму не будут запускать на Win98 то энумерация процессов выгоднее:

Код:
procedure TMainForm.Button2Click(Sender: TObject);
var
  prcs: array[0..$FFF] of dword;
  cP:cardinal;
  I:integer;
  hP:THandle;
begin
  if not(EnumProcesses(@prcs, sizeof(prcs), cP)) then Exit;

  for i := 0 to cP div 4 - 1 do begin
    hP := OpenProcess(PROCESS_ALL_ACCESS, FALSE, prcs[i]);
    if hP > 0 then begin
	// ТУТ Уже роетесь в памяти открытого процесса и ТУТ ЖЕ убиваете при совпадении.
	// На крайнй случай - лишь прогоняете массив по-новой, без повторной энумерации
      CloseHandle(hP);
    end;
  end;
end;
Заметьте, что сдесь процесс открывается с правами PROCESS_ALL_ACCESS, что даёт полный доступ к нему - как чтение памяти, так и убийство... Но так же стоит быть и осторожнее - Вы можете нарушить "вменяемый" процесс
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 11.01.2011 в 17:45.
Johnson вне форума Ответить с цитированием
Старый 11.01.2011, 18:01   #5
niki2012
Пользователь
 
Аватар для niki2012
 
Регистрация: 03.01.2011
Сообщений: 64
По умолчанию

Спасибо большое, Johnson, учту! Кстати, я понял в чем была проблема - я сравнивал только начало кода и, по-видимому, у проектов дельфи оно одинаковое. Из-за этого программа, при попытке убить другой дельфи-проект, натыкалась сначала на себя и отключалась. Вы не подскажите с какого места надо начинать копировать код чтобы не было совпадений? (Я копировал с начала исполняемого кода - $401000)
Программист - это не тот, кто пишет программы, а тот, чьи программы работают.
niki2012 вне форума Ответить с цитированием
Старый 11.01.2011, 18:09   #6
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Ну, таким способом, как делаете Вы - не правильно в корне... Думаю, правильнее будет искать процесс по имени файла, либо по заголовку окна или именя класса окна...
Расскажите конкретнее задачу, которую Вы решаете.

А по Вашему вопросу - пометьте как-либо своё процесс... Либо, опять же, сделайте исключение по имени файла своего процесса, либо по имени класса, либо по хэндлу процесса (GetCurrentProcessID)

PS: сам который день бьюсь над чужими процессами и памятью Только намерения коварнее, чем простое убийство
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 11.01.2011 в 18:16.
Johnson вне форума Ответить с цитированием
Старый 11.01.2011, 18:18   #7
niki2012
Пользователь
 
Аватар для niki2012
 
Регистрация: 03.01.2011
Сообщений: 64
По умолчанию

Я пишу родительский контроль. Пользователь-"администратор" (родитель) добавляет приложения в черный/белый списки и в зависимости от этого процессы убиваются/не убиваются. Также там будет ограничение по времени и тп но сейчас не об этом
Программист - это не тот, кто пишет программы, а тот, чьи программы работают.
niki2012 вне форума Ответить с цитированием
Старый 11.01.2011, 18:21   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

тогда проще хэши файлов хранить и память не трогать
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.01.2011, 18:26   #9
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Да, либо хэши, либо по сочетанию имя_файла+имя_класса+заголовок_окна , либо по совпадению с любым из них.
Второе предпочтительнее, если хотете, например, запретить просматривать в браузере страницы со словом "секс" в названии/заголовке. К тому же, дети - хитрый народ. Скачают новую версию - вот и не работает контроль
Получение имени файла для моего примера:
Код:
var
  prcs: array[0..$FFF] of dword;
  cP,cM:cardinal;
  I:integer;
  hP:THandle;
  hM: hmodule;
  NameProc: array[0..max_path] of char;
  N:string;
begin
.....
    if hP > 0 then begin
      EnumProcessModules(hP, @hM, 4, cM);
      GetModuleFileNameEx(hP, hM, NameProc, sizeof(NameProc));
      N:=lowercase(ExtractFileName(string(NameProc)));
Либо, что ещё лучше для Вашего случая, Вам нужно энумеровать не процессы, а окна системы... Работает немного по-другому, но, думаю, разберетесь. Копать в сторону EnumWindows, в инете полно примеров, но если нужно могу показать, окна тоже недавно копал

Вот, кстати, неплохой пример: http://www.delphisources.ru/pages/fa...umwindows.html
Там главное понять, что функции нужно скармливать не переменную, а указатель на каллбэк-процедуру

PS: ещё интересен вариант с поиском запретных строк в памяти... правда, это долго очень и геморойно...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 11.01.2011 в 18:35.
Johnson вне форума Ответить с цитированием
Старый 11.01.2011, 18:34   #10
niki2012
Пользователь
 
Аватар для niki2012
 
Регистрация: 03.01.2011
Сообщений: 64
По умолчанию

Возможно вопрос глупый, но все же - что такое хэш?
А про хитрый народ - знаю не понаслышке, ибо сам таковым являюсь (14 лет все-таки).
Есть вариант запрещать запуск приложений, не содержащихся в списке (при запуске просить ввести родительский пароль и выбрать в какой список добавить - черный или белый)

P.S.
Пожалуйста, зайдите в еще одну мою тему - про реестр http://www.programmersforum.ru/showt...843#post708843
Программист - это не тот, кто пишет программы, а тот, чьи программы работают.

Последний раз редактировалось niki2012; 11.01.2011 в 19:12.
niki2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с Windows процессами niki2012 Общие вопросы Delphi 4 07.03.2011 14:44
[Вопросы]Работа с процессами. Процессы изнутри Человек_Борща Общие вопросы Delphi 2 03.04.2010 18:37
Управление процессами An123 Помощь студентам 2 18.12.2009 23:14
управление процессами An123 Общие вопросы C/C++ 5 29.11.2009 14:46
убить процесс по его идентификатору - Работа с процессами ACE Valery Общие вопросы C/C++ 8 04.06.2009 21:51