socket 模拟POST发送数据

来源:互联网 发布:西西软件 编辑:程序博客网 时间:2024/05/18 00:24

笔者之前使用过MFC的CInternetSession来模拟POST发送数据,但一直在想,MFC中的类都是经过封装的,如果我自己通过最原始的socket发送数据是不是可行呢?所以经过一

早上的努力,还是成功了,说明这也不难哈。我先说说自己的过程吧:

首先要构造自己的HTTP头部,那么首先要看标准的HTTP是怎样的,怎么看呢,当然是抓包了

POST xxxxp HTTP/1.1..Host: xxxxxxxxxxxxxxx..Connection: keep-alive..Content-Length: 56..Cache-Control: max-age=0..Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8..Origin: xxxxxxxxxxxxxxxxxx..User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22..Content-Type: application/x-www-form-urlencoded..Referer: xxxxxxxxxxxxxxxxxxxxxx..Accept-Encoding: gzip,deflate,sdch..Accept-Language: zh-CN,zh;q=0.8..Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3..Cookie: ASPSESSIONIDQSRRQTSD=CDNJCLDCMNNFEOLDGABLNJLH....username=3213&password=321&code=3236&Submit=%CC%E1%BD%BB

好了,看到我们的HTTP标准头部,接下来我们就可以构造自己的了http头部了,我们可以通过多线程,来不停的更改username和password来达到曼丽破解网站后台的目的,现

在来看下源代码,其实我们要做的操作就是使用socket与目标主机建立连接,然后呢就是发送上述HTTP头部,最后等待返回就是了

// socket_POST.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#include#pragma comment(lib,"ws2_32.lib")using namespace std;int _tmain(int argc, _TCHAR* argv[]){//首先声明变量WSADATA data={0};SOCKET sServer=0;SOCKET sClient=0;SOCKADDR_IN addrServer={0};char    recvBuf[1024]={0};//初始化编程环境WSAStartup(MAKEWORD(2,2),&data);//创建套接字sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sServer){cout<<"创建套接字失败\n";WSACleanup();return 1;}//填写服务器地址addrServer.sin_family=AF_INET;addrServer.sin_port=htons(80);addrServer.sin_addr.S_un.S_addr=inet_addr("xxx.xxx.xxx.xxx");//向服务器发起连接int errCode=connect(sServer,(sockaddr*)&addrServer,sizeof(addrServer));if(SOCKET_ERROR==errCode){cout<<"连接失败\n";closesocket(sServer);WSACleanup();return 1;}bool isSend=false;while(1){if(!isSend){//只发送一次数据char* sendBuf="POST xxxxxxxxxx HTTP/1.1\r\n""Host:xxxxxxxxxxxxxxxxx\r\n""Connection: keep-alive\r\n""Content-Length: 56\r\n""Cache-Control: max-age=0\r\n""Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n""Origin: xxxxxxxxxxxxxxxxxxxxxx\r\n""User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22\r\n""Content-Type: application/x-www-form-urlencoded\r\n""Referer:xxxxxxxxxxxxxxxxxxxxxxxx\r\n""Accept-Encoding: gzip,deflate,sdch\r\n""Accept-Language: zh-CN,zh;q=0.8\r\n""Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3\r\n""Cookie: ASPSESSIONIDQSRRQTSD=CDNJCLDCMNNFEOLDGABLNJLH\r\n\r\n""username=3213&password=321&code=3236&Submit=%CC%E1%BD%BB\r\n";errCode=send(sServer,sendBuf,strlen(sendBuf),0);if(SOCKET_ERROR==errCode){cout<<"发送出错\n";closesocket(sServer);WSACleanup();return 1;}isSend=true;}//循环接收数据errCode=recv(sServer,recvBuf,1024,0);if(SOCKET_ERROR==errCode){cout<<"接收数据出错\n";closesocket(sServer);WSACleanup();return 1;}if(strlen(recvBuf)!=0){cout<<recvBuf<<endl;memset(recvBuf,0,1024);}}//清理编程环境WSACleanup();return 0;}

经过笔者测试这段代码可用,当然,你得换成自己的

注意:在Cookie:dsdadads数据的末尾要加上两个\r\n,因为国定HTTP头部要与发送的内容区分开来!!


原创粉丝点击