Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: имя процесса в диспетчере задач  (Прочитано 35876 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 10-09-2008 12:39 » 

возможно ли в принципе такое:
запустив процесс, задать ему имя (отличное от имени модуля), которое будет видно в диспетчере ?
Записан

zubr
Гость
« Ответ #1 : 10-09-2008 13:36 » 

Можно, как вообще сделать процесс "невидимым" так и поменять ему имя перехватом ZwQuerySystemInformation
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-09-2008 13:38 » 

MSDN
CreateProcess
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 10-09-2008 17:16 » 

MSDN
CreateProcess
я не нашёл, где в CreateProcess задать имя для процесса, отличное от имени модуля...



Можно, как вообще сделать процесс "невидимым" так и поменять ему имя перехватом ZwQuerySystemInformation
ZwQuerySystemInformation - в мсдн даже описания не нашёл, не то что как использовать ))
Записан

zubr
Гость
« Ответ #4 : 10-09-2008 18:00 » 

Цитата
ZwQuerySystemInformation - в мсдн даже описания не нашёл, не то что как использовать ))
В msdn вот только информация по данной функции:
Цитата
Listing Processes and Threads
      To log when processes and threads start and stop, we use the barely documented functions PsSetCreateProcessNotifyRoutine and PsSetCreateThreadNotifyRoutine. With them, we can have the system call a given logging function when a process (or thread) is created or destroyed.
      We also need to record a list of the existing processes and threads when the tracer starts logging. Unfortunately, there's no documented way to do this from kernel mode. Fortunately, we found a Usenet message describing how do this with the undocumented function ZwQuerySystemInformation. The function has the prototype shown here:
unsigned long ZwQuerySystemInformation
 (ULONG tag, VOID *buffer, ULONG bufferSize, ULONG *returnedSize);
      The tag parameter in this prototype indicates what kind of information is to be returned; the value 5, for instance, indicates process and thread information. Figure 11 shows how we use this function to get a sequence of process information structures, one for each process. Figure 12 illustrates what you can find in each of these structures (at least, in the current uniprocessor build of Windows NT).
Эта функция, как и ZwCreateFile находится  в ntdll.dll. Укажи куда тебе на мыло сбросить модуль хука этих функций (только не обессудь - комментов там почти нет ну и язык ObjectPascal).
З.Ы. Я тоже не понял как с помощью CreateProcess можно изменять имя процесса.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 10-09-2008 18:06 » 

zubr, мыл в инфе нарисован )
Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 10-09-2008 19:43 » 

эээ. да, чего то я погорячился)
и вообще у меня в списке только два процесса без расширения exe)
System и "Бездействие системы")))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
zubr
Гость
« Ответ #7 : 11-09-2008 05:33 » 

Алексей1153++, выслал, лови.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 11-09-2008 05:41 » 

спасибо, щас прям не могу посмотреть, позже отпишусь, что вышло )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 15-09-2008 04:06 » 

zubr, в общем, как я понял, мне нужно пользоваться вот этим

Код:
//Берем адрес процедуры ZwCreateFile 
 AdrZwCreateFile:=GetProcAddress(GetModuleHandle('ntdll.dll'), 'ZwCreateFile');
 If AdrZwCreateFile<>nil then
 begin
  //читаем адрес этой функции в текущем процессе
  ReadProcessMemory(INVALID_HANDLE_VALUE, AdrZwCreateFile, @OldZwCreateFile,
   SizeOf(OldCode), Bytes);

  //подменяем обработчик функции
  StabZwCreateFile.PuhsOp:=$68;
  StabZwCreateFile.PushArg:=@NewZwCreateFile;
  StabZwCreateFile.RetOp:=$C3;

  //записываем в процесс
  WriteProcessMemory(INVALID_HANDLE_VALUE, AdrZwCreateFile, @StabZwCreateFile,
   SizeOf(far_jmp), Bytes);
 end;

и тут такой вопрос: что , если я не верну старый адрес обратно (например, программа просто вылетела) ?
Записан

zubr
Гость
« Ответ #10 : 15-09-2008 05:03 » 

