Erwin.Ried.cl / Desarrollos / Inteligencia artificial /
¿Usted es realmente un humano?

Frecuentemente en la red se pone en duda nuestra existencia biológica. No me refiero al trasfondo filosófico del tema, sino a esa típica prueba en que debemos rellenar un recuadro escribiendo los números y letras de una imagen intentando evitar abusos del sistema. ¿Es realmente confiable esta prueba?, veamos como podemos romper esta ilusión de seguridad programando una pequeña aplicación (21/09/2009 05:09 AM)


La idea de este artículo es poder implementar una pequeña aplicación que logre reconocer un CAPTCHA.

Un CAPTCHA es un tipo de prueba que intenta distinguir humanos de robots, evitando así abusos de los servicios. Actualmente la mayoría de los servicios de la red cuentan con implementaciones de este test, aquí hay algunos ejemplos que probablemente son familiares:

Google

Este es el código que aparece en los servicios de Google, es bastante simple aunque el efecto de distorsión de las letras añade un reto interesante.


Windows Live ID

Los servicios relacionados con Windows Live ID usan este código. Es un tanto más complejo añadiendo formas que pueden dificultar el reconocimiento, además de distorsionar las letras levemente y a diferencia del anterior, de forma independiente.


PayPal

Este código increíblemente simple corresponde a PayPal. Las letras no tienen distorsión y en general creo que es muy fácil reconocer los caracteres por medio de un programa.


Foros y servicios varios

Este es también muy simple y además muy utilizado como añadido en servicios como foros phpBB y otros similares. Las letras no tienen distorsión y el color es totalmente monotono, el cual nunca cambia. Junto con el de PayPal son verificadores extremadamente procesables para un sistema automatizado.


No tengo certeza sobre el origen exacto de este tipo de pruebas, sin embargo he leído reiteradamente de que su principio es el "Test de Turing", concebido por el matemático británico Alan Turing (1912-1954). Turing propuso este test para determinar si las máquinas podrían tener la capacidad de pensar.

En este artículo mi objetivo será abarcar la prueba de verificación de un conocido sitio de remates latinoamericano.


1. Consideraciones previas

Primero que todo hay que tener en consideración de que no existe y probablemente no existirá nunca un procedimiento que permita abordar a todos los infinitos tipos de verificadores.

Intenté encontrar proyectos similares en la red, pero lo único que encontré fue la documentación de los mismos, sin aplicaciones prácticas ni código fuente. Mi idea es intentar mostrar la forma más primitiva de poder realizar un pequeño análisis de imágenes que podría servir como base para cualquier proyecto relacionado.

Personalmente creo que la protección mediante un CAPTCHA es bastante completa para evitar el abuso de los servicios, siempre y cuando se conserve la premisa de que la imagen debe ser de fácil reconocimiento para un humano (algunos servicios olvidan esta simple regla y a veces generan imágenes con un código que es tan distorsionado que provoca que debamos ingresar dos o más veces el mismo debido a que erramos en alguno de los símbolos porque simplemente no podíamos distinguirlo correctamente).

Poder reconocer los valores de un tipo en particular ya es un reto considerable, aunque su dificultad depende exclusívamente de la complejidad y calidad del CAPTCHA.

Los archivos fuentes de este artículo se entregarán por medio de un formulario de correo electrónico, el enlace aparecerá al final de la página, esto pretende evitar abusos.


2. El objetivo

Analicemos las características de algunas de las imágenes de verificación generadas por el sitio que nombré anteriormente:




Características en contra de un robot:
-Las letras tienen rotación leve
-Las letras tienen tamaño aleatorio
-Las letras no tienen un color fijo
-Hay letras y números muy parecidos, como el cero y la letra "O"
-Algunas veces las letras llegan a solaparse

Características a favor de un robot:
-Nunca hay dos letras consecutivas con un mismo color
-La imagen no tiene un efecto de distorsión avanzado
-La imagen no tiene transparencias ni efectos difusos
-Los residuos del fondo no son densos
-El color de fondo es siempre el mismo y predomina


3. Procedimiento de reconocimiento

Tenemos la siguiente imagen al comenzar, generada por el sitio en cuestión:



Primero, debemos retirar los residuos de la imagen. En todo el proceso se utilizará el mapa de bits sin compresión a fin de mantener la integridad de la misma:



Para remover estos residuos, simplemente se busca por todo el objeto gráfico (imagen a reconocer) y por cada punto coloreado se genera una matriz de tres por tres, luego desde el punto central se cuentan los adyacentes, si no cumple con el mínimo, se elimina.

Según la densidad de los residuos puede aplicarse varias veces el procedimiento, aunque el mismo destruye gradualmente la calidad de la imagen por lo que por defecto se aplica una vez.

Código:
div = 5 'Subdivisiones de la imagen
nearMin = 3 'Mínimo de vecinos

For i = div * 2 To Me.imgTemp.Width - (div * 2) Step div
    For j = div * 2 To Me.imgTemp.Height - (div * 2) Step div
               
        nearReal = -1
        color = imgTemp.Point(i, j)
        
        If Not color = vbWhite Then
            For x = i - div To i + div Step div
                For y = j - div To j + div Step div
                    If imgTemp.Point(x, y) = color Then nearReal = nearReal + 1
                Next
            Next
        End If
                       
        If nearReal > nearMin Then
            imgTemp2.PSet (i, j), color
        Else
            imgTemp2.PSet (i, j), vbWhite
        End If
    Next
Next



Ahora que ya tenemos las letras, debemos separarlas. Podemos aprovechar la propiedad descrita anteriormente basándose en que un color nunca se repite entre letras adyacentes, en este caso es bastante simple realizar una separación.

Sin embargo cuando hay dos letras muy juntas se pierde el pedazo inicial de la segunda letra, este problema puede solucionarse retrocediendo hasta el inicio del segundo color, aunque en esta instancia empiezan a ocurrir problemas como por ejemplo letras que tienen grupos separados del mismo color o un píxel residual en la imagen.

Para facilitar el desarrollo del programa, asumí esos pequeños problemas como "aceptables" debido a que ocurren en un porcentaje mínimo.

Para separar las letras, desde el comienzo de la imagen sin residuos se avanza buscando el primer color diferente al color de fondo.

Al encontrar el primer color, se almacena y se sigue avanzando hasta encontrar un cambio de color, otra letra o nuevamente un color de fondo puro (verticalmente). De esta forma se podrán separar todas las letras de la imagen.

Código:
lastColor = -1
pieceNumber = 0
pieceStart = -1
'minWidth = 90
div = 5

'minWidth = (txtMinWidth.ListIndex * 50) + 110

For i = 0 To imgTemp.Width Step div
    actualColor = detectNonWhite(CInt(i), imgTemp)
    
'    If pieceStart <> -1 Then
'        If i - pieceStart > minWidth Then
'            isWide = True
'        Else
'            isWide = False
'        End If
'    Else
'        isWide = True
'    End If
    
'     If (actualColor <> lastColor And isWide) Or _
'    (actualColor <> -1 And actualColor <> lastColor And pieceStart <> -1 And
isWide) Then
    If (actualColor <> -1 And actualColor <> lastColor And actualColor <> vbWhite)
_
    Or (pieceNumber > 3 And actualColor <> lastColor) Then
        'imgTemp2.PSet (i, 10), vbBlack
        'MsgBox i
        
        lastColor = actualColor
        
        If pieceStart = -1 Then
            pieceStart = i
        Else
            imgSplit.Item(pieceNumber).Cls
            
            'Search upper and lower limits
            Dim upper, lower, mLeft, mRight As Integer
            Dim anotherColor As Long

            For mLeft = pieceStart To i Step div
                anotherColor = detectNonWhite(CInt(mLeft), imgTemp)
                
                If anotherColor <> vbWhite And anotherColor <> -1 Then Exit For
            Next
            
            For mRight = i - div To pieceStart Step -div
                anotherColor = detectNonWhite(CInt(mRight), imgTemp)
                'imgTemp2.PSet (i, 10), anotherColor
                If anotherColor <> vbWhite And anotherColor <> -1 Then Exit For
                
            Next
                        
            For upper = 0 To imgTemp.Height Step div
                anotherColor = detectNonWhiteH(CInt(upper), imgTemp, mLeft, mRight)
                
                If anotherColor <> vbWhite And anotherColor <> -1 Then Exit For
            Next
            
            For lower = imgTemp.Height To 0 Step -div
                anotherColor = detectNonWhiteH(CInt(lower), imgTemp, mLeft, mRight)
                
                If anotherColor <> vbWhite And anotherColor <> -1 Then Exit For
            Next

            CopySubImageSplit imgTemp, imgSplit.Item(pieceNumber), CInt(mLeft), _
            CInt(mRight), CInt(upper), CInt(lower), True
            
            imgSplit.Item(pieceNumber).ToolTipText = mRight - mLeft & " x " &
lower - upper
            pieceNumber = pieceNumber + 1
            
            If pieceNumber = imgSplit.Count Then Exit Sub
            pieceStart = -1
            
            'Dim h As Integer
            'For h = 0 To imgTemp.Height Step div
            '    imgTemp.PSet (i, h), vbWhite
            'Next

            lastColor = -1
         End If
    End If
Next


Las funciones detectNonWhite y detectNonWhiteH entregan un color diferente del fondo blanco, recorriendo la imagen de una forma vertical y horizontal respectivamente.

Nótese de la siguiente sección del código:
Código:
CopySubImageSplit imgTemp, imgSplit.Item(pieceNumber), CInt(mLeft), _
            CInt(mRight), CInt(upper), CInt(lower), True


Aquí se realiza un procedimiento primordial. Esto aísla de forma exacta la imagen del caracter, eliminando el borde superior, inferior, izquierdo y derecho. De esta forma del caracter capturado literalmente se amplifica y no importa su tamaño original para procesarlo posteriormente:



En el código dejé con comentarios una sección en donde intentaba asumir un ancho mínimo de cada letra. Sin embargo esta condición queda obsoleta al basar el concepto de "nuevo caracter" sólo al encontrar un cambio de color, pudiendo de esta forma encontrar caracteres con varios pedazos separados (las separaciones se producen al remover los residuos, debido a que esos mismos residuos se aplican sobre la imagen y no bajo la misma, lo cual dibuja algunos puntos dentro de las letras mismas)


