IpToKml (Console Application Source)

Iniciado por Novlucker, 26 Octubre 2012, 16:52 PM

0 Miembros y 4 Visitantes están viendo este tema.

Novlucker

Buenas,

Hace algunos días y por cosas que no vienen al caso, se me dió por crear una pequeña tool (aplicación de consola) que se encarga de parsear N fuentes de datos, extraer IP's, geocalizarlas y volcarlas a un archivo KML (este tipo de archivos puede cargarse en Google Earth y Google Maps entre otros).

La idea de este post es justamente compartir la tool que he mencionado antes.

Comentarios generales:

  • Aplicación de consola (como ya he mencionado).
  • Utiliza la base de datos y las clases de Maxmind.
  • Utiliza commandline para el parseo de los parámetros de línea de comandos.
  • Extensible haciendo uso de MEF (Managed Extensibility Framework). Dado que la aplicación puede recibir datos de entrada de N fuentes, lo que hice fue crear un componente "parser". De este modo solo basta con crear un nuevo "parser" (dll) para que dinámicamente la aplicación los reconozca y pueda hacer uso de ellos (solamente deben de agregarse dentro de la carpeta "Extensions").

    En el source van 4 parsers básicos que he desarrollado:
    • Connections: identifica las conexiones actuales de la máquina, similar a netstat.
    • Pcap: extrae IPs de un archivo de captura de red pcap (de Wireshark por ejemplo).
    • PlainText: cualquier archivo que pueda ser reconocido como de texto.
    • Web: obtiene IPs desde una url especificada.

Ejemplo de uso:
Código (dos) [Seleccionar]
C:\IpToKml\IpToKml\bin\Release>IpToKml.exe

Available Parsers:
       + Connections
       + Pcap
       + PlainText
       + Web

Usage:
       IpToKml.exe ParserName --help

C:\IpToKml\IpToKml\bin\Release>IpToKml.exe web --help


 u, url    Required. Url del sitio web.
 help      Display this help screen.

C:\IpToKml\IpToKml\bin\Release>IpToKml.exe web -u "http://www.malwaredomainlist.com/mdl.php?search=&colsearch=All&quantity=All"

21:44:39 Parsing Started
21:44:46 Parsing Completed
21:44:46 Finalizing
       Available IP Addresses : 2103
       Unavailable IP Addresses : 9
       Total IP Addresses : 2112
21:44:47 Output File C:\Dropbox\WEB_251020124439.kml

C:\IpToKml\IpToKml\bin\Release>



Configuración:
Para poder utilizarlo correctamente hay que cambiar dos settings en el config de la aplicación (IpToKml.exe.config)
Código (xml) [Seleccionar]
<?xml version="1.0"?>
<configuration>
 <appSettings>
   <!--Ruta completa al archivo dat de la base de datos de IP-->
   <add key="GeoIpDb" value="C:\GeoIpDb\GeoLiteCity.dat"/>
   <!--Carpeta de salida para los KML generados-->
   <add key="KmlFolder" value="C:\Dropbox\"/>
 </appSettings>
</configuration>


Descarga de código fuente: http://bit.ly/IpToKml (C# Visual Express 2010)

Cualquier consulta y/o comentario ya saben ;)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

r32

Se ve muy interesante aunque no manejo base de datos.
Por curiosidad si se quisiera saber si la conexión se establece a través de un proxy, ¿lo volcaría desde la base de datos o se crearía un nuevo parser para ésto?
No se como se hacen, me intriga aunque no sepa bien el manejo.
No lo he probado pero puede ser que ese dato te lo de el geolocalizador...

Saludos.

Novlucker

#2
Cita de: r32 en 26 Octubre 2012, 18:16 PM
Se ve muy interesante aunque no manejo base de datos.
En realidad la base de datos de Maxmind esta en binario para que ocupe muchísimo menos espacio. En la aplicación hay unas clases específicas proporcionadas por esa misma empresa que permite hacer la consulta (son las que tienen el Copyright).

