解决使用 libcurl 与 Charles 抓包的问题

这篇具有很好参考价值的文章主要介绍了解决使用 libcurl 与 Charles 抓包的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

解决使用 libcurl 与 Charles 抓包的问题

在使用 C++ 发送网络请求时,利用 libcurl 是个不错的选择。然而,有时候我们需要使用 Charles 抓包工具来检查这些请求,但可能会遇到无法抓取请求包的情况,或者 libcurl 提示代理名称无法解析等问题。

设置 libcurl 使用代理

要抓取 libcurl 的请求,需要设置代理。下面的代码演示了如何通过 libcurl 设置代理:

curl_easy_setopt( m_CURL, CURLOPT_PROXY, "127.0.0.1:8888" );
//8888端口就是在Charles 代理设置里面的http代理的端口

获取系统代理配置

为了正确设置 libcurl 的代理,通常在 Windows 系统上,可以使用 WinHTTP 库来获取系统的代理配置信息。以下是网上找到的(注意:使用了wxWidgets库 里面的类)

struct PROXY_CONFIG
        {
            wxString host;
            wxString username;
            wxString password;
        };

bool GetSystemProxyConfig(const wxString& aURL, PROXY_CONFIG& aCfg)
{
    // 原始来源:来自微软示例(公共领域)
    // https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/WinhttpProxy/cpp/GetProxy.cpp#L844

    bool                                 autoProxyDetect = false; // 标志:是否需要自动代理检测
    WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ieProxyConfig = { 0 }; // 存储当前用户的 IE 代理配置
    WINHTTP_AUTOPROXY_OPTIONS            autoProxyOptions = { 0 }; // 自动代理选项
    WINHTTP_PROXY_INFO                   autoProxyInfo = { 0 }; // 自动代理信息
    HINTERNET                            proxyResolveSession = NULL; // 代理解析会话
    bool                                 success = false; // 是否成功获取代理配置

    // 获取当前用户的 IE 代理配置信息
    if (WinHttpGetIEProxyConfigForCurrentUser(&ieProxyConfig))
    {
        // 如果存在自动代理检测或自动代理配置 URL,设置相应的标志和选项
        if (ieProxyConfig.fAutoDetect)
        {
            autoProxyDetect = true;
        }

        if (ieProxyConfig.lpszAutoConfigUrl != NULL)
        {
            autoProxyDetect = true;
            autoProxyOptions.lpszAutoConfigUrl = ieProxyConfig.lpszAutoConfigUrl;
        }
    }
    else if (GetLastError() == ERROR_FILE_NOT_FOUND)
    {
        // 如果出现特定的错误代码,继续尝试寻找代理
        autoProxyDetect = true;
    }

    // 如果需要自动代理检测
    if (autoProxyDetect)
    {
        proxyResolveSession = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY,
                                          WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC);

        if (proxyResolveSession)
        {
            // 根据自动代理配置 URL 或自动检测模式设置相应标志和选项
            if (autoProxyOptions.lpszAutoConfigUrl != NULL)
            {
                autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
            }
            else
            {
                autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
                autoProxyOptions.dwAutoDetectFlags =
                    WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
            }

            // 最初不进行自动登录,让 Windows 使用缓存
            autoProxyOptions.fAutoLogonIfChallenged = FALSE;

            // 获取给定 URL 的代理信息
            autoProxyDetect = WinHttpGetProxyForUrl(proxyResolveSession, aURL.c_str(),
                                                    &autoProxyOptions, &autoProxyInfo);

            // 如果未成功并出现登录失败,尝试使用自动登录
            if (!autoProxyDetect && GetLastError() == ERROR_WINHTTP_LOGIN_FAILURE)
            {
                autoProxyOptions.fAutoLogonIfChallenged = TRUE;

                // 现在尝试自动登录
                autoProxyDetect = WinHttpGetProxyForUrl(proxyResolveSession, aURL.c_str(),
                                                        &autoProxyOptions, &autoProxyInfo);
            }

            WinHttpCloseHandle(proxyResolveSession);
        }
    }

    // 如果成功获取了代理信息
    if (autoProxyDetect)
    {
        if (autoProxyInfo.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY)
        {
            // autoProxyInfo 将返回一个以分号分隔的代理列表
            // todo...可能需要更好的选择逻辑
            wxString          proxyList = autoProxyInfo.lpszProxy;
            wxStringTokenizer tokenizer(proxyList, wxT(";"));

            if (tokenizer.HasMoreTokens())
            {
                aCfg.host = tokenizer.GetNextToken();
            }

            success = true;
        }
    }
    else
    {
        // 如果没有使用自动代理,则直接从 IE 配置中获取代理信息
        if (ieProxyConfig.lpszProxy != NULL)
        {
            // IE 代理配置可能返回 : 或 :: 作为空代理
            aCfg.host = ieProxyConfig.lpszProxy;

            if (aCfg.host != ":" && aCfg.host != "::")
            {
                success = true;
            }
        }
    }

    // 清理 Win32 API 返回的字符串内存
    if (autoProxyInfo.lpszProxy)
    {
        GlobalFree(autoProxyInfo.lpszProxy);
        autoProxyInfo.lpszProxy = NULL;
    }

    if (autoProxyInfo.lpszProxyBypass)
    {
        GlobalFree(autoProxyInfo.lpszProxyBypass);
        autoProxyInfo.lpszProxyBypass = NULL;
    }

    if (ieProxyConfig.lpszAutoConfigUrl != NULL)
    {
        GlobalFree(ieProxyConfig.lpszAutoConfigUrl);
        ieProxyConfig.lpszAutoConfigUrl = NULL;
    }

    if (ieProxyConfig.lpszProxy != NULL)
    {
        GlobalFree(ieProxyConfig.lpszProxy);
        ieProxyConfig.lpszProxy = NULL;
    }

    if (ieProxyConfig.lpszProxyBypass != NULL)
    {
        GlobalFree(ieProxyConfig.lpszProxyBypass);
        ieProxyConfig.lpszProxyBypass = NULL;
    }

    return success; // 返回是否成功获取代理配置
}

