[pso] [tema1][win]iterare peste lista de procese
Andrei Popa
ca at i-neo.ro
Sat Mar 17 04:10:51 EET 2007
On Sat, 2007-03-17 at 01:01 +0200, Razvan Deaconescu wrote:
> Andrei Popa wrote:
> > On Sat, 2007-03-17 at 00:15 +0200, Andrei Popa wrote:
> >
> > sau te plimbi direct prin lista de procese a windowsului:
> >
> > http://cs.pub.ro/~pso/lxr/source/base/ntos/inc/ps.h?v=wrk-1.2#238
> >
> > aici e definita structura pe care o obtii prin PsGetCurrentProcess()
> > si ai o intrare "LIST_ENTRY ActiveProcessLinks" care este o lista dublu
> > inlantuita prin care te plimbi cu Flink(forward) si Blink(backward).
> >
>
> din pacate, nu e asa de simplu; am incercat sa facem acest lucru ca
> exercitiu de laborator 2 echivalent cu exercitiul de laborator de Linux
> in care se parcurgeau procesele din sistem
>
> totusi, pe Windows, nu ai acces la tipul structura EPROCESS; ai acces la
> pointer-ul la tip (adica PEPROCESS(, dar nu la tipul EPROCESS si, drept
> urmare, nu poti sa investighezi procesele curente; cu alte cuvinte nu
> poti obtine elementul ActiveProcessLinks dintr-o astfel de structura,
> intrucat nu poti obtine nici macar tipul structurii; kernel-ul de
> Windows este destul de "inchis"; iti permite accesul limitat la
> resursele kernel-ului de obicei pe baza functiilor din DDK
>
> Razvan
:)
Singura dificultate este ca trebuie aflate offset-urile la
ActiveProcessLinks
si ImageFileName care difera in functie de versiunea de windows, daca au
modificat structura EPROCESS.
Mai e si faza ca aceasta lista este protejata de un lock, caruia trebuie
sa-i afli adresa si sa il acquire/release ca sa ai lista consistenta dar
n-am mai facut si asta...
am facut un mic tutorial:
Instalati DDK-ul pt. versiunea de windows pe care o aveti:
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
Instalati debugging tools:
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
Daca nu aveti conexiune la internet permanenta downlodati si instalati
symblourile:
http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx
In WinDbg:
File->Symbol File Path si se introduce "srv*c:
\tmp*http://msdl.microsoft.com/download/symbols" daca aveti internet.
Daca nu, dati calea unde ati instalat symbourile de mai sus.
File->Kernel Debug, selectati tab-ul "Local" si apasati OK.
Dati comanda "dt nt!_EPROCESS" pt. a va arata structura EPROCESS.
Acum puteti sa vedeti la ce offset se afla campurile in structura
EPROCESS.
Inlocuiti in codul sursa cele doua offset-uri, compilati si incarcati
modulul avand Dbgview pornit si va va printa lista de
procese.(offset-urile de mai jos sunt pe windows xp sp2).
sci.c:
--------------------------------------
#include <ntddk.h>
void DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("driver unload");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING registry)
{
PLIST_ENTRY CurrentProcess, NextProcess;
char ProcessName[16];
/* offsetul ActiveProcessLinks din structura EPROCESS */
ULONG ListEntryOffset=0x88;
/* offsetul ImageFileName din structura EPROCESS */
ULONG NameOffset=0x174;
driver->DriverUnload = DriverUnload;
DbgPrint("driver load");
/* adresa ActiveProcessLinks */
CurrentProcess=(PLIST_ENTRY)(((char*)PsGetCurrentProcess())+ListEntryOffset);
NextProcess=CurrentProcess;
while ( NextProcess->Flink != CurrentProcess ) {
memset(ProcessName, 0, sizeof(ProcessName));
/*
din adresa lui ActiveProcessLinks scadem ListEntryOffset
pt. a ajunge la inceputul
structurii EPROCESS pt. procesul respectiv si adunam
NameOffset ca sa ajungem la
campul de nume
*/
memcpy(ProcessName, ((char
*)(NextProcess)-ListEntryOffset+NameOffset), 16);
DbgPrint("process:%s", ProcessName);
/* urmatoarea intrare din lista ActiveProcessLinks */
NextProcess=NextProcess->Flink;
}
return STATUS_SUCCESS;
}
--
Andrei Popa - 341C3
More information about the pso
mailing list