Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erläuterung der Verwendung von Python zum Knacken von Verifizierungscode-Beispielcode
1. Vorwort
Dieses Experiment erklärt das Knacken anhand eines einfachen BeispielsDas Prinzip des Verifizierungscodes, Sie lernen und üben die folgenden Wissenspunkte:
PythonGrundkenntnisse
Verwendung des PIL-Moduls
2. Ausführliche Erklärung von Beispielen
Installieren Sie die Kissenbibliothek (PIL):
$ sudo apt-get update $ sudo apt-get install python-dev $ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk $ sudo pip install pillow
Laden Sie die Dateien für das Experiment herunter:
$ wget http://labfile.oss.aliyuncs.com/courses/364/python_captcha.zip $ unzip python_captcha.zip $ cd python_captcha
Dies ist der Bestätigungscode captcha.gif, der in unserem Experiment verwendet wurde
Text extrahierenBild
bei der Arbeit Erstellen Sie eine neue crack.py-Datei im Verzeichnis und bearbeiten Sie sie:
#-*- coding:utf8 -*- from PIL import Image im = Image.open("captcha.gif") #(将图片转换为8位像素模式) im = im.convert("P") #打印颜色直方图 print im.histogram()
Jedes Bit des Farbhistogramms stellt die Anzahl dar Pixel, die die entsprechende Farbe im Bild enthalten. Sie werden feststellen, dass der Weißpunkt am höchsten ist (die Position der weißen Zahl 255, die die letzte Ziffer darstellt). sind 625 weiße Pixel). Die 10 meisten Farben im Bild, von denen 220 und 227 das Rot und Grau sind, das wir benötigen, können wir aus diesen Informationen ein Schwarz-Weiß-Binärbild erstellen
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0 , 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 0, 1, 0, 0, 1, 0, 2, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 3, 1, 3, 3, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 132, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 15, 0 , 1, 0, 1, 0, 0, 8, 1, 0, 0, 0, 0, 1, 6, 0, 2, 0, 0, 0, 0, 18, 1, 1, 1, 1, 1, 2, 365, 115, 0, 1, 0, 0, 0, 135, 186, 0, 0, 1, 0, 0, 0, 116, 3, 0, 0, 0, 0, 0, 21, 1, 1, 0, 0, 0, 2, 10, 2, 0, 0, 0, 0, 2, 10, 0, 0, 0, 0, 1, 0, 625]
Das erhaltene Ergebnis :
his = im.histogram() values = {} for i in range(256): values[i] = his[i] for j,k in sorted(values.items(),key=lambda x:x[1],reverse = True)[:10]: print j,kEin einzelnes Zeichenbild extrahieren
Die nächste Arbeit besteht darin, die Pixelsammlung eines einzelnen Zeichens zu erhalten. Da das Beispiel relativ einfach ist, führen wir einen vertikalen Schnitt durch :
255 625 212 365 220 186 219 135 169 132 227 116 213 115 234 21 205 18 184 15
Ausgabe:
#-*- coding:utf8 -*- from PIL import Image im = Image.open("captcha.gif") im = im.convert("P") im2 = Image.new("P",im.size,255) for x in range(im.size[1]): for y in range(im.size[0]): pix = im.getpixel((y,x)) if pix == 220 or pix == 227: # these are the numbers to get im2.putpixel((y,x),0) im2.show()
Ermitteln Sie die Anfangs- und Endspaltennummern jedes Zeichens
(Fortsetzung des obigen Codes)Schneiden Sie das Bild aus, um den Teil des Bildes zu erhalten, in dem sich jedes Zeichen befindet.
KI und Vektorraum-Bilderkennung
Hier wird eine räumliche Suchmaschine für die Zeichenerkennung verwendet hat viele Vorteile:
inletter = False foundletter=False start = 0 end = 0 letters = [] for y in range(im2.size[0]): for x in range(im2.size[1]): pix = im2.getpixel((y,x)) if pix != 255: inletter = True if foundletter == False and inletter == True: foundletter = True start = y if foundletter == True and inletter == False: foundletter = False end = y letters.append((start,end)) inletter=False print lettersEs wird nicht übertrainiert
Sie können jederzeit fehlerhafte Daten hinzufügen/entfernen, um den Effekt anzuzeigen
Es ist einfach zu verstehen und in Code zu schreiben
[(6, 14), (15, 25), (27, 35), (37, 46), (48, 56), (57, 67)]Für nicht erkannte Dinge fügen Sie sie einfach zur Suchmaschine hinzu und sie werden sofort erkannt
Natürlich hat es auch Mängel, Beispielsweise ist die Klassifizierungsgeschwindigkeit viel langsamer als die von neuronalen Netzen und kann keinen eigenen Weg finden, um Probleme usw. zu lösen.
Der Name der Vektorraumsuchmaschine klingt sehr hoch, aber das Prinzip ist sehr einfach:
import hashlib import time count = 0 for letter in letters: m = hashlib.md5() im3 = im2.crop(( letter[0] , 0, letter[1],im2.size[1] )) m.update("%s%s"%(time.time(),count)) im3.save("./%s.gif"%(m.hexdigest())) count += 1Verwenden Sie die Python-Klasse, um den Vektorraum zu implementieren:
Es vergleicht zwei Python-Wörterbuchtypen und gibt ihre Ähnlichkeit aus (dargestellt durch Zahlen von 0 bis 1) Putting Der vorherige Inhalt zusammen
Es gibt auch die Arbeit, eine große Anzahl von Verifizierungscodes zu extrahieren, um Einzelzeichenbilder als Trainingssatz zu extrahieren, aber solange die Schüler das oben Gesagte sorgfältig gelesen haben, werden sie definitiv wissen, wie das geht Führen Sie diese Aufgaben aus. Sie können den bereitgestellten Trainingssatz direkt verwenden, um die folgenden Vorgänge auszuführen.
Das Iconset-Verzeichnis enthält unser Trainingsset.
Zuletzt angehängter Inhalt:
Ergebnis abrufen
Alles ist fertig, versuchen Sie, unseren Code auszuführen:
import math class VectorCompare: #计算矢量大小 def magnitude(self,concordance): total = 0 for word,count in concordance.iteritems(): total += count ** 2 return math.sqrt(total) #计算矢量之间的 cos 值 def relation(self,concordance1, concordance2): relevance = 0 topvalue = 0 for word, count in concordance1.iteritems(): if concordance2.has_key(word): topvalue += count * concordance2[word] return topvalue / (self.magnitude(concordance1) * self.magnitude(concordance2))Ausgabe
Das ist die richtige Antwort, gut gemacht. Zusammenfassung
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für alle beim Lernen oder bei der Arbeit hilfreich sein kann eine Botschaft zum Mitteilen.
#将图片转换为矢量 def buildvector(im): d1 = {} count = 0 for i in im.getdata(): d1[count] = i count += 1 return d1 v = VectorCompare() iconset = ['0','1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] #加载训练集 imageset = [] for letter in iconset: for img in os.listdir('./iconset/%s/'%(letter)): temp = [] if img != "Thumbs.db" and img != ".DS_Store": temp.append(buildvector(Image.open("./iconset/%s/%s"%(letter,img)))) imageset.append({letter:temp}) count = 0 #对验证码图片进行切割 for letter in letters: m = hashlib.md5() im3 = im2.crop(( letter[0] , 0, letter[1],im2.size[1] )) guess = [] #将切割得到的验证码小片段与每个训练片段进行比较 for image in imageset: for x,y in image.iteritems(): if len(y) != 0: guess.append( ( v.relation(y[0],buildvector(im3)),x) ) guess.sort(reverse=True) print "",guess[0] count += 1
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Verwendung von Python zum Knacken von Verifizierungscode-Beispielcode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!