Ahora tenemos los caracteres separados de la siguiente forma:


A continuación seguimos con la parte final del reconocimiento, que a la vez nos servirá para el proceso de aprendizaje de la aplicación.

Para cada caracter aplicamos una función muy simple que los convertirá a blanco y negro. Luego todos los caracteres son subdivididos en partes iguales, sin importar su tamaño, para poder extrapolar esta información a un tamaño cualquier posteriormente. La información de estas subdivisiones es transferida a un formato literal muy básico en donde un punto blanco se representará con un cero y uno negro con un uno, dividiendo la imagen de forma horizontal y luego verticalmente.

De esta manera la representación del caracter anterior (la letra "A") quedará similar a lo que se muestra a continuación:



Naturalmente en su estado original no está con el formato que muestra la imagen. Para hacerlo evidente se aplicó el ajuste de línea.

El código en este proceso es bastante entendible. Primero, para convertir la imagen a blanco y negro se usa el siguiente procedimiento:

Código:
Private Sub toBlackAndWhite(fromWhat As PictureBox, toWhere As PictureBox)
Dim i, j, div As Integer
Dim color As Long

div = 15

For i = 0 To fromWhat.Width Step div
    For j = 0 To fromWhat.Height Step div
        color = fromWhat.Point(i, j)
               
        If color = vbWhite Then
            toWhere.PSet (i, j), vbWhite
        Else
            toWhere.PSet (i, j), vbBlack
        End If
    Next
Next
End Sub


Gracias al manejo simplificado de los objetos gráficos, pequeñas modificaciones de este código permitirían convertir las imágenes a escalas de grises, otras tonalidades (como sepia) y jugar gráficamente con la imagen resaltando cambios de color y otras cosas que podrían ser interesantes para otros propósitos.

A continuación está un fragmento del procedimiento final de reconocimiento, en donde se divide la imagen (por defecto son treinta pedazos, en este caso no son píxeles sino subdivisiones de ellos) y se crea la cadena representativa:

Código:
subSteps = 30

For i = imgSplit.LBound To imgSplit.UBound
    output = ""
    
    iHeight = Fix(imgSplit(i).Height / subSteps)
    iWidth = Fix(imgSplit(i).Width / subSteps)
    
    adjust = imgSplit(i).Height - iHeight
    
    For y = 0 To iHeight * subSteps Step iHeight
        For x = 0 To iWidth * subSteps Step iWidth
            If imgSplit(i).Point(x, y) = vbWhite Then
                output = output & "0"
            Else
                output = output & "1"
            End If
        Next
    Next
    
    txtData(i).Text = output
Next 


El código es bastante simple y combinando todos estos elementos ya podemos comenzar a buscar coincidencias con el fin de intentar reconocer los caracteres.


3. Pero... ¿Cómo saber cual caracter es?

Para saber esto, se realiza una efectiva, pero bastante ineficiente búsqueda secuencial con el patrón representativo dentro de todos los anteriormente almacenados por el programa.

En este instante será más lógico entonces revisar la forma en que se ingresa esta información al programa, proceso denominado "aprendizaje". Luego de realizar todo el proceso anterior, se obtienen las cadenas que representan a cada caracter:



Por el momento el programa "no sabe" a cual corresponde, pero tenemos la posibilidad de enseñarselo en el siguiente panel:



Luego, cuando analicemos una siguiente imagen, el programa intentará aplicar el reconocimiento anterior. Probablemente en los primeros minutos todas las coincidencias serán absurdas por ejemplo el caracter de mayor similitud con una letra "P" podrá ser una letra "O". Sin embargo luego de entrenar por un lapso de tiempo la aplicación, solamente tendremos que corregir pequeños errores.

Por ejemplo luego de quince minutos de entrenamiento con imágenes almacenadas, se prueba la aplicación con una imagen nueva:



Como se puede apreciar, la letra "C" fue reconocida como "O". Sin embargo las demás letras están correctamente reconocidas, podemos revisar la tabla de coincidencias para investigar lo que sucedió:



Claramente la letra "O" (primera línea) tiene un grado mayor de coincidencia con la imagen. La causa de este comportamiento puede ser simplemente que anteriormente apareció una letra "O" con un segmento borrado, de forma similar a la delgada letra "C" de la imagen.

Para corregir esta predicción, simplemente utilizamos nuevamente el "aprendizaje" de la aplicación:



Debido a que la búsqueda de coincidencias se realiza secuencialmente, siempre el último "aprendizaje" tiene predominancia, lo que sirve para ir haciendo correcciones en el proceso. Esto se refleja automáticamente en los porcentajes de coincidencia:



Ahora la certeza del programa es casi absoluta. A continuación una letra "C" con un ángulo y grosor similar al de la imagen se reconocerá perfectamente sin importar su tamaño ni posición original.


4. ¿Y como se calcula ese porcentaje?

