miércoles, 3 de julio de 2013

Notepad++: Expresión regular I

Recientemente me he descargado el Notepad++. Tenía un fichero de texto, con unas contraseñas hasheadas y con sus correspondientes nombres de usuario. Al encontrarme en Windows, y no tener mucha idea de perl, python, etc... que me permitiera obtener un resultado distinto a lo que tenía almacenado, tomé la decisión de instalarlo. ¿La razón? Es un bloq de notas ampliado. Entre otras cosas, permite realizar búsquedas con expresiones regulares.

¿Qué tenía almacenado? Más o menos, sería algo parecido a esto:

usr001:aabbccddeeff112233445566778899
usr002:a1b1c1d1
usr003:a2b2c2d2
usr004:a3b3c3d3
...
usr333:a1b1c1d1e1ff112233445566778899
...

Bueno, y así sucesivamente.

Mi idea era ver qué podía hacer para dividir en columnas el contenido, teniendo en cuenta que el separador sería el carácter ':' que estuviera más cerca del hash. Pero, una búsqueda rápida no da buenos resultados, ya que casi todo lo que se encuentra sobre selección de columnas con el notepad++ es que la selección se tiene que hacer pulsando la tecla alt. Pero esta opción no tiene en cuenta la separación por carácter, sino por la posición en la que se en encuentra el cursor.

Por lo tanto, hubo que buscar otra solución. Entre otras, saber que por cada parte en la que se divida una búsqueda con expresiones regulares, tendrá un nombre de variable. Si en Windows cada parámetro que se usaba en un batch era %1, %2... En Linux era $1, $2 para los scripts... Aquí se utiliza \1, \2...

Por lo tanto, sólo me quedaba generar mi consulta. He de reconocer, que poco a poco la he ido afinando, porque, la primera búsqueda que monté era algo parecido a esto (de memoria):

\w:[a-zA-Z0-9]

Pero, no me servía, porque sólo cogía la primera letra antes del carácter ':', este mismo, y la siguiente.

Diremos: No pasa nada. A cada uno de los dos grupos, le pongo lo que nos han enseñado siempre:

\w{1,}:[a-zA-Z0-9]{1,}

Pero nada. No hay tutía. Y eso que hice varias combinaciones: poniendo el símbolo '^' y el '$' al final (aunque lo acabaría dejando), poniendo paréntesis... Pero nada. Buscando un poco, encontré que se podía hacer una pequeña solución: utilizar el símbolo '*' para forzar una continuidad. Y sí. Esto funcionó. Para mi no es la solución correcta, pero es válida. Supongo que me entendéis. Para resumir un poco en qué punto estamos, tendríamos algo así:

^([\w]*):([a-fA-F0-9]*)$

Con el inconveniente de que no todas las filas acaban cuadrando con esta expresión. Si os fijáis, estoy solicitando, con '\w', que contenga valores alfanuméricos. Aún así, hay alguno que otro de los que tengo que no entra en esa categoría. Por lo que toca buscar qué líneas no se se han sustituido, utilizando los dos puntos para la búsqueda, e ir afinando la búsqueda. Por ejemplo, añadir en la búsqueda '\W', que excluye los caracteres alfanuméricos e incluye los demás (explicado de una forma muy simple).

Con esta última expresión regular, podremos hacer los cambios que estimemos oportunos para esta necesidad específica. ¿En qué va a consistir la expresión que vamos a poner para el replace? Vamos a hacer un swap de las dos "secciones" que hemos creado, y, además, haremos que sea otro separador el que tengan entre ambas. Pongamos, por ejemplo, el carácter de tabulación. Este se representa con '\t'. Por lo tanto, el replace sería:

\2\t\1

Si os preguntáis para qué puede servir meter una tabulaicón entre medias, recordemos cómo podemos añadir un gran listado de hashes al cain sin morirse de viejo editando sus ficheros de texto.

Si os estáis preguntando por qué  no utilizar una hoja de cálculo, la razón es que éstas tienen un tamaño limitado de filas.Si tu fichero se pasa de esas filas, las estarás perdiendo.

Antes de que se me olvide, algunos enlaces de donde he ido viendo qué hacer:

1 comentario:

  1. Las expresiones regulares son muy útiles (o eso dicen) pero cada vez que me he tenido que pelear con una he tenido que "estudiar" porque nunca me sale a la primera. Mi cabecita no esta hecha para estas cosas.

    Sobre los hash... ¿que estarías haciendo tu con una lista de claves en hash? jajajaja

    Por cierto, las hojas de cálculo tampoco me gustan demasiado para estas cosas pero la limitación del excel a 65 mil filas se la quitaron en el excel 2010 (o un poco antes, no recuerdo bien)

    Gracias por las expresiones regulares, yo también uso Notepad++ y tengo algún ficherito de esos... ;D

    ResponderEliminar