Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erläuterung der Verwendung von Python zum Knacken von Verifizierungscode-Beispielcode

Ausführliche Erläuterung der Verwendung von Python zum Knacken von Verifizierungscode-Beispielcode

高洛峰
高洛峰Original
2017-03-23 16:45:491652Durchsuche

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
Ausführliche Erläuterung der Verwendung von Python zum Knacken von Verifizierungscode-Beispielcode
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,k
Ein 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)Ausführliche Erläuterung der Verwendung von Python zum Knacken von Verifizierungscode-BeispielcodeSchneiden 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:

Es ist keine große Anzahl von Trainingsiterationen erforderlich
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 letters
Es 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

Bietet hierarchische Ergebnisse, Sie können mehrere ähnlichste Übereinstimmungen anzeigen
[(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:

Sie. Es gibt 3 Dokumente. Wie berechnen wir die Ähnlichkeit zwischen ihnen? Je mehr Wörter zwei Dokumente gemeinsam verwenden, desto ähnlicher sind sie! Aber was ist, wenn es zu viele Wörter gibt? Es liegt an uns, einige Schlüsselwörter auszuwählen. Jedes Merkmal ist wie eine Dimension im Raum (x, y, z usw.). Die Menge der Merkmale ist ein Vektor. Wir können einen solchen Vektor für jedes Dokument erhalten. Solange wir den Winkel zwischen den Vektoren berechnen, können wir die Ähnlichkeit der Artikel ermitteln.
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 += 1
Verwenden 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn