Analizando archivos en VirusTotal con Go
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.
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.