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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2011, 13:31   #1
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
Хорошо Delphi Close Handle патока процесса

Доброго время суток!

Как реализовать такое как в программе на скриншоте
По имени процесаа вывод списка и завершение из списка
какие функции используются гугли толком нечего вообще не нашёл (
jone вне форума Ответить с цитированием
Старый 18.12.2011, 15:36   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

1. не понятно что именно нужно
2. получение списка хендлов для любого процесса - функция ZwQuerySystemInformation с классом информации SystemHandleInformation
3. чтобы закрыть хендл открытый в чужом процессе, необходимо внедрить в него свой код. внутри него вызвать функцию CloseHandle. В ProcessExplorer cкорее всего это делается с помощью создания потока в чужом процессе через CreateRemoteThread, с указанием поточной функции CloseHandle, так как эта функция полностью удовлетворяет прототипу поточной функции (принимает только один параметр).
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии

Последний раз редактировалось haruhi; 18.12.2011 в 15:40.
haruhi вне форума Ответить с цитированием
Старый 18.12.2011, 20:24   #3
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

Цитата:
чтобы закрыть хендл открытый в чужом процессе, необходимо внедрить в него свой код. внутри него вызвать функцию CloseHandle. В ProcessExplorer cкорее всего это делается с помощью создания потока в чужом процессе через CreateRemoteThread, с указанием поточной функции CloseHandle, так как эта функция полностью удовлетворяет прототипу поточной функции (принимает только один параметр).
Код можно ?!
jone вне форума Ответить с цитированием
Старый 18.12.2011, 20:54   #4
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

так происходит загрузка DLL в чужой процесс (отсюда)
Код:
function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean;
var
  pLL,pDLLPath:Pointer;
  hProcess,hThr:THandle;
  LibPathLen,_WR,ThrID:DWORD;
begin
  Result:=False;
  LibPathLen:=Length(string(LibName));
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
  if hProcess=0 then exit;
  pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE);
  if DWORD(pDLLPath)=0 then exit;
  pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA');
  WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR);
  hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID);//<---- создание потока
  if hThr=0 then exit;
  Result:=CloseHandle(hProcess);
end;
в нашем случае с CloseHandle всё проще: VirtualAllocEx и WriteProcessMemory не нужны. функции CreateRemoteThread надо передать адрес функции CloseHandle и собственно, сам хендл

как-то так
Код:
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
if hProcess=0 then exit;
pCH:=GetProcAddress(GetModuleHandle(kernel32),'CloseHandle');
hThr:=CreateRemoteThread(hProcess,0,0,pCH,<хендл в чужом процессе>,0,ThrID);
CloseHandle(hProcess);
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 18.12.2011, 21:07   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
так происходит загрузка DLL в чужой процесс
а однако плохой код примера:
1)утечка памяти в чужом процессе.
2)хендл потока оставлен открыт.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.12.2011, 21:23   #6
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а однако плохой код примера:
1)утечка памяти в чужом процессе.
2)хендл потока оставлен открыт.
Может учебник есть по этой тематике а то не очень понимаю или пример если не сложно
jone вне форума Ответить с цитированием
Старый 19.12.2011, 09:53   #7
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а однако плохой код примера:
1)утечка памяти в чужом процессе.
2)хендл потока оставлен открыт.
это копипаста из статьи rpy3uH'а . а так для понимания сути хватит. Для CloseHandle память выделять не надо, только создать поток и передать ему параметры, и потом закрыть хендл самого потока, но это мелочи
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 19.12.2011, 21:29   #8
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

Цитата:
Сообщение от haruhi Посмотреть сообщение
так происходит загрузка DLL в чужой процесс (отсюда)
Код:
function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean;
var
  pLL,pDLLPath:Pointer;
  hProcess,hThr:THandle;
  LibPathLen,_WR,ThrID:DWORD;
begin
  Result:=False;
  LibPathLen:=Length(string(LibName));
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
  if hProcess=0 then exit;
  pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE);
  if DWORD(pDLLPath)=0 then exit;
  pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA');
  WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR);
  hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID);//<---- создание потока
  if hThr=0 then exit;
  Result:=CloseHandle(hProcess);
end;
в нашем случае с CloseHandle всё проще: VirtualAllocEx и WriteProcessMemory не нужны. функции CreateRemoteThread надо передать адрес функции CloseHandle и собственно, сам хендл

как-то так
Код:
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
if hProcess=0 then exit;
pCH:=GetProcAddress(GetModuleHandle(kernel32),'CloseHandle');
hThr:=CreateRemoteThread(hProcess,0,0,pCH,<хендл в чужом процессе>,0,ThrID);
CloseHandle(hProcess);

не пойму что вставлять(выделил зелёным) а так разабрался вроде
jone вне форума Ответить с цитированием
Старый 19.12.2011, 21:33   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

см пункт 2 первого ответа.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.12.2011, 21:40   #10
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

Цитата:
var
pLL,pDLLPath,pCH,poo:Pointer;
hProcess,hThr:THandle;
LibPathLen,_WR,ThrID:DWORD;
ProcessID:integer;
begin
ProcessID:=3676;
hProcess:=OpenProcess(PROCESS_ALL_A CCESS,false,ProcessID);
poo:=VirtualAllocEx(hProcess, 0, 0, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

if hProcess=0 then exit;
pCH:=GetProcAddress(GetModuleHandle (kernel32),'CloseHandle');
hThr:=CreateRemoteThread(hProcess,0 ,0,pCH,poo,0,ThrID);
CloseHandle(hProcess);
end;
Делаю так не работает в чём ошибка я в этом не очень разбераюсь помагите пожалуйста
jone вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Undeclared identifier Handle в Delphi 2010 demiancz Общие вопросы Delphi 2 24.08.2011 12:44
Запуск процесса в потоке, завершение процесса в указааноое время, Дайте совет Человек_Борща Общие вопросы Delphi 3 29.08.2010 12:58
Как узнать handle окна имея handle обного из его компонентов SeRhy Win Api 2 18.10.2009 19:31
Как имея handle окна узнать handle edit-a который находится в етом окне SeRhy Общие вопросы Delphi 1 20.07.2008 13:48