2

Boost:Asio を使用して HTTP GET を実行しています ( http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/example/http/client/async_client.cppの例を使用)

フィドラーでリクエストが表示されません (WireShark のみ) どうすれば変更できますか?

4

2 に答える 2

0

Asio はソケット レベルで動作し、wininet を使用していないため、フィドラーはそのトラフィックをキャッチできません。

私はこれに対する解決策を探していました.fiddlerをasioで動作させるには、それをプロキシとして使用する必要があります. Fiddler でプロキシを有効にするには、[ツール] -> [Telerik Fiddler オプション] -> [接続] を使用します。

asio でプロキシ サーバーを使用するには、宛先の代わりにその IP アドレス + ポートを使用する必要があります。次に、GET で完全な宛先 URI を提供する必要があります。パスだけではありません。より良い説明については、こちらを参照してください: how to add proxy support to boost::asio?

于 2016-12-21T09:38:32.147 に答える
0

私はそれを解決する方法について同様の問題を抱えているので、私の経験を共有します。私の知る限りAsio、ソケットレベルで動作し、@marcinj が指摘したように wininet を使用しておらず、Fiddler は wininet で動作しますが、Fiddler をプロキシとして使用することで引き続き実行できます。

Boost:Asioまず、 IE でトラフィックを解釈するように機能しない理由を説明してください。

フィドラーでソケットプログラミングの送信および受信リクエストをキャッチする方法も参照してください

Fiddler は、自身を HTTP プロキシ サーバーとしてスタックに挿入します。PC にプロキシが構成されていることを認識し、それを介して送信するために、Web ブラウザに依存しています。コードは、送信するプロキシを検出しないため、Fiddler はトラフィックを監視できません。

いくつかのオプションがあります。

  1. あなたは Windows を所有しているので、直接ソケットの使用からWinInet HTTP API の使用に切り替えるだけです。何も考えなくても、自動的にプロキシ検出が行われます。必要に応じて、プロキシ認証も行います。

  2. また。Fiddler の代わりに、 WiresharkまたはNetMonを使用してトラフィックを分析します。

#1 をお勧めします。これは、コードが実際のプロキシ サーバー (企業ネットワークで一般的に見られる) の存在下で動作し、Fiddler がそれで動作することを意味するためです。

ブラウザのプロキシ設定を自動検出し、プロキシへのソケットを作成し、HTTP PROXY プロトコルを話すなどの 3 番目のオプションがあると思いますが、それはベスト プラクティスではありません。

第二に、どのように行うのですか?

Socket(java.net.Proxy)Configure a PHP/cURL Application to Use Fiddlerなどに基づいてクライアントを作成するためにプロキシ アドレスを渡すことについての良いがあります。または、クライアント アプリケーションは自分で作成されていませんが、制御できる場合/ クライアント接続のエンドポイント アドレスとポートを構成します。逆に、Fiddler に任意の方法で HTTP トラフィックをインターセプトさせることができます (HTTP 要求を HTTPS 要求として再ルーティングするか、HTTPS 要求を HTTPS サーバーの HTTPS 要求として再ルーティングします)。プロキシ (1 つの引数が必要です)。Boost:asio

デフォルトでは、Fiddler は 8888 でリッスンしています。ブラウザでhttp://localhost:8888/にアクセスすると、次のようなデフォルト ページが表示されます。

<!doctype html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Fiddler Echo Service</title></head><body style="font-family: arial,sans-serif;"><h1>Fiddler Echo Service</h1><br /><pre>GET / HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA9.1.123456789.1234567890

</pre>This page returned a <b>HTTP/200</b> response <br />Originating Process Information: <code>chrome:3628</code><br /><hr /><ul><li>To configure Fiddler as a reverse proxy instead of seeing this page, see <a href='http://fiddler2.com/r/?REVERSEPROXY'>Reverse Proxy Setup</a><li>You can download the <a href="FiddlerRoot.cer">FiddlerRoot certificate</a></ul></body></html>
  1. ターゲット サーバーが HTTP サーバーである場合、またはターゲット サーバーが HTTPS サーバーであり、構成されたアドレスに応じてクライアントが HTTP をサポートしている場合は、内部に次のコードを追加するだけですOnBeforeRequest(ルール -> ルールのカスタマイズ... Ctrl+R、FiddlerScript )、リクエストまたはレスポンスの変更も参照してください。
