[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