Analizando archivos en VirusTotal con Go

Gustavo García
3 min readJan 3, 2018

--

Recientemente me he aventurado con uno de los lenguajes que, para mí, vino para quedarse y destronar algunos dinosaurios. Este lenguaje es Go.

Listar, detallar y explicar las numerosas ventajas que ofrece Go, haría esta publicación aún más larga; por ende, me limitaré solo a decir de Go que “aprovecha muy bien los procesadores actuales, poniendo énfasis en concurrencia”. Una vez dicho esto, vamos al meollo del asunto.

Obteniendo una key para el API de VirusTotal

Lo primero que debemos hacer es obtener una llave en VirusTotal. Para eso solo debemos registrarnos en VirusTotal y, posteriormente, una vez identificados, elegir la opción My API key en el menú de usuario.

Menú de usuario de VirusTotal

Haciendo las peticiones con grequests

Para las peticiones vamos a usar el paquete grequests, el cual nos provee una capa de abstracción actuando como un proxy para el módulo net/http. El método Get the grequests acepta dos parámetros:

  • URL a donde hacer la petición
  • Struct conteniendo las opciones de petición (cabeceras, etc.)

La función Upload de encargará de subir el archivo para proceder con su análisis.

Esta función envía el archivo a VirusTotal usando el struct RequestOptions, añadiendo dentro del cuerpo de la petición la API key y el archivo previamente seleccionado. Finalmente, transforma la respuesta a un struct utilizando el tipo personalizado Scan (lo veremos en breve).

La segunda función, GetReport obtendrá el reporte del análisis previo para mostrarlo por la terminal. Esta función realiza una petición GET a diferencia de la anterior y transforma la respuesta al struct Report (lo veremos en breve).

Ahora veamos los tipos personalizados Scan, Report y ScanResult.

Tipos personalizados

Necesitamos declarar tres tipos personalizados. El primero es Scan y sirve para mapear la respuesta que retorna VirusTotal luego de analizar el archivo.

El segundo es ScanResult y lo usaremos internamente dentro de Report. Esta estructura representa cada resultado del análisis.

Finalmente, el tipo Report representa la respuesta que retorna VirusTotal al pedir los resultados del análisis previo.

Mostrando el reporte por consola

Para mostrar el reporte por consola nos apoyaremos en un paquete interesante llamado tablewriter. Este paquete nos permite imprimir tablas ascii y darle formato, como color.

El código quedaría de la siguiente manera:

Este método itera el map Scans de Report, el cual tiene almacenados varios Scan que representan cada resultado de un motor en específico. Luego añade estos datos a la tabla.

Archivo principal

En el archivo principal solo necesitamos pedir la ruta del archivo a analizar y la llave del API. Finalmente usar las funciones Upload y GetReport para analizar y obtener el reporte y adicionalmente llamar al método Show para mostrar los resultados en una tabla ascii en la consola.

Probando la aplicación

Para probar la aplicación generamos el binario:

go build main.go

Y lo ejecutamos pasándole los argumentos:

virusgotal -file=/ruta/al/archivo.ext -key=<tu api key>

Y nos mostrará lo siguiente:

Código fuente

El código fuente está disponible en mi cuenta de GitHub.

--

--

Gustavo García
0 Followers

Software Engineer. #Go #Node #Python