Was für die Profis :)

  • C#

    Was für die Profis :)

    Hallo Com,

    ich habe mir hier mal ein schwieriges Projekt aufgehalst, einfach kann ja jeder ^.^
    Also folgendes, ich habe hier den Security Check aus Gangs of Crime und möchte ihn per C# lösen.



    1. Problem, der Schriftzug ganz oben (auf dem Bild "Kleeblatt") ändert sich bei jedem Aufruf, und zwar:
    • das Wort an sich (Kleeblatt, Feuer, Hund usw.)
    • Form der Buchstaben
    • Größe des Bildes (Breite, Höhe, Dateigröße)
    zusätzliche Info: Die Farbe bleibt gleich.


    2. Problem, die 9 Bilder ändern sich wie folgt:
    • Position im Raster
    • Farbe variiert zwischen schwarz und weiß (und allen Grau Tönen dazwischen)
    • Schwarze und weiße Pixel verteilen sich willkürlich über den Bildern (zusätzlich verstärkt sich dieser Effect durch falsches anklicken, wird also immer pixliger pro falscher Antwort)
    • Dateigröße
    zusätzliche Infos: Höhe und Breite der Bilder sind immer gleich, Position und Form des Gegenstands im Bild selber bleiben gleich.


    Link zum Spiel:
    gangsofcrime.de/
    Es gibt keine Email Bestätigung, also wer Bock hat kann sich einfach in 1 min nenn Test Acc erstellen.

    So nun seid ihr gefragt, wie würdet ihr vor gehen? Ich möchte Gedankenansätze, Ideen, Links zum Thema usw. ich sehe das als persönliche Challenge und möchte keinen Code vorgekaut bekommen :D
    Mfg S0urce++
    Ein zweites "anderes" Captcha bild, wäre schön, so das man besser sehen kann in wie weit sich das ändert.

    Wenn die Position der Buchstaben (Kleeblatt) immer gleich bleibt (zum Oberen Anfang des Bildes) würde ich an dieser höhe das Bild zurecht schneiden.
    Die Buchstaben Schwarz / Weiß machen, danach die Buchstaben trennen und mittels OCR rausfinden was es "ist".

    Die Einzelnen Bilder ebenfalls trennen und schwarz weiß machen.
    Sind es immer die selben 9 Bilder ? Wenn ja, speicherst du dir nen muster von denn Bildern und kannst diese dann vergleichen
    Hey gigagames,
    die Position des Schriftzugs ändert sich auch im Bild selber.
    Die 9 Bilder bzw. Gegenstände (Flugzeug, Sonne usw.) sind immer die selben.

    Anbei noch ein paar Bilder:


    Edit: Hab mal einen Test Acc erstellt, mit dem ihr euch einloggen könnt, der Check kommt gleich nach Login.
    Name: codebot_de
    Passwort: 123456
    Mfg S0urce++

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



    Also als erstes das bild in 4 Haupteile zerschneiden (Rot makiert), denn 1 und 3 teil kannst du verwerfen, denn 2 & 4 Teil brauchen wir noch.
    Beim 2 ten Teil (Das Word) gehst du nun her und machst alle gelben "pixel" zu schwarzen (oder weißen wie du willst) und denn Hintergrund machst du zu weißen (oder halt schwarze dann).
    Dannach gehst du jede Zeile durch wenn in dieser Zeile Schwarze pixel dabei sind (also der Bustabe) dann anfangsPos merken, sobald KEINE schwarzen pixel mehr da sind (also nur hintergrund) speicherst du dir ENDposition.
    Jetzt hast du von jeden Bustaben denn Anfang & das Ende. diese musst du nun mittels OCR "ermitteln" was sie bedeuten.

    Mit denn 4ten teil (denn Bildschen) machen wir genau das selbe Hintergrund weiß, vordergrund (bild) schwarz.
    Da die bilder ja immer die selben sind, speicherst du dir sie eimal als "vergleichsobjekt" ab, nun nimmst du das entsprechend gesuchte bild (aus den Vergleichsobjekten) und gehst über alle 9 neu ausgeschnitten bilder drüber & das
    welches an meisten ähnlichkeit zu denn Vergleichsobjekt hat, ist das gesuchte

    Ich hoffe das ist verständlich :D
    Ja ist verständlich xD

    Zerschneiden muss man eigentlich nichts, da man den Schriftzug und die 9 Bilder separat downloaden kann. Man hat dann quasi 10 Bildchen im temporären Verzeichnis, die man bei jedem Check wieder überschreiben kann. Die Vergleichsobjekte zu erstellen ist ja auch kein Problem (mit Paint.net o.ä.). Aber die Pixel auf den 9 Bildern machen das automatische einfärben nicht gerade leicht. Denn die haben ja die selben Farben (von Weiß über Grautöne zu Schwarz) wie die Bildchen (Hund usw.) und werden somit immer mit beachtet wenn ich sie umfärben will bzw. nicht beachtet wenn ich den braunen Hintergrund entfernen will. Da komm ich grad nicht weiter ...
    Mfg S0urce++

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

    Tach mein Lieber,

    interessantes Thema, ich habe mal ein bisschen mit python und opencv rumgespielt.
    Ziel ist es das Bild zu binarisieren, sodass das Bild in Vorder- und Hintergrund geteilt ist.

    Schauen wir uns das Feuer mal an:
    Feuer0.jpeg
    Zunächst überführen wir es in ein Graustufenbild:

    Python-Quellcode

    1. img = cv2.imread("feuer.jpeg")
    2. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    Feuer_gray0.png

    Auf dem Bild wurde ein Salt-and-Pepper Rauschen eingefügt.
    Einem Rauschen begegnet man am besten mit einem Filter.
    Hier wird der Gaußfilter verwendet, das Ergebnis sieht wie folgt aus:

    Python-Quellcode

    1. blur = cv2.GaussianBlur(gray,(11,11),0)

    Feuer_blur0.png

    Nun betrachten wir das Histogramm:

    Python-Quellcode

    1. hist,_ = np.histogram(blur.flatten(),256,[0,256])
    2. max_value = np.argmax(hist)
    3. print max_value #65

    Feuer_hist0.png
    Scheinbar gibt es zwei Peeks. Der mit dem Maximum ist der Farbwert unseres Objektes, in unserem Fall liegt der bei 29.
    Das bedeutet, dass unser gesuchtes Objekt überwiegend aus Pixeln mit dem Grauwert 29 besteht.

    Gut, im nächsten Schritt entfernen wir alle Pixel, die in nicht in der Nähe unseres Wertes liegen (19 < wert < 39):

    Python-Quellcode

    1. mask = cv2.inRange(blur , max_value - 10, max_value + 10)
    2. masked = cv2.bitwise_and(blur,blur, mask= mask)

    Feuer_mask0.png

    Dieses Bild lässt sich problemlos binarisieren:

    Python-Quellcode

    1. _,bin = cv2.threshold(masked,1,255,cv2.THRESH_BINARY)

    Feuer_bin.png Hund_bin.png Herz_bin.png

    Bei diesen Bildern reicht es schon das Suchbild vom Orginalbild zu subtrahieren.
    Das Originalbild mit der geringsten Differenz bestimmt um welches Objekt es sich handelt.

    Hier das Suchbild:
    Suchbild.png
    Wir verwenden die Summe der Fehlerquadrate als Maß:

    Python-Quellcode

    1. feuer_original = cv2.imread("Feuer_bin.png")
    2. hund_original = cv2.imread("Hund_bin.png")
    3. herz_original = cv2.imread("Herz_bin.png")
    4. suchbild = cv2.imread("Feuer_bin3.png")
    5. feuer_diff = np.sum(np.power(feuer_original - suchbild,2))
    6. hund_diff = np.sum(np.power(hund_original - suchbild,2))
    7. herz_diff = np.sum(np.power(herz_original - suchbild,2))
    8. print "Feuer: " , feuer_diff
    9. print "Hund: ", hund_diff
    10. print "Herz: ", herz_diff

    Ausgabe:

    Quellcode

    1. Feuer: 2712 # Minimum -> Suchbild ist Feuer
    2. Hund: 31986
    3. Herz: 35118




    Edit:
    ich habe spaßeshalber mal das Captcha bei newocr.com/ (google: tesseract online) eingegeben und habe "Tel ef““" als Ausgabe erhalten:
    text0.png

    Ich denke wenn man ein Bisschen mit dem Captcha noch spielt, bekommt man bestimmt vernünftige Ergebnisse. Und wenn nicht, reicht "Tel ef““" schon aus, um zu erkennen, dass ein Telefon gesucht wird.

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

    Ich würde mir nich die mühe machen und das alles so 100% lösen.
    Mein Ansatz:
    Einfaches Teilen des Wortes in Buchstaben.

    13 Schmetterling
    9 Kleeblatt
    8 Flugzeug
    7 Telefon
    5 Feuer
    5 Katze
    5 Sonne
    4 Hund
    4 Herz

    Man sieht die hälfte der Wörter hat man schon und bei den anderen eine 1/2 und 1/3 chance. Daran kann man dann auch gerne weiter optimieren, wie man will aber das wird dann schon schweerer.

    Nun zu den Bildern.
    Da würde ich das verhältniss der Pixel anschauen Pro Reihe, so würde ich alle nicht Hintergrunnd Pixel in der Xten zeile und dann in 10er schritten durchgehen, damit erhälst du dann ein Patern von Zahlen, die im Tolleranzbereich liegen. und kannst jedes Bild identifizieren, zum verbessern der wehrte kannst du das gleiche Bild öfters runterladen, denn die kann man so oft aufrufen wie man will und es bleibt das selbe Bild nur in anderen Farben und Pixeln.

    Ansonsten bestimmte bereiche auf Hintergrund prüfen, wenn nicht, dann ist es das, z.B.
    Telefon ist das einzige was in der mitte weiter Rechts Hintergrund hat, würde ich ein strich auf hintergrund testen und 20% fehler zulassen
    Feuer ist das einzoge was zwischen den Flammen hintergrund hat also 2 striche testen und X fehler zulassen
    Herz .. und so weiter
    Abfrage einfach (Pseudocode)
    int pixelXorrekt = 0;
    int PixelFehler = 0;
    X = 112;
    For (int i = 90; i<= 110; i++){
    if Pixel(X,i) > FarbeMin && Pixel(X,i) < MarbeMax ){
    pixelXorrekt += 1;
    }else[
    PixelFehler += 1;
    }
    If PixelFehler < 10 then return true

    Egal du kannst di da ja was schönes überlegen ;)
    Hey krusty und susesKaninchen,

    danke für eure Antworten, hab gleich Feierabend dann setz ich mich mal richtig drann. Hier auf Arbeit konnte ich heut nicht viel machen weil der Chef immer um mich rum geschwänzelt ist hehe aber hab schon mal angefangen krustys Ansatz in c# umzusetzen. Schwarz weiß hab ich gelöst und den Gauss Effekt auch :)



    Die Buchstaben zu zerteilen ist eigentlich ja keine schlechte Idee, nur wenn man den Check zu oft falsch beantwortet werden die 9 Bildchen ein richtiger Pixelbrei und ob man damit dann noch arbeiten kann ist fraglich. Das andere Problem ist, das man (automatisch vom Server) gesperrt wird wenn man zu oft das falsche Bildchen klickt, daher sollte es schon ziemlich genau sein.
    Mfg S0urce++

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

    Also habs soweit geschafft, das Captcha regelt Tesseract (NuGut.Tessnet2). ​Wenn er keins der 9 Wörter erkennt, merkt er sich das falsche Wort in einer <string>List und aktualisiert den Browser, ​das bewirkt das man ein neues Bild bekommt aber mit dem selben Wort. Somit findet er immer irgendwann das richtige Wort und sobald er weiß um welches es sich handelt, speichert er die Liste in die dafür vorgesehene Textdatei (z.B. Feuer.txt).
    Diese Textdateien werden dann jedes mal durchsucht (wenn er auf anhieb nichts findet) somit wird er immer besser und trainiert sich quasi selber, das ganze hab ​ich so gemacht das er mindestens 3 Buchstaben eines Worts matchen muss, damit nicht jeder Schwachsinn auf den Listen landet. Außerdem hab ich nur Groß und Kleinbuchstaben zugelassen, sonst gibts da nichts besonderes drann :D

    ​Die 9 Bilder hab ich einmal runtergeladen und alle schwarz weiß gemacht, den Gauss Effekt drüber gezogen damit die Pixel weg sind, dann noch die Tontrennung (heißt so bei Paint.net) bei Rot, Blau und Grün auf 2 gestellt. Die Bilder sehen dann so aus:



    ​So nun hat man seine Vergleichsobjekte. Jetzt brauch man noch die ImageHashing.dll (einfach googeln wers brauch).

    ​Dann muss man nur noch die Bilder downloaden wenn der Check kommt, durch die Reihenfolge wie die Bilder runtergeladen werden weiß man auch die Position an der sich jedes Bild befindet, also z.B. ist Bild1.bmp in der linken oberen Ecke, Bild2.bmp rechts daneben also oben in der Mitte usw.
    ​Nun muss man nur noch die Bilder mit ImageHash "hashen" und die Hashes mit den Hashes der Vergleichsobjekte vergleichen. ImageHash erstellt dann für jeden Vergleich einen Prozentwert und der Höchste (meist über 90%) ist das gesuchte Bild.

    ​So nun zieht man sich noch per Regex, die Links der 9 Bilder aus dem Quelltext der Seite und Navigiert z.B. den 5 link an wenn man rausgefunden hat das Bild5.bmp das gesuchte Bild ist und fertig aus die Maus :thumbsup:

    ​Wer Hilfe brauch kann sich gern melden, meinen Code poste ich hier nicht, da ich der Ansicht bin das man nichts lernt durch Copy & Paste.
    ​Außerdem möchte ich nochmal allen danken die sich hier gemeldet haben, vor allem krusty weil ich seinen Ansatz mehr oder weniger umgesetzt habe.
    Mfg S0urce++