Automatisches Lösen von "Anti-Bot Links"

  • C#

    Automatisches Lösen von "Anti-Bot Links"

    Hallo Community ^.^

    Nun habe auch ich mal ein Problem bei dem ich, für mein aktuelles Projekt XCoBo, einfach nicht weiter komme. Es geht um sogenannte Anti-bot Links.
    Sie funktionieren ähnlich wie die bekannten Captchas von ReCaptcha oder SolveMedia. Die bekannten zu Lösen ist dank Services à la DeathByCaptcha, 2Captcha und wie sie nicht alle heißen ja mittlerweile kein Problem mehr, aber diese kleinen Scheißerchen machen mir das Leben schwer. :cursing: Google hat bisher nichts nützliches hervorgebracht.

    Was sind Anti-bot Links?

    Man sieht ein Bild mit einer Art Muster. Das können Zeichenkombinationen sein, Rechenaufgaben oder auch Synonyme die man dann einer gewissen Anzahl von links zuordnen muss und in der Reihenfolge anklicken muss.

    Ein Beispiel findet ihr hier.

    Ich habe mir bereits das PHP script angeschaut (findet man ganz offiziell hier), welches das ganze generiert und validiert. Das Hauptmuster, so nenn ich es mal, und die Bilder der einzelnen Links werden direkt vom Script gezeichenet / erzeugt. Liegen also nicht direkt als Datei vor. Das ganze wird dann Base64 codiert und vom Browser als PNG decodiert. Beim Erstellen wird sich die Lösungsfolge als "Solution" in Session gemerkt. Die Lösungsfolge selbst ist eine Folge aus X Werten, die jeweils random von 1111 bis 9999 erezugt werden und die einzelnen Links repräsentieren.

    Auf Client Seite passiert dann folgendes: Jeder Link hat einen Value (besagter Random Wert). Klickt man einen Link an, wird in einen hidden Textbox der Wert geschrieben, sodass da am Ende, bei vier Links z.B. "8456 3454 6542 1256" drin steht. Das wird an den Server submitted (per http POST) und dort, mit der in der Session gespeicherten Lösungsfolge validiert. Passt alles gibts nen Erfolg, wenn nicht, dann natürlich nicht :P

    Meine bisherigen Lösungsansätze:
    • Ich hatte gehofft, das im Base64 string, des auf dem Server erstellen PNG's irgendwo ein Erstelldatum zu finden ist. Da die Bilder bereits in Lösungsreihenfolge erstellt und danach erst durcheinander gewürfelt werden, hätte man einfach nach Erstelldatum sortieren können und hätte die fertige Lösung. Leider Fail, gibt kein Erstelldatum, da es keine wirkliche Datei ist.
    • Den String vergleich im Server php script austricksen in dem ich 0 als Lösung übertrage. 0 == "irgendeinString" ist im php immer true. Wird aber leider abgefangen, wär auch zu einfach gewesen.
    • XSS, ist mir irgendwie zu heiß, das geht schon zu sehr ins rumgehacke.
    • Bruteforce. Wird leider abgefangen. Wenn man 3 mal falsch submitted ist erstmal 10 min lang Sendepause.
    Mein Plan B: OCR. Die Bilder scannen und den Inhalt als Text parsen. Im Net an sich mittlerweile nicht mehr so kompliziert, erst recht nicht bei diesen "recht simpel" erzeugten Bildern. Problem allerdings, ich brauch dann trotzdem eine Logik, die die Muster erkennt und die Zuordnung zuverlässig treffen kann. Das könnte dann doch recht kompliziert werden zumal sich jeder Seitenbetreiber diese Muster selbst zusammen stellen kann wenn er möchte.

    Das Default "Universum" für diese Muster im Script sieht wie folgt aus:
    Spoiler anzeigen

    PHP-Quellcode

    1. // if no universe specified in the admin
    2. if (count($word_universe)<1) {
    3. $word_universe[]=array('one'=>'1', 'two'=>'2', 'three'=>'3', 'four'=>'4', 'five'=>'5', 'six'=>'6', 'seven'=>'7', 'eight'=>'8', 'nine'=>'9', 'ten'=>'10');
    4. $word_universe[]=array('1'=>'one', '2'=>'two', '3'=>'three', '4'=>'four', '5'=>'five', '6'=>'six', '7'=>'seven', '8'=>'eight', '9'=>'nine', '10'=>'ten');
    5. $word_universe[]=array('1'=>'I', '2'=>'II', '3'=>'III', '4'=>'IV', '5'=>'V', '6'=>'VI', '7'=>'VII', '8'=>'VIII', '9'=>'IX', '10'=>'X');
    6. $word_universe[]=array('cat'=>'C@t', 'dog'=>'d0g', 'lion'=>'1!0n', 'tiger'=>'T!g3r', 'monkey'=>'m0nk3y', 'elephant'=>'31eph@nt', 'cow'=>'c0w', 'fox'=>'f0x', 'mouse'=>'m0us3', 'ant'=>'@nt');
    7. $word_universe[]=array('2-1'=>'1', '1+1'=>'2', '1+2'=>'3', '2+2'=>'4', '3+2'=>'5', '2+4'=>'6', '3+4'=>'7', '4+4'=>'8', '1+8'=>'9', '5+6'=>'11');
    8. $word_universe[]=array('1'=>'3-2', '2'=>'8-6', '3'=>'1+2', '4'=>'3+1', '5'=>'9-4', '6'=>'3+3', '7'=>'6+1', '8'=>'2*4', '9'=>'3+6', '10'=>'2+8');
    9. $word_universe[]=array('--x'=>'OOX', '-x-'=>'OXO', 'x--'=>'XOO', 'xx-'=>'XXO', '-xx'=>'OXX', 'x-x'=>'XOX', '---'=>'OOO', 'xxx'=>'XXX', 'x-x-'=>'XOXO', '-x-x'=>'OXOX');
    10. $word_universe[]=array('--x'=>'--+', '-x-'=>'-+-', 'x--'=>'+--', 'xx-'=>'++-', '-xx'=>'-++', 'x-x'=>'+-+', '---'=>'---', 'xxx'=>'+++', 'x-x-'=>'+-+-', '-x-x'=>'-+-+');
    11. $word_universe[]=array('--x'=>'oo+', '-x-'=>'o+o', 'x--'=>'+oo', 'xx-'=>'++o', '-xx'=>'o++', 'x-x'=>'+o+', '---'=>'ooo', 'xxx'=>'+++', 'x-x-'=>'+o+o', '-x-x'=>'o+o+');
    12. $word_universe[]=array('oox'=>'--+', 'oxo'=>'-+-', 'xoo'=>'+--', 'xxo'=>'++-', 'oxx'=>'-++', 'xox'=>'+-+', 'ooo'=>'---', 'xxx'=>'+++', 'xoxo'=>'+-+-', 'oxox'=>'-+-+');
    13. $word_universe[]=array('2*A'=>'AA', '3*A'=>'AAA', '2*B'=>'BB', '3*B'=>'BBB', '1*A+1*B'=>'AB', '1*A+2*B'=>'ABB', '2*A+2*B'=>'AABB', '2*C'=>'CC', '3*C'=>'CCC', '1*C+1*A'=>'CA', '1*C+1*B'=>'CB', '1*C+2*A'=>'CAA', '1*C+2*B'=>'CBB', '2*C+1*A'=>'CCA');
    14. $word_universe[]=array('AA'=>'2*A', 'AAA'=>'3*A', 'BB'=>'2*B', 'BBB'=>'3*B', 'AB'=>'1*A+1*B', 'ABB'=>'1*A+2*B', 'AABB'=>'2*A+2*B', 'CC'=>'2*C', 'CCC'=>'3*C', 'CA'=>'1*C+1*A', 'CB'=>'1*C+1*B', 'CAA'=>'1*C+2*A', 'CBB'=>'1*C+2*B', 'CCA'=>'2*C+1*A');
    15. $word_universe[]=array('zoo'=>'200', 'ozo'=>'020', 'ooz'=>'002', 'soo'=>'500', 'oso'=>'050', 'oos'=>'005', 'lol'=>'101', 'sos'=>'505', 'zoz'=>'202', 'lll'=>'111');
    16. }


    Daraus werden dann besagte Bilder erzeugt. Ich denke wenn man sich das anschaut, wirds klar. Aber wie da eine logische Musterkennung hinbekommen? Ich wollte jetzt eigentlich kein neuronales Netz dafür basteln.
    Ich könnte einfach diese Liste da nehmen, ja sicher, aber wie gesagt, jeder Betreiber kann sein eigenes "Musteruniversum" da einfügen. Und einfach zu hoffen das die Betreiber das Default nehmen, anstatt sich ein eigenes zusammen basteln, naja ich weiß nicht. Letzen Endes gehts um Geld und ich denke da macht man sich dann doch schon mal die Mühe.

    Hat jemand eine Idee wie ich da drumherum komme?
    Ist OCR wirklich die einzige Möglichkeit um diese Art "Captcha" zu lösen?
    Ist vielleicht schon mal jemand auf die Dinger gestoßen und hat es dann ganz anders als meine Ideen gelöst? Vielleicht denke ich ja zu kompliziert. :S

    Hoffe ihr könnt mir helfen,

    Undisputed
    Denke OCR ist ne vernünftige Lösung. Sollte eig nicht soooo schwer sein, da du das Zeichenset stark auf 0-9 +,- begrenzen kannst. Außerdem überschneiden sich die Zeichen nicht.
    Überflieg mal kurz über mein Tut GIF-Captchas in Python, damit du ne Idee bekommst.
    Du wirst 4 Schritte benötigen:

    1. Hintergrund entfernen
    2. Zeichen/Zahlen voneinander Trennen
    3. Zeichen/Zahlen erkennen lassen
    4. Ausrechnen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „krusty“ ()

    Die Bilder sind relativ einfach. Man kann die erstmal bereinigen und dann durch eine einfache Flächenberechnung (Stichwort: Floodfill) oder auch Höhenberechnung die PLUS und MINUS Symbole differenzieren.

    Bereinigen geht z. B. durch das Umrechnen des Bildes in Schwarz-Weiß. Ist es über einem bestimmten Grauwert wird es weiß, sonst schwarz...
    Zudem kann man kleine Pixel entfernen, indem man gewisser Maßen eine Runde eine modifizierte Runde von Game Of Live spielt: Hat ein lebendiger Pixel maximal 3 lebendige Nachbarn wird er gelöscht

    Im Vorgabe-Bild ist jedes Zeichenpaar durch ein Komma getrennt. An sich kann man das aber auch durch eine Flächenberechnung.

    Die Bilder an sich scheinen alle direkt im Source zu sein. Da gibt es keine Dateien, da sie direkt Base64 encoded drin sind. Du kannst also das Base64 raus holen, decoden und das Ergebnis in ne Datei mit .png-Endung schreiben


    Danke Ihr zwei erstmal für die antworten.

    Ich dachte mir schon, dass ich da nicht drum herum kommen werde, habe auch bereits angefangen.
    Die Bilder in verwertbare Zeichen umzuwandeln ist nicht das Problem.

    Das Problem ist besagtes Universum. Ist das Bild eine Rechenaufgabe: einfach ausrechnen, logisch. "xox" zu "-+-" zuweisen, auch noch recht easy. Aber alle anderen Fälle werden schon kniffliger. Für das menschliche Gehirn ist so eine Zuweisungentscheidung recht schnell getroffen, das ganze in Quellcode zu verpacken ist da schon ne andere Hausnummer. :P

    Naja, wie auch immer, ich schau mal wie weit ich komme und geb dann nochmal bescheid ;)
    Es gibt doch auf so APIs, die automatisch ein Bild scannen und die mathematische Formel ausrechnen xD kam mir gerad so in den Sinm.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „krusty“ ()