为了成功获取网络请求的代理配置并设置libcurl以实现正确的代理,我们需要解析获取到的代理信息。有时,代理配置可能以形如"http=127.0.0.1:8888;https=127.0.0.1:8888"的格式出现,这种情况下直接传入libcurl可能会导致问题。为了确保正确设置HTTP和HTTPS代理,我需要按照代理信息中的不同键值对进行解析,并分配给相应的变量。

以下是我用于解析代理配置并设置HTTP和HTTPS代理的代码段:

 const char* proxyConfig = cfg.host; // 代理配置示例 http=127.0.0.1:8888;https=127.0.0.1:8888
const char* httpProxy = NULL;
const char* httpsProxy = NULL;

// 检查代理配置是否包含 "http=" 或 "https="
if(strstr(proxyConfig, "http=") != NULL || strstr(proxyConfig, "https=") != NULL) {
    // 解析代理配置,按分号分割
    char* token;
    char* context = NULL;
    token = strtok_s((char*)proxyConfig, ";", &context);

    while(token != NULL) {
        // 根据 "http=" 或 "https=" 设置对应的代理变量
        if(strstr(token, "http=") != NULL) {
            httpProxy = token + strlen("http=");
        } else if(strstr(token, "https=") != NULL) {
            httpsProxy = token + strlen("https=");
        }
        token = strtok_s(NULL, ";", &context);
    }
} else {
    // 代理配置为单一 IP + 端口形式,直接设置为 HTTP 和 HTTPS 代理
    httpProxy = proxyConfig;
    httpsProxy = proxyConfig;
}

这段代码会检查代理配置是否包含了 "http=" 或 "https=" 的信息,若包含则进行分割和解析,将对应的代理地址分配给 httpProxyhttpsProxy 变量;如果代理配置只是一个单一的 IP + 端口形式,则将其同时设置为 HTTP 和 HTTPS 代理。

Charles 代理设置

解决使用 libcurl 与 Charles 抓包的问题文章来源地址https://www.toymoban.com/news/detail-749858.html

