[linux C编程] 如何解码验证码实现自动登录

环境 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语言模拟发送


剩下到就是编程功底问题了~~~










 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值