Cita de: r32 en 26 Octubre 2012, 18:16 PM
Por curiosidad si se quisiera saber si la conexión se establece a través de un proxy, ¿lo volcaría desde la base de datos o se crearía un nuevo parser para ésto?
No he entendido :-\

Por ejemplo, en el ejemplo que he dado antes lo que se hace es extraer las IP que figuran en esta página http://www.malwaredomainlist.com/mdl.php?search=&colsearch=All&quantity=All (tercera columna), buscar las coordenadas en la base de datos, y generar un KML con puntos por cada IP, si se quisiera el parser podría incluir más data (se puede incluir en la descripción de cada punto), pero he dejado los parsers de modo muy básico.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

r32

Citarsi se quisiera el parser podría incluir más data (se puede incluir en la descripción de cada punto), pero he dejado los parsers de modo muy básico.

Más o menos a eso me refería, cuando extrae la IP se podría verificar si la conexión se hace a través de un proxy anónimo por ejemplo, entonces se engañaría la geolocalización supongo.
Quizás no sirva para nada, era sólo curiosidad, intentaré aprender más sobre éste tema.

Gracias, saludos.

Novlucker

#4
Si, se podría hacer eso si el parser lo implementara :)

Cita de: r32 en 26 Octubre 2012, 19:45 PM
Quizás no sirva para nada, era sólo curiosidad, intentaré aprender más sobre éste tema.

Quizás la propia utilidad no sirva para nada a nivel de funcionalidad y solo me sirva a mi, la idea de compartir el código es que quienes desarrollan y quieren profundizar algunos temas puedan ver el código como ejemplo, se puede decir que tiene de todo:

  • Herencia y Polimorfismo
  • Uso de settings
  • Plugins
  • Serialización
  • LINQ
  • Eventos y delegados
  • Etc...

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Keyen Night

Cuando un proyecto esta hecho con las mejores practicas y formas de hacer la cosas, es bueno leerlo solo por el hecho de que contiene mucha información de pequeños detalles que al final puede ayudar en cualquier proyecto sin importar para lo que funcione. Normalmente este tipo de proyectos que solo uno hace para compartir, son de ejemplo debido al detalle que se le ha puesto al código, sino entonces lo hubiese lanzado como una aplicación. Excelente ;)
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Novlucker

Es la idea :D, hay un solo detalle que tal vez me gustaría haber cuidado mejor, el manejo de excepciones :silbar:, hubiese sido agregar un try/catch en el Program.cs a la hora de invocar los "parsers" :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

r32

Novlucker no me refería a que el código no sirviese  :huh:, me refería a lo que yo te comentaba del proxy, que tampoco pueda servir de mucho ese dato, me entendiste mal.
Por mi el codigo está muy bien, ya te lo comenté, lo descargué y miré los parsers, luego me surgió la duda de lo del proxy.

Siento el mal entendido, saludos.

Novlucker

Yo siento el mal entendido, en realidad entendí perfectamente lo que querías decir, pero en realidad yo quise llevar eso un poco más allá y por eso dije que "quizás la propia utilidad [...]", debí de agregar un "incluso" :P

Si llegaste a ver algo del código, se aceptan comentarios o consultas si las hubiese :P


Saludos

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

r32

Si que pude ver el código, te comento, al generar lo compila todo correctamente sin errores pero me salían 4 adverténcias referentes a:

CS0169: El campo 'LookupService.licensekey' no se usa nunca
CS0414: El campo 'LookupService.dnsService' está asignado pero el valor no se usa nunca
CS0414: El campo 'LookupService.STATE_BEGIN' está asignado pero el valor no se usa nunca
CS0649: El campo 'IpToKml.Program.parsers' nunca se asigna y siempre tendrá el valor predeterminado null

Los tres primeros refieren a LookupService.cs, el último a Program.cs
Los comentarios que dejaste en algunos códigos ayudan a orientarse un poco a los que no sabemos, se agradece eso.