[pso] [Tema1][win] Interceptare apeluri de sistem

Claudiu Mihail claudiu.bogdan.mihail at gmail.com
Sat Feb 26 22:56:14 EET 2011


Claudiu Mihail <claudiu.bogdan.mihail at ...> writes:

> 
> 
> Salut,
> 
> Am cateva nelamuriri in legatura cu tema 1 pe windows. Legat de interceptarile 
apelurilor de sistem am inteles ca trebuie inlocuit SDT-ul (service descriptor 
table) cu unul nou care sa contina si noua inregistrare, adica MY_SYSCALL_NO. 
Zis si facut. Acum, legat de structura struct std, daca am inteles bine, atunci 
cand vine un apel de sistem se cauta dupa index in service table adresa efectiva 
a rutinei (ca se se faca jump la ea). Ca sa fac interceptarea, intuitia imi 
spune ca ar trebui sa inlocuiesc adresele din service table cu adresa rutinei 
mele de tratare, care in cele din urma va chema rutinele corecte, dupa logging 
and stuff. Presupunand ca ce am spus pana acum este corect, intrebarea este cum 
chef rutinele corecte din rutina mea de tratare? Bag niste cod de asm si fac 
jump (sau call) la adresa rutinei corecte? Daca da sa inteleg ca service 
parameter table imi da lista de bytes care reprezinta argumentele rutinei 
apelate si in consecinta trebuie sa fac push la toti acesti bytes pe stiva? Daca 
nu atunci cum ar trebui abordata problema?
> 
> Intreb pentru ca in cursul doi nu este foarte detaliat explicata partea de 
windows, iar in documentatia de pe net este destul de greu de gasit ceva foarte 
relevant (e posibil sa nu stiu eu ce sa caut, caz in care as aprecia niste 
pointeri).
> 
> Thanks in advance,
> Claudiu
> 
> 
> _______________________________________________
> http://elf.cs.pub.ro/so2/wiki/resurse/lista-discutii

Salut,

Revin pentru a-mi corecta propriile aberatii (eventual cu altele). In primul 
rand citind mai in detaliu am aflat ca atunci can se cere un apel de sistem dupa 
un lung sir evenimente se ajunge la un apel al functiei KiSystemService(). Asta 
aparent foloseste doua valori stocate in registrii eax si edx. Registrul eax 
este indexul folosit pentru SDT pentru a accesa adresa rutinei din ntoskrnl.exe 
precum si pentru a afla cati bytes are ca argumente rutina apelata. Asadar 
campul spt din structura reprezinta numarul total de bytes al parametrilor 
rutinei apelate. Iar argumentele efective (ca sir de bytes) se gasesc la adresa 
din edx.

Deci pentru a chema rutina mea ar trebui sa copiez argumentele rutinei de pe 
"stiva user" (adress of which is stored in edx) pe "stiva kernel" si pe urma sa 
fac call la rutina dorita.

Cel putin asta am inteles so far.
Claudiu




More information about the pso mailing list