[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