[pso] [Tema 1 win] - REPLY - problema la setarea parametrilor syscall-ului pe stiva

Cristi Lazea cricotanierea at gmail.com
Thu Apr 3 15:46:23 EEST 2008


In old_stask (ebp+8) am exact ce am si in new_stack
(afisez in paralel valorile de la cele 2 adrese si sunt identice).
Si sunt identice din cauza instructiunii:

memcpy(new_stack, old_stack, params);

care se apeleaza dupa partea de asm (asa era in curs)

"do_monitor()" nu este functia mea (e inselatoare la nume).
Este functia din fiesierul de test (test.c).
Aici mi-am bagat eu niste printf-uri ca sa vad cu ce parametrii se apeleaza
un syscall ce a fost interceptat. Si acesti parametrii se genereaza aleator
aici in
do_monitor(). Mai apoi, in functia find_log() (tot din test.c) se compara
valorile acestor parametrii cu valorile pe care le-am copiat eu
din driver in EventLog (in campul DumpData, alaturi de syscall_no, ret_code,
arg_no,...).
Tot ce am generat eu in driver e identic cu ce e sin fisierul de test
(syscall_no, ret_code, arg_no,...),
in afara de acesti parametrii pentru syscall (e un apel in find_log unde se
compara
      memcmp(args, lp->syscall_arg, sano*4);
iar aici la mine tot timpul da diferit (am pus un printf ca sa ma lamuresc)
Din motivul acesta am inceput sa sap in functia mea
de interceptare, ca sa vad ce pun eu in packetul de log ca si parametrii pt
syscall.

Am dedus ca e o greseala la pusul - luatul din stiva, deoarece
am facut urmatorul test:
  - mi-am afisat valorile de la adresele "old_stack" si "new_stack" (ele au
acelasi continut)
in momentul in care le-am pus proaspat in stiva. (instructiunea cu EAX e
prima din functie,
inaintea ei fiind doar niste declaratii de variabile, fara nici o
initializare; am initializari
instructiunea cu EAX si celelalte instructiuni ASM) (plus ca EAX-ul imi
returneaza ce trebuie)
 - apoi am construit un log_packet
 - l-am incapsulat intr-un PIO_ERROR_LOG_PACKET alocat cu
IoAllocateErrorLogEntry
 - apoi, inainte sa apelez IoWriteErrorLogEntry(my_log_entry), mi-am afisat
(prin despachetare)
campul cu parametrii (syscall_arg) din DumpData[0], iar aceste valori erau
identice cu cele
pe care le afisasem initial pentru "old_stack" si "new_stack".

In felul asta m-am asigurat ca ce am incapsulat eu in acel packet de log
corespunde cu ce
am luat de pe stiva.
Si avand in vedere ca erau aceleasi valori, inseamna ca le-am impachetat
bine,
iar eroarea inclin sa cred ca e de la partea de ASM (caci de acolo am plecat
cu valorile eronate).


Mentionez inca un lucru: partea de ASM e apelata o singura data ( la
inceputul metodei
mele de interceptare, in momentul in care imi iau si syscall_no din eax),
iar in momentul in care eu bag date in pachetul de log (mai jos prin metoda
de
interceptare), le iau de la adresa "old_stack".
E ok asa?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://cursuri.cs.pub.ro/pipermail/pso/attachments/20080403/5844f950/attachment-0001.htm 


More information about the pso mailing list