Насчет вылета не помню, давно делал. Но тебе надо для данной задачи не ZwCreateFile а ZwQuerySystemInformation перехватывать. И не запрещать работу данной функции, а подменивать ей данные, там в коде процесс вообще скрывается, то есть из получаемого списка процессов исключается ссылка на скрываемый процесс, в твоем случае надо просто менять значение Info^.ProcessName.Buffer.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 27-12-2008 07:32 » 

а вот ещё такая задача. Нужно мониторить процесс, чтобы он был запущен, а если он не запущен - запустить (не более 1 экземпляра).

поьзуюсь для определения того, что процесс запущен функцией
Код:
	//определение наличия запущенного процесса по имени его модуля (также найдётся ID процесса)
//(точное совпадение имени)
static bool GetProcessByExeName_exactly(const char* const pExeName,DWORD* pID=0)
{
CString ExeName=pExeName;

ExeName.MakeUpper();
HANDLE hProcessSnap=NULL;
PROCESSENTRY32 pe32={0};
CString temp="";
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS/*TH32CS_SNAPALL*/,NULL);
if(hProcessSnap == (void*)-1)return false;

pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32))temp=pe32.szExeFile;
temp.MakeUpper();
if(temp==ExeName)
{
if(pID)*pID=pe32.th32ProcessID;
CloseHandle (hProcessSnap);
return true;
}

pe32.dwSize=sizeof(PROCESSENTRY32);
while(Process32Next(hProcessSnap,&pe32))
{
temp=pe32.szExeFile;
temp.MakeUpper();
if(temp==ExeName)
{
if(pID)*pID=pe32.th32ProcessID;
CloseHandle (hProcessSnap);
return true;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
}
CloseHandle (hProcessSnap);
return false;
}

Проблема вот в чём -
функция заметно жрёт время процессора, а вот нельзя ли по вернутому DWORD* pID сначала смотреть - у процесса с этим ID нужное ли цже имя ? И , соответственно, не искать в списке. Не могу найти, как по ID найти имя процесса
Записан

zubr
Гость
« Ответ #12 : 27-12-2008 09:06 » 

Можно через WMI сделать. Так вроде побыстрее будет работать. Смотри msdn поиск по фразе "WMI C++ Application Examples". Также на codeproject смотри поиск по фразе: "Making WMI Queries In C++"
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 27-12-2008 15:12 » 

промежуточный вопрос:

запускаю процесс при помощи CreateProcess , хендл процеса запомина. Затем, убиваю новый процесс через диспетчер, потом пробую получиться временА убитого процеса через GetProcessTimes - и эти временА великолепно достаются, в чём прикол ?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 27-12-2008 16:40 » 

Леш, это же снимок - если ты его сделал до убийства процесса, то он останется в снимке, пока ты его не пересоздашь заново.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 27-12-2008 18:28 » 

Ром, нет, речь не про CreateToolhelp32Snapshot , оно в предыдущем посте никак не участвует же

может дело в том, что я именно убиваю процесс, а не он сам заканчивается корректно ?
Записан

zubr
Гость
« Ответ #16 : 27-12-2008 18:54 » 

Алексей1153++, ты ж хендл процесса не удалил (CloseHandle), вот он по видимому и остается валидным для твоего процесса (из которого был сделан CreateProcess).
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 28-12-2008 04:50 » 

zubr, а как я его удалю то ? Улыбаюсь Я ж не в курсе, что с процессом произошло после того, как я его запустил. Попробую с глобальными мутексами или событиями поколдовать
Записан

zubr
Гость
« Ответ #18 : 28-12-2008 08:04 » 

Алексей1153++, а CreateToolhelp32Snapshot показывает убитый процесс?
Тебе что надо отслеживать валидность процесса?
З.Ы. Боюсь, что и хендлы мутексов и событий тоже будут валидны. Попробуй DuplicateHandle и или OpenProcess.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 28-12-2008 14:41 » 

добрался домой наконец )))

zubr, CreateToolhelp32Snapshot  не показывает, это точно, так как см. с чего всё началось - если мониторю им, то после убийства процесса через диспетчер, основной процесс исправно это видел и запускал ещё экземпляр

