1. 서문
이번 실험에서는 간단한 예를 통해 크래킹을 설명합니다인증코드의 원리, 다음 지식 포인트를 배우고 실습하게 됩니다.
Python기본 지식
PIL 모듈 사용
2. 자세한 설명 예제
베개(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
실험용 파일 다운로드:
$ wget http://labfile.oss.aliyuncs.com/courses/364/python_captcha.zip $ unzip python_captcha.zip $ cd python_captcha
실험에 사용한 인증코드 captcha.gif입니다
텍스트 추출사진
작업 디렉터리 .py 파일에 새 크랙을 만들고 편집하세요.
#-*- coding:utf8 -*- from PIL import Image im = Image.open("captcha.gif") #(将图片转换为8位像素模式) im = im.convert("P") #打印颜色直方图 print im.histogram()
출력:
[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]
색상 히스토그램의 각 숫자는 다음을 나타냅니다. 이미지에 포함된 값입니다.
각 픽셀은 256가지 색상을 나타낼 수 있습니다. 흰색 점이 가장 많은 것을 알 수 있습니다(흰색 숫자 255의 위치). 마지막 자리에는 625개의 흰색 점이 있음을 알 수 있습니다. 빨간색 픽셀은 약 200입니다.
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
정렬하면 유용한 색상을 얻을 수 있습니다. 색상 중 220과 227이 우리에게 필요한 빨간색과 회색이며, 이 정보를 사용하여 흑백 이진 이미지
255 625 212 365 220 186 219 135 169 132 227 116 213 115 234 21 205 18 184 15
결과는 다음과 같습니다.
<.>
단일 문자 이미지 추출
다음 단계는 단일 문자의 픽셀 컬렉션을 가져오는 것입니다. 예제는 비교적 간단하므로 세로로 자릅니다.
#-*- 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()
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
각 문자의 시작 및 끝 열 번호를 가져옵니다.
[(6, 14), (15, 25), (27, 35), (37, 46), (48, 56), (57, 67)]
(위 코드 계속)
각 문자를 가져오려면 이미지를 잘라냅니다. 문자.
AI 및 벡터 공간 이미지 인식
여기서는 문자 인식을 위해 벡터 공간 검색 엔진을 사용하는데, 이는 많은 장점이 있습니다.
많은 학습 반복이 필요하지 않음 오버 트레이닝 없음 잘못된 데이터를 추가/제거하여 언제든지 효과 확인 가능
이해하기 쉽고 코딩하기 쉬움
계층적 결과 제공, 가장 가까운 다중 일치
인식할 수 없는 것들은 검색 엔진에 추가하기만 하면 바로 인식됩니다.
물론 신경망에 비해 분류 속도가 훨씬 느린 단점도 있습니다. , 문제 해결 방법 등을 스스로 찾을 수 없습니다.
벡터 공간 검색 엔진의 이름은 매우 화려해 보이지만 그 원리는 매우 간단합니다. 기사의 예를 들어보세요.
3개의 문서가 있는데, 이들 간의 유사성을 어떻게 계산합니까? 두 문서에서 공통적으로 사용하는 단어가 많을수록 유사성이 높아집니다! 하지만 단어가 너무 많으면 몇 가지 핵심 단어를 선택하는 것이 중요합니다. 선택한 단어를 특성이라고도 합니다. 각 특성은 공간(x, y, z 등)의 차원과 같습니다. 특징 세트는 벡터이므로 모든 문서에 대해 이러한 벡터를 얻을 수 있습니다. 벡터 사이의 각도를 계산하면 기사의 유사성을 얻을 수 있습니다.
Python 클래스를 사용하여 벡터 공간 구현:
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
단일 문자 이미지를 훈련 세트로 추출하기 위해 다수의 인증 코드를 추출하는 작업도 있지만, 위의 내용을 주의 깊게 읽어본 학생들이라면 이러한 작업을 수행하는 방법을 알 수 있을 것입니다. , 여기서는 생략했습니다. 제공된 훈련 세트를 직접 사용하여 다음 작업을 수행할 수 있습니다.
iconset 디렉토리에는 훈련 세트가 포함되어 있습니다. 마지막으로 추가된 콘텐츠:
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))
#将图片转换为矢量 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
출력
python crack.py
요약
이 글의 내용이 모두의 공부나 업무에 조금이라도 도움이 되었으면 좋겠습니다. 소통하라는 메시지.
위 내용은 Python을 사용하여 검증 코드 예제 코드를 크랙하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!