到了这里,关于解决使用 libcurl 与 Charles 抓包的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Charles】成功解决使用iOS手机抓包时,iOS手机连接网络失败&Charles配置方法

    解决方法:原来是因为我换了一台电脑,需要重新安装手机的证书,不能用之前的证书。而且安装完证书以后,Charles没有弹出让我allow的窗口,就直接可以抓包了。 配置方法如下,搬运自同事大佬: 手机和电脑连接同一个网络,启动charles工具 iOS手机代理配置,服务器及端口

    2024年02月11日
    浏览(58)
  • android 7.0以上 https使用charles抓包 提示 unknow 解决方案

    关于android7.0以上https抓包问题,在charles都配置好的情况下依然提示unknow,解决方案如下 一、在res-xml下新建 network_security_config.xml 文件 network_security_config.xml 中的内容表示 系统的 和用户自己的证书均被信任 二、在AndroidManifest application 中添加 然后就可以了 注意该装的证书是少

    2024年02月16日
    浏览(48)
  • charles的安装和使用(含pc和手机端),不分app无法抓包问题

    解决问题 charles 安装 charles 请求unknown charles 乱码 学习使用(pojie)-破解 抓取手机包(这里使用的是iphone) 抓取手机包(安卓版本) 部分app无法抓包的问题 1. charles安装 第一步 下载 直接搜索charles进入官网下载即可 第二部 安装 初步的安装过程是无脑安装,为了正常使用可

    2024年02月09日
    浏览(55)
  • Fiddler在抓取https数据包时如何解决Tunnel to 443的问题,微信小程序打不开无法抓包的问题和无法抓取https包的问题,数据包上锁的问题等

    参考Fiddler在抓取https数据包时如何解决Tunnel to 443的问题?_fiddler显示443-CSDN博客 内容基本和参考链接一致,修改了一处关键错误,在下面的红色字体部分,本文仅作保存方便自用时查找,点赞请给原文章。 2.在右侧的选项卡里找到FiddlerScript标签(没有找到该标签的施主去Fi

    2024年02月04日
    浏览(52)
  • charles mac抓包unknown问题

    第一步:mac上安装Charles后,mac安装证书: 第二步:mac上信任证书 第三步:手机上安装证书 安装提示:电脑上通过help–SSLProxying– Install Charles Root Ceriticate on a Mobile Device or Remote Browser,可以获得下载提示      IOS手机安装信任证书 ,在safari浏览器中输入 chls.pro/sll ,访问并安

    2024年01月23日
    浏览(44)
  • 常见Charles在Windows10抓包乱码问题

    废话不多说 直接开整 最近反复安装证书还是乱码 网上各种百度还是不行 首先计算机查看安装好的证书 certmgr.msc 找到并删除掉 重新安装证书 具体解决方法: 第一步:点击 【工具栏–Proxy–SSL Proxying Settings…】 第二步:配置请求的域名和端口号,*表示任意 再Charles.ini文件中

    2024年02月14日
    浏览(48)
  • iPhone手机charles抓包详解,以及遇到的问题解答

    网络抓包工具:Charles 设备:iPhone 软件:微信小程序,app 1、安装Charles 在Charles官网下载安装包,下载地址:Download a Free Trial of Charles • Charles Web Debugging Proxy 。试用版每30分钟要退出一次,破解方法: 生成注册码地址:https://www.charles.ren/    然后就OK了------ 一路next后,来到操

    2024年02月16日
    浏览(54)
  • Charles抓包工具使用

    官方地址:https://www.charlesproxy.com/ 根据自己系统安装最新版本即可   安装后可直接打开使用   打开Charles - 【Help】 - 【Register Charles】 - 输入 Registered Name : https://zhile.io License Key:48891cf209c6d32bf4 Charles Web抓包非常简单,启动Charles会自动与浏览器设置成代理,不需要进行过多的

    2024年02月10日
    浏览(38)
  • 使用Charles进行HTTPS抓包

    在进行测试或定位线上问题时,经常会遇到抓取HTTPS数据包的需求。本文介绍如何使用Charles来抓取https网络报文。 原理: 1. 构造一个中间人代理,它有能力完成TLS/SSL握手 2. 弄到一个根证书,并用它生成签名认证的代理服务器证书  选择在8888端口上监听,然后确定。够选了

    2024年02月14日
    浏览(47)
  • 抓包工具 之 Charles 的使用

    目录 一、下载Charles 二、绿化Charles 1. 打开绿化网址 2. 生成注册码 3. 打开Charles 三、功能说明 四、代理设置 1. proxies 2. options 3. macOS 五、安装信任证书 1. 安装证书 2. 在钥匙串中找到证书 3. 双击设置信任 六、电脑接口代理开启 1. 开启 2. 问题  七、手机接口代理开启 1. 手机

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包