El cálculo del porcentaje es trivial. Secuencialmente se analizan los respectivos patrones almacenados y mediante una comparación binaria (si o no) de cada uno de los ceros y unos del patrón representativo se suma un punto de porcentaje.

Finalmente, la extrapolación a un porcentaje máximo de cien por ciento es una simple regla de tres.

En el siguiente fragmento de código se puede ver claramente lo descrito anteriormente:

Código:
temp = ""
For i = txtLetter.LBound To txtLetter.UBound
    letter = findBestMatch(txtData(i), Me.lblC(i))
    txtLetter(i).Text = letter
    lblDetected(i).Caption = letter
    
    temp = temp & letter
Next

Me.txtOutputCaptcha = temp


La función findBestMatch recibe el patrón representativo y entrega como salida la letra más coincidente. Esta función funciona de la siguiente manera:

Código:
findBestMatch = ""

While myFile.AtEndOfStream = False
    line = myFile.ReadLine
    letter = Left(line, 1)
    data = Right(line, Len(line) - 1)
    
    temp = checkCoincidenceLevel(ofThis, data)
    coincidences.Add temp
    letters.Add letter
    
    actualLine = actualLine + 1
    
    If temp >= max Then
        max = temp
        posMax = actualLine
    End If
Wend

findBestMatch = letters(posMax)


El valor retornado por la variable "max" es el porcentaje de coincidencia. Este porcentaje es procesado por el procedimiento checkCoincidenceLevel para cada una de los patrones almacenados en la base de datos de la aplicación versus el patrón detectado en el proceso anterior después de analizar la imagen del CAPTCHA:

Código:
large = Len(fromThis)
checkCoincidenceLevel = 0
checks = 0

For i = 1 To large
    If Mid(checkThis, i, 1) = Mid(fromThis, i, 1) Then checks = checks + 1
Next

checkCoincidenceLevel = ((checks * 100 / large) - 2) + Rnd(3)


Nótese que añadí un factor aleatorio de un porcentaje muy pequeño (tres por ciento, por defecto) al cálculo para intentar entregar una respuesta algo más natural frente a coincidencias demasiado similares.



5. Descarga

El código fuente se encuentra disponible a continuación:

Código fuente de la aplicación (Aprox. 4 mb.)

Nota
El código fuente de la aplicación de este artículo está dentro del directorio source/captcha_analizer del archivo de código fuente. El programa que la acompaña es un proyecto C# que hace uso de la aplicación descrita en este artículo.




Para utilizar el programa se debe escribir la ruta de la imagen en el recuadro indicado y luego se puede realizar el proceso automáticamente presionando el pequeño botón posicionado a la derecha del recuadro señalado como "Captcha reconocido".

Otra alternativa, luego de escribir la ruta de la imagen, es ir presionando los botones que se deseen para realizar el proceso por pasos y a decisión personal. Para obtener ayuda dentro del programa, posicione el cursor sobre un botón o cuadro de texto y espere un instante para leer la descripción del mismo.

El archivo ejecutable está disponible, incluye una colección de imágenes aprendidas y otras sin aprender en el paquete:
Descargar la aplicación (Aprox. 280 kb.)


6. Conclusiones

Utilizando procedimientos bastante sencillos se puede reconocer casi a la perfección caracteres de un CAPTCHA no muy complejo, sin embargo hay que considerar que probablemente la mayoría de los servicios que usan este mecanismo cuentan con una verificación mucho más "procesable" que la presentada en este artículo.

Lamentablemente no hay muchos métodos factibles actualmente que permitan reemplazar esta verificación, por el momento muchos sitios seguirán utilizando este test, en el caso de algunos de una forma totalmente ineficiente.

A mi parecer la navegación se vuelve más torpe y molesta gracias a estas necesarias verificaciones. Creo que este abuso de los sistemas se debe principalmente a la proliferación del correo basura y publicidad, pienso que el principal motivo que tiene alguien para crear miles de cuentas de correo y de otros servicios como foros de discusión son exclusivamente para eso.

Ojala se tome un poco de conciencia en el mundo virtual con pequeños detalles como el no responder ni iniciar cadenas masivas de correo y nunca responder a un mensaje publicitario.

Haga clic sobre una de las estrellas para calificar este artículo.

