
Funcions d'AMSI
Celia CatalánCompartir

Molt bones a tots! Fa unes quantes publicacions, parlem sobre la introducció a AMSI. Avui continuarem endinsant-nos a
el món d'AMSI. En aquesta ocasió, aprofundirem en les funcions que
utilitza intèrprets com PowerShell per comunicar-se amb les mesures de
seguretat gràcies a l'API AMSI.
Com que AMSI forma part del Windows API (user-mode),
està documentada per Microsoft perquè els desenvolupadors no tinguin problema
en fer-la servir. És a dir, les llibreries de la Windows API tenen documentació
sobre com s'estructuren les seves funcions, quins paràmetres espera cada
funció, valors que rep, etc.
En primer lloc, tenim la funció AmsiInitialize. Aquesta
funció es diu abans que executem qualsevol ordre a la PowerShell, és
dir, aquesta funció s'anomena en el moment en què s'executa l'intèrpret.
Per tant, és una funció complicada per atacar i fer un bypass, a causa de
que no es pot modificar la lògica mitjançant ordres PowerShell.
La documentació de Microsoft ens diu que aquesta funció
rep dos paràmetres:
- El primer paràmetre és el nom de la aplicació que utilitzarà la DLL, que en el nostre cas serà PowerShell.
- El segon paràmetre és un punter buit anomenat amsiContext. Aquest punter serà emplenat per la funció AmsiInitialize i serà utilitzat amb la resta de funcions.
Tant en aquesta funció com en la majoria de funcions de
AMSI es torna HRESULT, que és un codi que representa si la funció s'ha
executat de manera reeixida o no. La llista de codis la podem veure a la
documentació de Microsoft.
La funció següent és AmsiOpenSession. Cada vegada que es
executa una ordre PowerShell, cal crear una sessió amb AMSI, per això
que s'anomenarà aquesta funció.
La documentació de Microsoft ens diu que aquesta funció
també rep dos paràmetres:
- El primer argument és amsiContext, que equival al context que s'ha emplenat a l'anterior funció.
- El segon argument és un punter buit anomenat amsiSession. Aquest punter serà emplenat per la funció AmsiOpenSession i serà utilitzat per altres funcions.
Com AmsiInitialize, retorna un codi que
representa si la funció s'ha executat amb èxit o no.
En tercer lloc, tenim AmsiScanString i AmsiScanBuffer.
Ambdues funcions tenen la mateixa comesa i la forma d'utilitzar-se és força
similar. Tant és així, que en realitat AmsiScanString truca per sota a
AmsiScanBuffer. La tasca d'aquestes funcions és capturar el contingut d'un
comanda perquè posteriorment l'escanegi l'AV/EDR.
La documentació de Microsoft ens
diu que AmsiScanString rep cinc paràmetres:
- El primer argument representa context que ha omplert la primera funció (AmsiInitialize).
- El segon argument és un string, que representa el contingut de l'ordre.
- El tercer argument és una espècie de identificador.
- El quart argument és la sessió, que com hem vist prèviament, s'ha emplenat a la funció AmsiOpenSession.
- Finalment, amb el cinquè argument la funció rep un punter buit que representarà el resultat de l'escaneig (ca dir, si l'AV/EDR diu que és malware o no). Els valors poden ser els següents:
D'altra banda, AmsiScanBuffer
rep, en lloc d'un string que representarà l'ordre, un buffer.
A més, també cal indicar la longitud del buffer. Els altres
arguments són iguals per a totes dues funcions.
Finalment, tant per
AmsiScanString com per AmsiScanBuffer es torna HRESULT, que de la mateixa
forma que a les funcions anteriors, representa si la funció s'ha executat
correctament. Cal destacar que no cal confondre el resultat de l'escaneig
amb el resultat de la funció, que són dos valors completament diferents.
Tot i això, són valors que
sí que són dependents entre si. El contingut de result no pot ser
AMSI_RESULT_DETECTED, si HRESULT és E_INVALIDARG, ja que això significaria
que no s'executaria l'anàlisi perquè els arguments no són vàlids.
Però si per un casual, per algun
tipus d'error, el contingut de result representa que hi ha codi maliciós,
però HRESULT és INVALIDARG, la comanda s'executarà amb normalitat, ja que
primer es comprovarà HRESULT, i si aquest indica que s'ha executat la funció
amb normalitat, comprovarà el contingut de result.
Finalment, tenim la funció
AmsiCloseSession, que té lloc quan ja s'ha fet l'escaneig. Aquesta
funció s'anomena també quan s'executa una ordre a PowerShell. La tasca
d'aquesta funció és tancar la sessió perquè no es pugui tornar a fer servir.
La documentació de Microsoft ens
diu que rep dos paràmetres:
- El context de la inicialització.
- La sessió que es vol tancar.
Com que és una funció void,
no torna res. És a dir, per part de Microsoft no hi ha control d'errors
per saber si la sessió s'ha tancat amb èxit, o hi ha hagut algun tipus de
error.
Per tant, quan obrim una
PowerShell, el flux de trucades a l'API seria el següent:
I en el moment que ja està la PowerShell oberta i executem ordres, el
flux de trucades a l'API seria el següent:
I per avui, ja està bé!, continuarem amb AMSI en els propers lliuraments.