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;
}
文章出处:https://www.cnblogs.com/LyShark/p/13519226.html
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
标签:
Visual C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?