Opiniones y comentarios (Escribir un nuevo comentario)
Me parece interesante el artículo, en que compilas tus proyectos???
Escrito por GamerWin (12/09/2012 05:46 PM)
Me parece interesante el artículo, 2 preguntas 1.- es basic la referencia del articulo, pero dices que el código fuente es C#?? 2.- que compilador usas?
Escrito por GamerWin (11/09/2012 08:08 PM)
1) Sí, el original es en VB6, el "wrapper" del documento adjunto está en C#. Es una combinación de un proyecto viejo y una tarea 2) El que usa VS C# Express 2010
Escrito por Erwin Ried (13/09/2012 01:24 PM)
Hola estuve revisando tu sitio y me parece muy interesanto todo lo que has venido desarrollando queria pedirte un favor estuve tratando de analizar en sitio donde me piden un captcha para poder desarrollar una aplicacion parecida a la tuya pero no tengo muchas ideas que me den resultado no se si me puedes dar una idea como podia desarrollar mi aplicacion de ante mano muchas gracias. La url del sitio web es: http://telco.orange.es/cobertura/captcha/captcha.php?1
Escrito por jhon1_23 (18/06/2012 01:39 PM)
Investiga sobre tesseract e imagemagick, el primero lo usas para obtener las letras del captcha y el segundo lo usas para limpiar la imagen
Escrito por Erwin Ried (12/07/2012 05:25 PM)
Hola amigo, felicitaciones por tu trabajo recientemente he descubierto tu sitio y hay mucha informacion util para entrenerse un largo rato. Te quiero consultar acerca de que si crees que se podría adpatar el codigo que lee los captcha para leer una imagen de una bola de bingo y extraer su numero? Por ejemplo de una imagen como esta (http://www.dineroconviobano.com/image nes/bingo.gif)
Escrito por desof (29/05/2012 12:01 AM)
Claro que sí
Escrito por Erwin Ried (14/06/2012 04:23 PM)
Buen dia Erwin, me prodrias mandar el codigo para verficar la logica del sistema es bastante interesante
Escrito por Alexander (27/02/2012 01:36 PM)
Está en servicios.ried.cl
Escrito por Erwin Ried (12/03/2012 12:03 AM)
MANDAR EL CODIGO PARA PONER EN PRACTICA, MUY BUEN ARTICULO
Escrito por EDY (27/11/2011 02:49 PM)
Está en http://servicios.ried.cl
Escrito por Erwin Ried (10/12/2011 02:38 AM)
Hola Erwin, Muy buenos días, espero que estés bien... Excelente artículo, la verdad es que es un gran a porte... Tu que sabes, te pregunto... ¿Se puede usar el siguiente sistema con VB6? http://antirecaptcha.com/ Te pregunto porque quizás lo hallas utilizado... Espero tu respuesta, Un saludo, Hugo
Escrito por Hugo (04/09/2011 01:53 PM)
No lo he utilizado, de hecho hace muchos años que evito VB6
Escrito por Erwin Ried (09/09/2011 05:32 AM)
Hola, te comento que me parece muy buen artículo y la explicación es tambíen buena: Felicidades, sigue así. Por otra parte, me gustaría saber si es que puedes enviarme el código para aplicarlo en un proyecto escolar. Me ayudaría bastante. Muchas gracias de antemano. Mi correo: avionados@yahoo.com.mx
Escrito por Avionado (27/06/2011 01:40 AM)
Revisa mi página alterna: servicios.ried.cl (Busca por Captcha breaker)
Escrito por Erwin Ried (03/07/2011 03:11 AM)
Hola, me gusto mucho tu articulo, en la maestria me dejaron un proyecto similar con la diferencia de que ya debe tener predefinidas las letras,es decir sin el modulo de aprendizaje
Escrito por pako (02/11/2010 09:55 PM)
Hola erwin.. he visto tu pagina y veo que eres exelente.. tengo un problema hace un año perdi una cita stando en vzla.. y ahora pido la cita y me la rechazan como hago en esa ocacion.. me dicen en el consulado de vzla. que eso va todo x vzla me dieron la pagina y nada va fatal es horrible... logro entrar y me sale que peri la cita en valera como hago stoy desesperada te agradeceria much si me ayudaras spero tu respuesta .. te dejo mi msn... key_luzardo@hotmail.com
Escrito por keila (06/10/2010 07:36 PM)
No entiendo nada de lo que dices
Escrito por Erwin Ried (13/10/2010 01:25 PM)
Muy buen articulo! Podrías enviarme el código, necesito aprenderlo bien para implementarlo, Muchas gracias! Gastón Fontaine. gastonfontaine @ gmail . com
Escrito por Gaston (20/09/2010 11:41 AM)
Te lo envié a tu correo
Escrito por Erwin Ried (23/09/2010 03:47 PM)
Muy bueno, no estoy muy aplicado en la materia por lo que ando un poco flojo y quería pedirte ayuda con un captcha, ya que tu programa detecta como residuo colores y eso y el captcha que yo intento que reconozca es en blanco y negro, como este: http://img84.imageshack.us/i/siluriansaudi.jpg/ Agradecería mucho tu respuesta en mi email: jp_fenix_92@hotmail.com Un saludo, Juan P.
Escrito por Juan Pedro (12/07/2010 01:29 PM)
Recaptcha no es tan sencillo. Tendrias que meterle mano al código y probablemente reformular el procedimiento que uso acá
Escrito por Erwin Ried (14/07/2010 03:41 AM)
¡Excelente! soy estudiante y me gustaría que me enviaras el código, mi correo es limonsitos@hotmail.com Gracias :)
Escrito por Guillermo Limones (28/04/2010 05:00 PM)
Agradecería que me escribas un correo con más detalles
Escrito por Erwin Ried (02/05/2010 02:07 AM)
Erwin... Excelente post, muy interesante en realidad, quedo muy agradecido si me envías el código fuente a mi correo. Pienso hacer el código inverso "generar captchas", Gracias. ti.lbonilla@gmail.com
Escrito por luis (17/09/2009 01:26 PM)
Ahora está disponible para su descarga en el artículo
Escrito por Erwin Ried (21/09/2009 05:03 AM)
hola, me gustaria poder ver el codigo fuente, muy interesante el articulo. kirchhoff_84@hotmail.com
Escrito por Kirchhoff (17/09/2009 05:38 AM)
Ahora está disponible para su descarga en el artículo
Escrito por Erwin Ried (21/09/2009 05:03 AM)
Hola Erwin exelente articulo, me parecece fenomenal, estoy trabajando en reconocimiento de diferentes captchas, por favor podria facilitarme el codigo fuente? mi correo es macoro@lab.matcom.uh.cu. saludos y muchas gracias
Escrito por Macoro (16/09/2009 03:16 PM)
Ahora está disponible para su descarga en el artículo
Escrito por Erwin Ried (21/09/2009 05:03 AM)
Hola Erwin. Muchas gracias por este excelente artículo. Me gustaría saber si podría obtener el código fuente. Un saludo, Miguel
Escrito por Miguel (03/09/2009 08:56 PM)
Mándame un correo y te lo respondo adjuntando el código
Escrito por Erwin Ried (11/09/2009 09:54 PM)
amigo ley sobre ti y tus logros e interes y me parece fenomenal felicitaciones pero quisiera que me ayudaras con el capcha de http://pasaporte.saime.gob.ve/?q=passport/login ese es la pagina para sacar el pasaporte venezolano como logro burlarlo y descargar la planilla para obtener la cita te lo aggradeceria mucho
Escrito por alejandro (26/08/2009 12:11 AM)
Debes programar una solución, este artículo sólo pretende ser una base
Escrito por Erwin Ried (27/08/2009 01:46 AM)
Buen dia Amigo muy bueno e interesante el tema este estoy tratando de dar una solución aun problema en captcha un favor me facilitarias el codigo fuente mi msn es teconecto@hotmail.com Muchas Gracias
Escrito por Netman (04/08/2009 05:31 PM)
Enviado a tu correo
Escrito por Erwin Ried (11/08/2009 06:08 PM)
esta muy bueno todo, excelente, excelente me gustaria saber si hay posibilidad de obtener el codigo fuente. mi correo es danielparada24@hotmail.com
Escrito por Daniel (28/07/2009 05:27 PM)
Claro, lo envié a tu correo
Escrito por Erwin Ried (29/07/2009 02:29 PM)
Erwin, el articulo es excelente, me gustaria saber si hay posibilidad de obtener el codigo fuente. Desde ya muchas gracias. Saludos. Javier
Escrito por Javier (06/07/2009 02:56 PM)
Por supuesto, te lo envío ahora mismo
Escrito por Erwin Ried (09/07/2009 06:06 AM)
soy jesus mira erwin mi correo es jesus_bodyboard87@hotmail.com podrias mandarme un correo para saber tu correo y comentarte par de cositas para tener una ayuda!!!! gracias de antemano un abrazo cordial
Escrito por jesus (01/07/2009 08:57 AM)
Cada vez que realizas un comentario puedes ver mi correo electrónico en la pantalla previa a enviar el comentario (en la ventana emergente)
Escrito por Erwin Ried (03/07/2009 12:41 AM)
a ver si sabeis como saltarse las capchas de este juego http://gfd13.elbruto.es
Escrito por esos (29/06/2009 08:53 PM)
Cualquier captcha puede quebrarse (potencialmente), las limitantes son el tiempo según su complejidad
Escrito por Erwin Ried (03/07/2009 12:42 AM)
eres muy bueno exelente por tu articulo ahora manos la obra gracias a tu articulo ya se como empezar a hacer un proyecto que tenia pensado en mente... muchas gracias de verdad pagina a favorito... eres un crack
Escrito por jesus (13/06/2009 01:33 PM)
Excelente, como base para aprender sobre CAPTCHAS y sobre como saltarlos esta muy bien :P
Escrito por Gabriev (07/06/2009 10:34 AM)
Muy bueno tu artículo. I estudio sobre CAPTCHA. Me gustaría recibir el código fuente, si es posible. Mi correo electrónico es fabriciocm@ig.com.br.
Escrito por Fabrício (20/05/2009 09:00 PM)
Te mandaré una versión actualizada, saludos
Escrito por Erwin Ried (21/05/2009 02:59 PM)
Jeje muy bueno tu articulo, me gustaria saber si hay alguna manera de romper un captcha que utiliza el metodo DelaRub. Lo encontre en la wikipedia y parece muy seguro pero como no se mucho del tema me gustaria asegurarme. Ahora te dejo el link: http://es.wikipedia.org/wiki/Captcha#M.C3.A9todo_DelaRub Saludos
Escrito por Ggolaz (16/05/2009 05:59 PM)
Siempre hay una forma para todo, lo que nos detiene es el esfuerzo y los objetivos de hacerlo
Escrito por Erwin Ried (17/05/2009 02:50 PM)
HOLA AMIGO COMO ESTAS LA VERDAD, SOLO BUSQUE AYUDA PARA BAJAR MI PASAPORTE, Y LA DE UNOS 2 FAMILIARES ESO LO HAGO CONSTAR Y TENGO MIS PRUEBAS SOLO PUDE BAJAR EL MIO NADA MAS,,LA AYUDA QUE LE PEDI NO ES UN DELITO, ME PARECE QUE UD., ES UNA EXCELENTE PERSONA, GRACIAS DESEARIA QUE UD BORRE MIS ARTICULOS QUE APARECEN EN SU PAGINA O BLOG JUNTO CON MI DIRECCION DE CORREO, GRACIAS,,
Escrito por GYLORIUS (27/01/2009 12:18 AM)
No entiendo mucho a lo que te refieres, tu español es extraño
Escrito por Erwin Ried (28/01/2009 11:32 AM)
amigo Erwin me gustaria que me informaras metodo de como saltar o hacer que las captchas sean automatizadas sin necesidad de estar escribiendo los caracteres que se vean el recuadro de la captcha . espero de tu pronta ayuda hermano matias93@hotmail.com
Escrito por matias (11/07/2008 12:47 PM)
La única forma para un captcha en particular es implementar una solución particular (lee bien este documento, dice lo mismo)
Escrito por Erwin Ried (12/07/2008 12:55 PM)
AMIGO COMO HAGO PARA SALTAR EL NUEVO CAPTCHA QUE TIENE LA PAGINA DE LA ONIDEX.GOV.VE YA ESTOY REGISTRADO Y NADA QUE ME DAN LA CITA ME DICEN QUE ME ESPERE A LA CITA PROGRAMADA Y NO SALE COMO HAGO, ESRO ACA ES FACIL PERO NO TENGO LOS PROGRAMAS YA QUE SE CAPITALIZO TODO GRACIAS MI CORREO ES RINGY77@GMAIL.COM
Escrito por GYLORIUS (04/07/2008 01:21 PM)
Hola Erwin. Lo primero de todo quiero felicitarte por la magnífica forma de acometer la explicación, detallada paso a paso y con los algoritmos pertinentes, para comprobar y hacer cambios. Mi paso por aquí fué de rebote, pués mi interés se centra más bien es hacer un OCR para mis textos manuscritos, y lo cierto es que ante la magnitud de trabajo siempre lo voy posponiendo. Ahora me siento más animado después de leerte, aunque tengo muchos detalles recopilados es grato ver que con un ejemplo 'sencillo' se consiguen resultados. Ánimo y adelante en tus proyectos.
Escrito por Carlos (08/05/2008 07:50 PM)
Hola. Tu artículo me parece magnífico. Me voy a poner a ello ahora mismo. Si te sirve. Me estoy volviendo un experto en Captchas hechos con javascript. Aquí tienes un ejemplo: http://www.loquo.com/m/5iG-cpIEa0buY3wGI0P7A6F1Dc6RuIL0NkgsRmfyOvzJuBxpC/DLqCAOzKhD0kF25g== Fíjate que no pueden ser copiados-pegados. He conseguido un método para exportarlos. Y limpiarlos. Desgraciadamente, aún no conocía esta página ahora intentaré hacer tu Ocr. Saludos. Àngel Gimeno angel@debat.cat
Escrito por Àngel (29/04/2008 09:46 AM)
Hola te escribo desde colombia estube viendo tu articulo fantastico ... aunque el CAPTCHA de ''rapishare'' si te daria serios problemas ese es imposible de decifrarse pasate y miralo por cierto ... tu CAPTCHA es muy bueno tratas de persuadir a al robot ubicando de fondo numero y letras en menor tonalidad que las verdaderas ... muy bueno
Escrito por skainet (28/04/2008 12:57 AM)
Gracias, un comentario sobre el captch de "Rapidshare": incluso yo mismo no puedo descifrar algunos de los últimos (esos de buscar al felino), me imagino eso si que podría hacerse un programa para al menos intentar buscar la figura que parezca más tener un gato atrás, pero descifrar la letra ya sería un segundo desafío y en base mi idea de este pequeño proyecto es demostrar cómo se podría romper un captcha sin importar lo sencillo o difícil que sea
Escrito por Erwin Ried (28/04/2008 01:56 AM)
Excelente artículo. Métodos para reconocer imágenes sensillas como esta hay muchos, pero este es verdaderamente bastante bueno y eficaz. Yo empezé con este tema con un ejemplo sensillo (http://img266.imageshack.us/img266/9376/imagefw2.jpg) y comparaba la imagen completa con imágenes previamente tratadas por mí pixel por pixel. Igual no se puede comparar la dificultad del ejemplo dado con el mío :D! Espero que me aceptes al MSN por posibles dudas que pueda tener cuando me ponga con algún ejemplo más dificil. Gracias por el articulo!
Escrito por sircid (15/01/2008 01:37 PM)
hola te escribo para pedirte un consejo, haber si me pudes dar las caracteristicas de un computador que deseo comprar y no se cual seria el mejor, estudio ingenieria civil. gracias de ante mano. chauuuu
Escrito por imoteph (19/11/2007 08:50 PM)
Un futuro ingeniero debería saber donde preguntar...
Escrito por Erwin Ried (20/11/2007 04:19 AM)
Excelente trabajo. La línea secuencial de la lógica utilizada es simple y directa; adicionalmente el registro y publicación son ordenados y comprensibles. Con pequeñas revisiones serían tutoriales perfectos. Estoy interesado en que te incorpores a mi grupo en un proyecto que ha representado un reto para muchas personas. Hablemos de él para ver si te interesa. Skype: asdrubalamv; o kork_kork_86 @ hotmail.com (sin los espacios en blanco antes y despues de la arroba).
Escrito por Asdrubal (05/11/2007 01:04 PM)
Gracias por tu opinión, te escribo al correo
Escrito por Erwin Ried (05/11/2007 03:41 PM)
bueno, para lo que hay en la web, debo felicitarte. no obstante, hay que reconocer que el artículo se centra en un CAPTCHA extremadamente sencillo, cosa que, afortunadamente para las empresas, no es lo extendido. por ejemplo, no tratas el tema de las curvaturas de las letras, posiblemente el mayor problema después de la separación de las letras. no obstante, no quiero que esto parezca una crítica, el artículo es realmente bueno. un saludo
Escrito por eutiarroba (20/08/2007 05:47 AM)
Claro, es muy cierto lo que comentas, el problema que mencionas ya hubiese tenido que ser abarcado por metodologías muy distintas y ya no serían parte de un ejemplo "sencillo"
Escrito por Erwin Ried (20/08/2007 09:12 AM)
Erwin: he leido varias de tus notas, y me parecen sencillamente geniales, no creo que te gusten tanto los halagos, pero vaya hombre que te los mereces. Una pregunta: que carrera has estudiado? Saludos.
Escrito por Serfiles (26/12/2006 07:48 PM)
Gracias por tu comentario, ciertamente que es un gusto que gente lea y comente un poco lo que hago, aunque claro, las críticas también son muy bien recibidas. Actualmente estudio la carrera de ingeniería civil en computación la que espero terminar en un par de años
Escrito por Erwin Ried (27/12/2006 12:51 AM)
Gracias por este genial artículo. Quiero introducir en mi sistema un captcha y me gustaría que me digeras cuál es hoy por hoy el mejor captcha que hay disponible. Un saludo y un 10 por el artículo. Ni en inglés he encontrado uno tan detallado.
Escrito por Turmis (28/10/2006 05:59 PM)
Yo creo que puedes darte cuenta de lo efectivo de un captcha al ver de que forma puede ser "adivinado" por un programa como el del artículo. Con esta premisa puedes buscar uno ideal. No puedo darte algo específico por el momento, tengo muchas cosas pendientes y entre ellas está el código de un pequeño captcha que hago
Escrito por Erwin Ried (28/10/2006 06:50 PM)
http://caminante.wordpress.com/ sabes intento colocar CAPTCHA para mi blog conoces algun lugar en la web donde pueda descar el codigo e imagenes
Escrito por JJ (09/10/2006 05:42 PM)
No conozco uno específico pero San Google tiene todas las respuestas. Por otro lado estoy confeccionando uno y pienso publicar su código (hace tiempo que debería haberlo publicado), para probarlo puedes mirar este ejemplo.
Escrito por Erwin Ried (09/10/2006 07:05 PM)
Muy interesante y bien escrito.
Escrito por ZeruGiran (28/09/2006 03:57 PM)
Existen varios métodos para "saltar" CAPTCHAs, pero es primera vez que veo un sistema implementdado que literalmete lo "rompa". Realmente excelente tu paper. saludos!
Escrito por daemon21 (25/09/2006 10:46 AM)
Cuando le pones captcha reconocido la wea muere asique revisa el codigo porfavor
Escrito por Roberplant (08/09/2006 11:42 PM)
Gracias por el comentario pero no entiendo exactamente el problema que describes. Si me lo explicas un poco más detallado intentaré solucionarlo
Escrito por Erwin Ried (09/09/2006 12:42 AM)
La kgo wn ... pero tienes razon ... el CAPTCHA que usa el foro phpbb es bastante mula incluso en el compu.cl ya empezaron a pasarcelo por la raja ... ya he tenido que borrar un par de comentarios a paginas pornos xD
Escrito por KrooG (26/08/2006 01:46 PM)
Lamentablemente además de la calidad de un CAPTCHA, influye mucho su popularidad. Creo que un CAPTCHA programado independientemente otorga mucha más seguridad que uno muy difundido, aunque esté muy bien diseñado. Estoy programando un simple CAPTCHA y publicaré su código en algunos dias más
Escrito por Erwin Ried (26/08/2006 02:22 PM)
Simplemente increible!! felicitaciones muy buen programa y justamente no creo que pase mucho tiempo hasta que tengan que cambiar el sistema... pero no hagas que eso sea antes de lo devido XD.
Escrito por CAVG (26/08/2006 12:06 AM)
Erwin, realmente eres genial. Admiro tu minuciosidad para investigar y para explicar paso a paso tus artículos. Felicidades, sigue así! ;)
Escrito por Saint (20/08/2006 08:57 PM)

Copyright © 2013 por Erwin Ried.