环境 ubuntu(16.04)
目标:实现解码验证码自动登录到网站
问题1:如何获取网页上到验证码图片?
问题2: 如何将验证码图片解码成为一串数字?
问题3: 如何再次上交给网页?
以上问题均用C语言实现
先说问题二:如何将验证码图片解码成为一串数字?
这里我们要用到一个软件 叫做 tesseract-ocr
在命令行中输入sudo apt-get installtesseract-ocr
这是个非常强大的软件,能识别验证码图片
使用例子:tesseract xxx.tif xxx -l eng
其中xxx.tif是需要识别的图片 ,执行该命令后,就会在当前文件夹生成一个xxx.txt 里面的内容就是验证码
但是通常我们从网页上得到的验证码图片不是xxx.tif格式 所以需要转换成xxx.tif格式
命令: convert aaa.xxx bbb.tif
这里到convert 命令是图片格式转换命令,一般来说系统都自带了,将aaa.xxx图片格式转换成bbb.xxx图片格式
这里我们需要转换成xxx.tif格式。这样就能完成验证码的识别
问题1 和问题3可以归类成同一类问题
我们可以通过socket编程+http协议实现:
篇幅问题,HTTP就不介绍了,自行可以百度《HTTP协议权威指南》
首先获取一个网页某项资源,我们可以通过GET 命令实现:具体代码如下
int htconnect(char *domain,int port)
{
int white_sock;
struct hostent * site;
struct sockaddr_in me;
site = gethostbyname(domain);
if (site==NULL){
return -2;
}
white_sock = socket(AF_INET,SOCK_STREAM,0);
if (white_sock<0){
return -1;
}
memset(&me,0,sizeof(struct sockaddr_in));
memcpy(&me.sin_addr,site->h_addr_list[0],site->h_length);
me.sin_family = AF_INET;
me.sin_port = htons(port);
return(connect(white_sock,(struct sockaddr*)&me,sizeof(struct sockaddr))<0)?1:white_sock;
}
/*
Description: send a HTTP HEAD
*/
int htsend(int sock,char *fmt,...)
{
char BUF[2048];
va_list argptr;
va_start(argptr,fmt); // creat a unsure argv stack
vsprintf(BUF,fmt,argptr); // this function likes "sprintf"
va_end(argptr); //mach with va_start
return send(sock,BUF,strlen(BUF),0);
}
void main(int argc,char **argv)
{
int black_sock;
if(argv <2){
printf(" ./a.out web_address\n");
}
black_sock = htconnect(argv[1],80);
if (black_sock<0){
DBGPRINT("Socket Connect Error!\n") ;
return;
}
/*这个resource是要获取到资源地址 就是一般接ip地址后面到资源
例如 :https://172.16.1.1/ipmanager/index0.jsp 资源填/ipmanager/index0.jsp
如果实在不知道资源是什么,就先用tcpdump -vv host xxxxxx 然后登录你需要登录的网址,抓包查看具体发送了什么
*/
htsend(black_sock,"GET %s HTTP/1.0%c",resource,10);
htsend(black_sock,"Host: %s%c",argv[1],10);
htsend(black_sock,"%c",10);
while (read(black_sock,bugs_bunny,1)>0){
printf("%c",bugs_bunny[0]);
}
close(black_sock);
//这里注意 HTTP1.0 协议,每次只能申请一个资源,获取完就不能用了,第二次获取需要再建立链接
// 就是每次用完都要close(black_sock);然后再 black_sock = htconnect(argv[1],80);
}
注意: 第一次链接后服务器会附带多返回一个cookie,需要用代码记住它!以后GET和POST……都要用到!
利用POST上交帐号密码和验证码的时候要一同提交的
这是抓包回来看到到信息。。有Cookie
例如 当我第一次链接后获取到cookie时候 提交到时候需要交上去
具体究竟要发送什么给服务器 ,可以通过利用tcpdump -vv host xxxx (xxxx是你要登录的服务器地址) 命令抓包 !
然后手动登录一次,看你的浏览器究竟发送了什么给服务器,然后通过C语言模拟发送
剩下到就是编程功底问题了~~~