Get it on Google Play

Accediendo al API de VirustTotal desde Java

03-06-2014
 

VirusTotal

VirusTotal es un servicio gratuito que nos permite analizar archivos y URLs sospechosas. Además tiene una estupenda API que nos permite integrar este servicio a nuestros desarrollos. Esta API nos da mucho juego, por ejemplo, podemos comprobar si los archivos o links que la gente sube a nuestra web están libres de virus.

Integrase con la API(Aquí tenéis la documentación) es muy sencillo con cualquier lenguaje de programación, por ejemplo, en Java tenemos un par de implementaciones. Personalmente, no he querido usar estas implementaciones, básicamente porque me pareció mas fácil no usarlas.

Para usar la API tenemos que registrarnos y nos facilitan una ‘API key’, para identificar el usuario que utiliza el servicio. Para escanear un archivo, debemos hacer mínimo dos llamadas, una a ‘/scan’ para subir el fichero y otra a ‘/report’ para recoger el resultado(El resultado tarda unos minutos en aparecer).

En mi ejemplo he creado dos funciones, una ‘scan(String filename)’ y otra ‘report(String scanId)’. Además he creado el método ‘postForm( String url, String[][] params, String[][] files )’, para hacer llamadas posts genéricas.

Para que el código funcione necesitáis HTTP Components de la Apache Software Foundation.

public class VirusTotal {
	String url="https://www.virustotal.com/vtapi/v2/file";
	String akey="XXXXXXXXXXXXXXXX";

	public static void main(String[] params) {
		
		try {
			VirusTotal vt=new VirusTotal();

			String scanId=vt.scan("imagen.png");
			System.out.println( scanId );
			vt.report( scanId );
		} catch (Exception ex) { ex.printStackTrace(); }

		}

	public void report( String scanId ) throws Exception {
		ByteArrayOutputStream ret=postForm( url+"/report",
			new String[][] {
				{ "apikey",akey },
				{ "resource",scanId }
				},
			null
			);

		System.out.println( ret.toString() );
		}


	public String scan( String fileScan ) throws Exception {
		ByteArrayOutputStream ret=postForm( url+"/scan",
			new String[][] {
				{ "apikey",akey }
				},
			new String[][] {
				{ "file",fileScan }
				}
			);

		String s=ret.toString();
		s=s.substring( s.indexOf("scan_id")+11 );
		s=s.substring( 0,s.indexOf("\"") );

		return s;
		}

	public ByteArrayOutputStream postForm( String url, String[][] params, String[][] files ) throws Exception {
		ByteArrayOutputStream ret=new ByteArrayOutputStream();

		CloseableHttpClient httpclient = HttpClients.createDefault();
		HttpPost httppost = new HttpPost(url);

    		MultipartEntityBuilder meb = MultipartEntityBuilder.create();

		for ( int i=0; i<params.length; i++ ) {
	      		StringBody param = new StringBody( params[i][1], ContentType.TEXT_PLAIN );

			meb=meb.addPart( params[i][0],param );
			}

		if ( files!=null )
			for ( int i=0; i<files.length; i++ ) {
		      		FileBody file = new FileBody(new File( files[i][1] ));

				meb=meb.addPart( files[i][0],file );
				}

               	HttpEntity reqEntity=meb.build();

		httppost.setEntity(reqEntity);

       		CloseableHttpResponse response = httpclient.execute(httppost);

               	HttpEntity resEntity = response.getEntity();
               	if (resEntity != null) 
			resEntity.writeTo( ret );

		EntityUtils.consume(resEntity);
		response.close();
		httpclient.close();

		return ret;
		}
	}

Leave a Reply

© Albert Coronado Calzada