Funciones de AMSI

Funcions d'AMSI

Celia Catalán


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.


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.

Juan Gabriel RuizSenior Security Analyst at Zerolynx Zerolynx .




Tornar al bloc

Deixa un comentari

Tingueu en compte que els comentaris s'han d'aprovar abans que es publiquin.