Re[2]: [so] Intrebari tema 2
George Adrian Drumea
so@cursuri.cs.pub.ro
Sat, 13 Nov 2004 16:44:08 +0200
>> > 4. Este necesar sa restauram hookurile la descarcarea tipd (pt
>> > procesele injectate la pornire)?
>> >
>> > 5. Tipd incearca sa injecteze toate procesele din sistem, sau numai
>> > ale userului curent logat (cel care ruleaza tipd)?
>>
>> Hook-ingul trebuie sa functioneze doar pentru procesele pe
>> care le rulati avand biblioteca de interceptare in directorul
>> curent (de lansare al comenzii).
CA> Si un citat din tema: "Pentru a porni interceptarea este suficient
CA> ca biblioteca ce contine functiile de interceptare sa se afle in
CA> directorul curent".
CA> Dar singura metoda (din cate stiu eu) de a face ca un DLL sa fie
CA> incarcat automat de catre un program este ca DLL-ul sa reprezinte
CA> un proxy. Adica in cazul nostru sa se cheme kernel32.dll si sa
CA> suprascrie toate functiile din biblioteca originala. Treaba care
CA> nu este neaparat posibila (nu toate functiile din kernel32.dll
CA> sunt documentate).
CA> Se poate face incarcarea DLL-ului prin injectare, dar este alt
CA> lucru si nu vad ce legatura are cu directorul unde se afla
CA> biblioteca noastra.
Pentru aplicatiile care importa user32.dll exista o cheie in registry
care specifica o lista de dll-uri ce pot fi incarcate la startup
(imediat cum se incarca user32.dll). Mai multe informatii la:
http://support.microsoft.com/kb/q197571/
Ramane totusi problema cu aplicatiile de consola.
Alta posibilitate ar fi un hook global pe CreateProcess care
injecteaza automat fiecare proces pornit cu dll-ul respectiv. Aceasta
metoda are avantajul ca un proces poate fi creat suspendat si injectat
inainte sa apuce sa ruleze vreo instructiune proprie (lucru binevenit
mai ales ca operatiile de hooking pe functii sunt inerent
thread-unsafe). Desigur, trebuie ca cel putin un proces care lanseaza
alte procese sa fie injectat la inceput de catre tipd (cmd.exe sau
explorer.exe).
In ambele cazuri, incarcarea .dll-ului reuseste numai daca se afla in
path (ceea ce in windows include si dir curent), deci are intr-un fel
legatura pt ca se poate limita injectarea lasand dll-ul intr-un folder
care nu este in path si lansand procese numai din acel director. Cum
vad eu un posibil scenariu de testare: se lanseaza tipd, se lanseaza
cmd.exe intr-un dir ce contine .dll-ul, si apoi se monitorizeaza
procesele lansate de cmd.exe (asta folosind a doua metoda).
Pe langa cele doua metode sincrone enumerate mai sus, exista si metode
asincrone (cum ar fi enumerarea periodica a proceselor si injectarea
celor neinjectate inca), insa la acestea e posibil sa fie necesara o
injectare cu suspendare in prealabil a threadurilor procesului.