мне надо отслеживать не столько валидность хендлов, сколько наличие работающего процесса

OpenProcess - можно использовать, если узнать, как по хендлу процесса достать имя процесса, а это я так и не разобрался. Ведь, если процесс сдох, есть вероятность, что этот ID уже занят каким то другим процессом. Так ведь я понимаю ?

DuplicateHandle - читаю

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 28-12-2008 14:59 » 

а, то есть, если правильно понял я, то:

когда я создал дочерний процесс, я запомнил его хендл. Когда хочу узнать, жив ли процесс, я должен попробовать продублировать хендл при помощи DuplicateHandle, если это удалось, тут же закрываю копию CloseHandle, а если не удалось - значит процесс мёртв. Так ?


ЗЫ а не может быть такого, что хендлы повторятся у двух процессов, запущенных в разное время но не работающих одновременно ? (Например запустили A , убили. Через некоторое время запустили B.)  Как назначаются хендлы, по какому механизму ?
Записан

zubr
Гость
« Ответ #21 : 28-12-2008 15:02 » 

Цитата
OpenProcess - можно использовать, если узнать, как по хендлу процесса достать имя процесса, а это я так и не разобрался. Ведь, если процесс сдох, есть вероятность, что этот ID уже занят каким то другим процессом. Так ведь я понимаю ?
Зачем так? Получай Id по хендлу GetProcessId
Цитата
а, то есть, если правильно понял я, то:

когда я создал дочерний процесс, я запомнил его хендл. Когда хочу узнать, жив ли процесс, я должен попробовать продублировать хендл при помощи DuplicateHandle, если это удалось, тут же закрываю копию CloseHandle, а если не удалось - значит процесс мёртв. Так ?
Да.

Цитата
ЗЫ а не может быть такого, что хендлы повторятся у двух процессов, запущенных в разное время но не работающих одновременно ? (Например запустили A , убили. Через некоторое время запустили B.)  Как назначаются хендлы, по какому механизму ?
Каждый хендл уникален. И пока ты не не освободишь хендл CloseHandle система будет хранить его и не сможет использовать.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 28-12-2008 15:57 » 

Цитата
Каждый хендл уникален. И пока ты не не освободишь хендл CloseHandle система будет хранить его и не сможет использовать

а если процесс корректно завершился сам ? Улыбаюсь

Тогда всё таки лучшим средством остаётся DuplicateHandle. Ок, завтра на работе всё попробую
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 29-12-2008 04:38 » 

неа, нифига DuplicateHandle не помогает , убил я процесс в диспетчере, а хендл всё равно успешно дублируется
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 29-12-2008 05:38 » 

хех, так если я корректно завершил процесс, DuplicateHandle всё равно удачно копирует хендл. Что тут не так ? )
Записан

zubr
Гость
« Ответ #25 : 29-12-2008 07:38 » 

Алексей1153++, я не понимаю в чем проблема. Ты процесс создаешь с помощью CreateProcess. Значит ставь WaitForSingleObject(pi.hProcess, INFINITE); - и будет тебе счастье Улыбаюсь Сработает, даже если юзер убьет процесс из диспетчера. Только не забудь после WaitForSingleObject сделать CloseHandle.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 29-12-2008 10:22 » 

WaitForSingleObject - так эта функция же заблокирует выполнение программы, мне такое шасте не надо )
Записан

zubr
Гость
« Ответ #27 : 29-12-2008 12:43 » 

1. Ну дык а потоки зачем?
2. А что мешает сделать:
Код:
if (WaitForSingleObject( pi.hProcess, 10 ) == WAIT_OBJECT_0)
{
     MessageBox(NULL, "Процесс убит", 'NULL, MB_OK);
     CloseHandle(pi.hProcess);
     CloseHandle(pi.hThread);
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 29-12-2008 12:58 » 

if (WaitForSingleObject( pi.hProcess, 10 ) == WAIT_OBJECT_0) -
канает Улыбаюсь

спасибо
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines