II
. ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ
Ц
Кроме того, часто у пользователя
появляется необходимость опреде-
лить путь, откуда запущен тот или иной
процесс, что не позволяет сделать
стандартный менеджер процессов
WihdowsNT/XP.
Исходя из вышеизложенного, опре-
делим основные требования к нашему
детектору:
- мониторинг текущих видимых про-
цессов;
- отделение скрытых процессов от
видимых;
- определение пути запущенных
процессов;
- возможность завершения выбран-
ного пользователем процесса.
Р азр аб о тка ПО
и средства отладки
Итак, приступим к основной зада-
че. Для работы нам понадобиться сле-
дующее:
- среда Borland Delphi 5-7;
- утилита Dependency Walker из ком-
плекта Visual C++ 6.0 [4].
В средах NT/XP информацию о си-
стемных и пользовательских процес-
сах предоставляет стандартная биби-
лиотека ntdll.dll. Рассмотрим экспор-
тируемые ею функции с помощью ути-
литы Dependency Walken
- ZwQuerySystemlnformation;
- CreateToolhelp32Snapshot.
Определим образцовую функцию,
получающую список процессов, резуль-
тат которой будем сравнивать сданны-
ми второго метода (вставка 1).
И, конечно же, второй метод для от-
деления скрытых процессов от види-
мых (вставка 2).
Ну и, конечно же, получаем путь,
откуда был запущен тот или иной про-
цесс (вставка 3).
“Убиваем” выбранный процесс
(вставка 4).
Итак, после компиляции проекта,
если у вас в системе присутствует скры-
тый процесс, утилита покажет его ста-
тус и путь, откуда был произведен за-
пуск, что позволит с легкостью обнару-
жить и при необходимости ‘Уничтожить"
(рис. 4).
Закл ю чени е
Следует учитывать, что абсолютной
надежности данные методы не обес-
печивают и позволяют выявить лишь
Получение имени процессов
вставка 3
procedure geLnam e(h:thandle; g1 :tstringgrid);
varW nd :h W n d;
buff: A R R A Y [0.
.127] O F Char;
P id : Cardinal;
i:integer;
'
m o d arr: TM oduleArray;
Nam e: String;
begin
g1.Row Count:=2;
W nd:= G etW indow (h, gw _HW ndFirst);
W H IL E WndO D O
begin
If (GetW indow Text(W nd, buff, sizeof(buff)) o ) then begin
fillchar(nam e,sizeof(nam e),#0);
GetW indow Text(wnd,buff,sizeof(buff));
//if getm odulefilenam e(G etW indow Long(w nd,G W L_H IN STAN CE),nam e,sizeof(nam e))=0 then nam e:=’N U I';
//-------------------------------------------------
G etW indow ThreadProcessld(W nd,@ Pid);
m odarr:= G etM o dulesU stByPro cessld(Pid);
nam e:='Null';
for i:=0 to H igh(m odarr) d o
begin
if lnteger(m odarr[i].m odBaseAddr)=$400000 then begin
nam e:= m odarr{i],szExePath;
break;
end;
end;
//--------------------------------------------------
g1 ,Cells[0,g1 .Row Count-1]:= StrPas(buff);
g1 .CeUs(1 ,g1 .Row Count-1]:= name;
g1 .Row Count:=g1 .Row Count+1;
end;
W nd := GetW indow (W nd, gw _hW ndNext);
end;
g1 ,Row Count:=g1 .Row Count-1;
end;
идентификатор процессов
function G e tM odulesU stByProcessld(Proce ssld:C ardinal): TM oduleArray;
va r hSnapshot: THandle;
Ipm e: TM oduleEntry32;
procedure AddM oduleToU st;
begin
SetLength(Result,H igh(Result)+2);
Result[high(Result)]:=lpm e;
end;
begin
SetLength(Result,0);
h Sn ap sh o t:=C re ate T o o lhe ip 32Sn ap sh o t(T H 32C S_SN A P M O D U LE ,P ro ce ssld );
//if hSnapshot=-1 then R aiseLastW ln32Error;
lpm e.dw Size:=SlzeO f(lpm e);
it M odule32First(hSnapshot,lpm e) then
begin
AddM oduleToU st;
w hile M odule32Next(hSnapshot,lpm e) d o
AddM oduleToU st;
end;
end;
путь к запущ ен ном у процессу
function get_path(pid: cardinai):strfng;
vari:integer;
m odarr: TM oduleArray;
begin
m odarr:=G etM odu!esListByProcessld(Pid);
result:='NuH';
for i:=0 to H igh(m odarr) d o
begin
if lnteger(m odarr[i].m odBaseAddr)=$400000 then begin
re su lts m odarr]i].szExePath;
break;
end;
end
end;
Радиолюбитель - 0 9 /2 0 0 8 [|
7
предыдущая страница 7 Радиолюбитель 2008-09 читать онлайн следующая страница 9 Радиолюбитель 2008-09 читать онлайн Домой Выключить/включить текст