//MessageBox.Show(oSession.fullUrl);
// string Session.fullUrl: Retrieves the complete URI, including protocol/scheme, in the form http://www.host.com/filepath?query.
//FiddlerObject.log("Session.fullUrl=" + oSession.fullUrl);
// string Session.url: Gets or sets the URL (without protocol) being requested from the server, in the form www.host.com/filepath?query."
//FiddlerObject.log("Session.url=" + oSession.url);
// string Session.PathAndQuery: Returns the path and query part of the URL. (For a CONNECT request, returns the host:port to be connected.)
//FiddlerObject.log("Session.PathAndQuery=" + oSession.PathAndQuery); // e.g. /filepath?query but host:port for a CONNECT request
// string Session.host: Gets/Sets the host to which this request is targeted. MAY include IPv6 literal brackets. MAY include a trailing port#.
// int Session.port: Returns the server port to which this request is targeted.
//FiddlerObject.log("Session.host=" + oSession.host + ", port=" + oSession.port);
// string Session.hostname: DNS Name of the host server (no port) targeted by this request. Will include IPv6-literal brackets for IPv6-literal addresses
//Gets/Sets the hostname to which this request is targeted; does NOT include any port# but will include IPv6-literal brackets for IPv6 literals.
FiddlerObject.log("Session: hostname=" + oSession.hostname +  ", oRequest.pipeClient.LocalPort=" + oSession.oRequest.pipeClient.LocalPort);


//bool Fiddler.Utilities.isLocalhostname(sHostnameWithoutPort))
// Determines if the specified Hostname is a either 'localhost' or an IPv4 or IPv6 loopback literal
// Returns true if True if the sHostname is 127.0.0.1, 'localhost', or ::1. Note that list is not complete.

// Run Fiddler on your machine, and then add this block of code and test it works on the your same machine:
// Use the `curl http://localhost:8888/get`command  or Using a browser, go to http://localhost:8888/get.
if (Utilities.isLocalhostname(oSession.hostname)) {
    // By default, Fiddler is listening on 8888. Inspect what ports are being listened using proexp or netstat
    // :: Lists the listening ports of a process with the specified image name including extension name(case-insensitive), fiddler.exe
    // for /f "skip=1 tokens=2,9 delims=," %a in ('tasklist /fo csv /fi "IMAGENAME eq fiddler.exe" 2^>NUL') do (netstat -ano | findstr "PID LISTENING" | findstr "PID %a")
    //oSession.host = "httpbin.org:443"; // oSession.oRequest.headers.UriScheme = "https";
    oSession.fullUrl = "https://httpbin.org" + oSession.PathAndQuery;
}

実際の URL を使用して期待される応答を、リクエストを実際の URL (httpbin.org) に転送する Fiddler プロキシに接続する URL localhost による上記の応答と比較できます。

  1. ターゲット サーバーが HTTPS サーバーであるが、クライアントが HTTP をサポートしていない場合、上記の変更では不十分です。

コマンドcurl -v https://localhost:8888/get(またはブラウザー) を使用して、エラーが見つかりました

* schannel: sent initial handshake data: sent 182 bytes
* schannel: SSL/TLS connection with localhost port 8888 (step 2/3)
* schannel: failed to receive handshake, need more data

Wiresharkでトラフィックを調べたところ、クライアントが最初の TLS 要求 (Client Hello) を送信した後、Fiddler が HTTPS ハンドシェイクを実行していないことがわかりました。

Fiddler はログを出力します。

18:28:44:5960 HTTPSLint> 警告: ClientHello レコードの長さは 508 バイトでした。一部のサーバーでは、ClientHello が 255 バイトを超えると問題が発生します。https://github.com/ssllabs/research/wiki/Long-Handshake-Intolerance

これを解決するには、ルール スクリプトに加えて次のことを行う必要があります。

  1. Fiddler をリバース プロキシ サーバーとして構成し、宛先ポートが 2 番目のパラメーター!listenコマンドと等しいすべての要求をターゲット サーバーに転送します。[ツール] > [フィドラー オプション] > [接続] をクリックします。[リモート クライアントの接続を許可する] がオンになっていることを確認します。Fiddler が HTTPS の SSL/TLS ハンドシェイク要求に応答できるようにします。この手順は永続的な構成です。

  2. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2 内に ReverseProxyForPort という名前の新しい DWORD を作成します。DWORD を、Fiddler がインバウンド トラフィックを再ルーティングするローカル ポートに設定します (通常、標準 HTTP サーバーのポート 80)。

:: reg query HKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2 /v ReverseProxyForPort
reg add HKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2 /v ReverseProxyForPort /t REG_DWORD /d 58080 /f && REM /f Force overwriting the existing registry entry without prompt to 58080
:: Deletes the registry key
:: REG DELETE HKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2 /v ReverseProxyForPort  /f && REM /f Forces the deletion without prompt.
  1. Fiddler を再起動し、左下隅にある!listen *PORT [CERTHOSTNAME]*Fiddler のボックス内のスクリプト コマンドを使用して、指定したポートでリッスンするプロキシ サーバーを開始します。たとえば、https://Fuzzle/の場合、サーバー名に fuzzle を使用します。QuickExec!listen 443 ServerHostName

Windows レジストリ (REGEDIT.exe)内に新しいDWORD名前を作成する必要はないようです。ReverseProxyForPortHKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2

QuickExec - デフォルトのコマンド

!listen *PORT [CERTHOSTNAME]*

別のポートに追加のリスナーを設定し、必要に応じて HTTPS 証明書で保護します

!listen 8889
!listen 4443 localhost
!listen 444 secure.example.com

こちらもご覧ください

于 2019-05-28T15:03:12.497 に答える