ブラウザから送られるリクエストの監視方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
七篠真名
記事: 12
登録日時: 11年前

ブラウザから送られるリクエストの監視方法

#1

投稿記事 by 七篠真名 » 11年前

はじめまして七篠と言います。
これから何度か質問させていただくかもしれませんが、よろしくお願いします。
現在web上のゲームのようなもの(正確にはゲームではない)を自動で操作するプログラムをC言語で書いています。
そこでその判断の基準としてブラウザからどのようなGETやPOST等のリクエストが送られているかを監視したいと考えています。

自分で調べたところ、リクエストを監視するには
・アドオンのようなものをブラウザにつけてそこから監視する
・ブラウザの設定を変えてプロキシを通してリクエストを送り、プロキシの方を監視する
の二つの方法がありそうですが実現できていません。

一つ目の方法はieHTTPHeadersというフリーのソフトにそういう機能があったので使ってみると、実際にどのようなリクエストが送られているのかを調べることは出来ましたが、その情報をどうやって取得すればいいのかが分からず断念しました。
また、実際に自分でアドオンを作ろうかとも考えましたが、アドオンの作り方の調べがつきませんでした。
二つ目の方法は実はほとんど手をつけられていないのですが、プロキシとはネットワーク上にあるどこかのページを経由して本来アクセスしたいページにアクセスするというものではないのでしょうか?
だとするとどうやって監視するのかが分かりません。むしろ監視できちゃったらあまりプロキシを通してる意味が分からないような気がします。

そこで質問なのですが、
・アドオンが取得してきたリクエスト等の情報を取得する方法
 (これができるならブラウザから直接情報を取得できるような気もする)
・アドオンの作り方(アバウトすぎてすみません。ページの紹介などでかまいません)
・プロキシを使ったリクエストの監視方法
・上以外でリクエストの監視が可能な方法
のどれかを教えていただきたいです。

現状リクエストを監視せず画面をキャプチャすることでほとんどのプログラムは完成していますが、リクエストを監視しないとわからない情報があるのと、その方がスマートなやり方だと思ったので何か手段があれば教えていただきたいです。
よろしくお願いします。

ちなみに自分はC言語については趣味で少しやってきましたが、HTMLに関してはほとんど初心者です。
ブラウザにはIEを使う予定ですが、他の物なら可能という場合でも教えていただけると嬉しいです。
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: ブラウザから送られるリクエストの監視方法

#2

投稿記事 by YuO » 11年前

IEならF12開発者ツールにネットワークタブがあって,キャプチャすればRequest/Responseを確認できますが……。
# IE9からだったかな。

プロキシ形式のものでは,Fiddler Web Debuggerがあります。
起動すれば,IEの通信は自動でキャプチャされます (Internetの設定のプロキシが自動設定されます)。

どちらも,基本的にはWebアプリケーションを作っている時にRequest/Responseを調べてデバッグするためのものです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ブラウザから送られるリクエストの監視方法

#3

投稿記事 by h2so5 » 11年前

七篠真名 さんが書きました: 現在web上のゲームのようなもの(正確にはゲームではない)を自動で操作するプログラムをC言語で書いています。
そこでその判断の基準としてブラウザからどのようなGETやPOST等のリクエストが送られているかを監視したいと考えています。
C言語のプログラムから直接HTTPリクエストを送っているということでしょうか。
それとも、C言語からブラウザを操作しているということですか。

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#4

投稿記事 by 七篠真名 » 11年前

YuOさん、h2so5さん、早速の返信ありがとうございます。
基本的に説明不足ですよね。すみません。次からは気をつけます。

現在作ろうとしているのは最初に書いてある通り、web上にあるゲームを自動で操作するようなものです。
具体的にはプログラムが自動でゲームが現在どのような状況かを判断して、適切な位置にカーソルを移動して、クリックをするという感じです。
現在のプログラムでは現状を把握するのに画面をキャプチャして行っています。
しかし、画面上の変化だけでは分からないことがあり、その情報がブラウザから送られるリクエストの中にある程度入っているので、そのゲームを操作している最中にブラウザからどのようなリクエストが送られているのかを監視したいと思ったのです。

YuOさん
F12についてはこのプログラムを作ることではじめて知りました。
どういうプログラムを作ればゲームを操作できるかを考える段階でそういうものがあるのを知って、それを活用することでいろいろな情報を得ることができました。
簡単にいえば、F12で見ることができる情報を自分で作ったプログラムから見ることができればいいのですが、その方法が分からず、質問させていただいてる次第です。
Fiddler Web Debuggerについては知りませんでした。ちょっと今は忙しいので詳しくは調べられないのですが、簡単に調べる限りではいろいろな機能がありそうですね。使ってみたいと思います。

h2so5さん
上に書いた通り、現状ではC言語でブラウザを操作しています。つまりSetCursorPosとか、SendInputとかを使ってカーソルを操作しています。
でも、もしブラウザを操作するのではなく、プログラムから勝手にリクエストを送って、その結果返ってきたレスポンスをブラウザに反映させることができるならその方がカーソルを操作する必要も少なく、簡単だとも思います。
簡単にいうと、グーグルである言葉を検索したい時に
グーグルのホームページを開く → 検索欄に文字を出力する → 検索ボタンを押す
という本来のステップを踏むのではなく
グーグルのホームページを開く → 検索結果を求めるリクエストを自分で作ったプログラムから送る → そのレスポンスをブラウザに送ってもらう
ということが可能なのでしょうか?自分の中ではプログラムからリクエストを送ったら、レスポンスはプログラムに帰ってくると思っていたので、可能ならその方法も教えていただきたいです。

それ以外にも質問に答えるうえで知りたい情報があれば聞いてください。
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ブラウザから送られるリクエストの監視方法

#5

投稿記事 by softya(ソフト屋) » 11年前

COMなのでC言語ではなくC++ですが、WebBrowser を使うと色んなことができます。
「VC++ WebBrowser COMメモ(Hishidama's VC++ WebBrowser-control Memo)」
http://www.ne.jp/asahi/hishidama/home/t ... owser.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#6

投稿記事 by 七篠真名 » 11年前

softyaさん返信ありがとうございます。

なるほど。これはいろいろなことができそうですね。試してみたいと思います。
ただC++となるとほとんど手をつけたことがないので、試すのに時間がかかりそうですね。
それにしてもすごい世の中ですよね。コピペするだけである程度のものができてしまうなんて。
C++もCOMも全くわかってないのに新しいIEの立ち上げができてしまいました。これなら何とかできるような気がする。

Fiddler Web Debugger使ってみました。確かにリクエストを送ったりしているのは確認できますね。
最悪、この送受信記録を送受信するたびにどこかにテキストデータとして出力するだけでもかまわないのですが、英語が分からない。
Logの欄でできるかと思いきや、それはFiddler自体の操作履歴でしたね。
まだ全然試せていないですが、いろいろ参考にしたいと思ってます。

現状ではいろいろプログラムを組んで試す時間がないので、解決ボタンはもう少し時間がたって返信がなくなっただろうと思った時に押したいと思います。
もしくは、4月5月ごろになって実際に自分で組めるようになってから押した方がいいのであればそうしたいと思います。
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#7

投稿記事 by 七篠真名 » 11年前

お久しぶりです。
とりあえず、しばらくちまちまと作り上げたプログラムをあげてみます。
このプログラムはIEの指定したタイトルのウィンドウを探し出し、そこから発生するイベントを表示します。
タイトルは最初の方にある IE_WINDOW_TITLE で指定しています。
ウィンドウを自分で閉じるとエラーが出てしまいますので、もし実際に試していただく場合は、気を付けてください。
終了したい場合は 'Q' を押してください。
CWebRequest クラスはほとんどコピペで、自分でも何をやっているのかいまいちわかっていません。

リンクをクリックしたときにその先のURLが分かるようになったので、ある程度前進しました。ありがとうございます。
しかし、F12等で見えるリクエストのうち一部がまだ判りませんでした。
たとえばグーグルのページにアクセスしたとき、F12で見ると、最初にグーグルのURLが出てきますが、それ以外にも画像に対するリクエスト等も発生していると思います。
自分のプログラムを実際に動かしてみるとわかると思いますが、無駄に長い割にそのような記述はないように見えます。
主にいえばそのような内容のリクエストを監視したいのですが、難しいのでしょうか?

なお、このプログラムはソフト屋さんに紹介してもらったページを参考に作成し、コンパイルはVisualC++2008で行いました。
► スポイラーを表示
余談ですが、タイトルだけみるとただ単にリクエストを見たいだけみたいですね。つけ方が下手ですみませんでした。

13/05/18 編集
ソースコードが長すぎるので他の方の方法を参考に隠した
最後に編集したユーザー 七篠真名 on 2013年5月18日(土) 01:13 [ 編集 1 回目 ]
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ブラウザから送られるリクエストの監視方法

#8

投稿記事 by softya(ソフト屋) » 11年前

私も徹底的に細かい所ま把握していないので、全てのアクセスを取得できるかは分かりません。
「WebBrowser Control」
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
と言うことでお力に成れないかもしれません。
私はページのURLさえ取得出来れば事足りていたので、それ以上は調べていないのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: ブラウザから送られるリクエストの監視方法

#9

投稿記事 by shiro4ao » 11年前

ブラウザがおこなう通信の一部を集めるソフト(というかDLL)をつくりました
wsock32.dll内のsendと関数recv関数が受け取ったデータをファイルへ保存します
その他の関数による通信やブラウザのプラグインの通信は集めることができません。
挙動は単純でDLLインジェクションを利用してsendと関数recv関数を書き換え
第2引数をファイルに書き出しているだけです。
一応FirefoxPortableで動作確認しました。

使ってみた感想なのですが
送信と受信が一対一の対応を持って保存できないので
複数のセッションを張って短時間に同時に通信するような場合、
どれがどれの応答なのかわからないので相当解析しにくそうです
ソケットまでは対応付けることができるのですが。
さらにgoogle検索は送信しているデータがHTTPっぽくないのですがもし、
google検索を自動化させたい場合には役に立つか微妙な感じでした
(google検索用のプロトコルがあるのかもしれません
 googleはspdy推しのようですし。)

上記のような仕様でお役に立てそうならば圧縮ファイルをアップロード致します。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ブラウザから送られるリクエストの監視方法

#10

投稿記事 by h2so5 » 11年前

shiro4ao さんが書きました: さらにgoogle検索は送信しているデータがHTTPっぽくないのですがもし、
google検索を自動化させたい場合には役に立つか微妙な感じでした
(google検索用のプロトコルがあるのかもしれません
 googleはspdy推しのようですし。)
google検索って基本的にHTTPSで通信していませんか?

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: ブラウザから送られるリクエストの監視方法

#11

投稿記事 by YuO » 11年前

個人的には,HTTP通信ならプロキシサーバー作ってしまった方がいいとは思います。
IWebBrowser2はあくまでブラウザ機能を提供するものであって,そこでの通信はIWebBrowser2が勝手にやってくれる,というのが利点です。
imgやscriptなどのデータまで流れてきたら,それは目的から外れてしまうでしょう。

ちなみに,FiddlerのFilter機能で記録する通信を制限しておいて,必要なセッションを選択してコンテキストメニューからSaveでだいたい対応できそうにも思えますが……。


ちょっくらInternetSetOptionINTERNET_OPTION_PROXYを渡して調べてみたのですが,
自プロセス内のプロキシの設定のみに留まりました (グローバルなInternet Optionsは変更できなかった)。

h2so5 さんが書きました:
shiro4ao さんが書きました: さらにgoogle検索は送信しているデータがHTTPっぽくないのですがもし、
google検索を自動化させたい場合には役に立つか微妙な感じでした
(google検索用のプロトコルがあるのかもしれません
 googleはspdy推しのようですし。)
google検索って基本的にHTTPSで通信していませんか?
http://www.google.co.jpを起点にしている場合,HTTP通信です。以下,IEでDxLibを検索した場合のFiddlerのログです。

コード:

http://www.google.co.jp/
http://www.google.co.jp/images/icons/product/chrome-48.png
http://www.google.co.jp/images/srpr/logo4w.png
http://www.google.co.jp/favicon.ico
http://www.google.co.jp/images/nav_logo123.png
http://ssl.gstatic.com/gb/images/k1_a31af7ac.png
http://www.google.co.jp/xjs/_/js/s/c,sb,cr,cdos,vm,tbui,mb,wobnm,cfm,abd,klc,kat,bihu,kp,lu,m,tnv,amcl,erh,hv,lc,ob,r,rsn,sf,sfa,shb,tbpr,hsm,j,p,pcc,csi/rt=j/ver=Bg9n3piGY10.en_US./am=AAI/d=1/sv=1/rs=AItRSTOANbhptztdQTm6dN6HdbwXjG_PJQ
http://ssl.gstatic.com/gb/js/sem_a3becc1f55aef317b63a03a400446790.js
http://www.google.co.jp/extern_chrome/7bf268f7f7f4d9e.js?bav=on.2,or.r_qf.
http://www.google.co.jp/xjs/_/js/s/sy9,gf,sy148,vs/rt=j/ver=Bg9n3piGY10.en_US./am=AAI/d=0/sv=1/rs=AItRSTOANbhptztdQTm6dN6HdbwXjG_PJQ
http://www.google.com/textinputassistant/tia.png
http://www.google.co.jp/csi?v=3&s=webhp&action=&e=17259,39523,4000116,4001569,4001948,4001959,4002854,4002963,4003053,4003551,4003881,4003917,4003921,4004067,4004257,4004334,4004341,4004653,4004687,4004746,4004766,4004788,4004844,4004898,4004913,4004917,4004949,4004953,4004971,4005156,4005185,4005198,4005213,4005251,4005331,4005373,4005447,4005463,4005588,4005596,4005601,4005650,4005652,4005688,4005744,4006039,4006057&ei=8bNuUcGeDYbCkgW69oAI&imc=1&imn=1&imp=1&dM=10&atyp=csi&adh=&rt=xjsls.35,prt.40,ol.146,iml.41,xjses.375,xjsee.447,xjs.464,wsrt.181,cst.0,dnst.0,rqst.153,rspt.69
http://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=1&gs_id=6&xhr=t&q=D&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=1&psi=8bNuUcGeDYbCkgW69oAI.1366209521698.1
http://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=2&gs_id=29&xhr=t&q=Dx&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=2&psi=8bNuUcGeDYbCkgW69oAI.1366209521698.1
http://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=3&gs_id=5z&xhr=t&q=DxL&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=3&psi=8bNuUcGeDYbCkgW69oAI.1366209521698.1
http://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=4&gs_id=7c&xhr=t&q=DxLi&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=4&psi=8bNuUcGeDYbCkgW69oAI.1366209521698.1
http://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=5&gs_id=8v&xhr=t&q=DxLib&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=5&psi=8bNuUcGeDYbCkgW69oAI.1366209521698.1
http://www.google.co.jp/csi?v=3&s=web&action=&ei=9rNuUbS3O4eVkAXXioCwCQ&e=17259,39523,4000116,4001569,4001948,4001959,4002854,4002963,4003053,4003551,4003881,4003917,4003921,4004067,4004257,4004334,4004341,4004653,4004687,4004746,4004766,4004788,4004844,4004898,4004913,4004917,4004949,4004953,4004971,4005156,4005185,4005198,4005213,4005251,4005331,4005373,4005447,4005463,4005588,4005596,4005601,4005650,4005652,4005688,4005744,4006039,4006057&cr=c&imp=1&pf=1&pfa=n.5,ttfc.52,ttlc.0,cbt.64&pfm=n.5,ttfc.196,ttlc.0,cbt.64&pmd=max.14,avg.1,0,0,14,0,0,0,0,1,0,0,6,0,0,0,0,0,2,0,0,0&imn=3&dM=10&atyp=csi&adh=&rt=prt.88,pprt.88,ol.89,jsrt.204,iml.91,kpr.3229,bpl.5964
http://www.google.co.jp/xjs/_/js/s/wta/rt=j/ver=Bg9n3piGY10.en_US./am=AAI/d=0/sv=1/rs=AItRSTOANbhptztdQTm6dN6HdbwXjG_PJQ
http://www.google.co.jp/gen_204?atyp=i&ct=1&cad=1&sqi=3&q=dxlib&oq=DxLib&gs_l=hp.10..0l8.2137.5147.0.6018.5.4.0.1.1.0.71.276.4.4.0...0.0...1c.1.9.psy-ab.puWdNrC5Cvk&ei=9rNuUbS3O4eVkAXXioCwCQ&zx=1366209527747
起点がhttps://www.google.co.jpの場合,全てがHTTPS通信になります。

コード:

https://www.google.co.jp/
https://www.google.co.jp/images/icons/product/chrome-48.png
https://www.google.co.jp/images/srpr/logo4w.png
https://www.google.co.jp/images/nav_logo123.png
https://www.google.co.jp/favicon.ico
https://www.google.co.jp/xjs/_/js/s/c,sb,cr,cdos,vm,tbui,mb,wobnm,cfm,abd,klc,kat,bihu,kp,lu,m,tnv,amcl,erh,hv,lc,ob,r,rsn,sf,sfa,shb,tbpr,hsm,j,p,pcc,csi/rt=j/ver=Bg9n3piGY10.en_US./am=AAI/d=1/sv=1/rs=AItRSTOANbhptztdQTm6dN6HdbwXjG_PJQ
https://ssl.gstatic.com/gb/images/k1_a31af7ac.png
https://ssl.gstatic.com/gb/js/sem_a3becc1f55aef317b63a03a400446790.js
https://www.google.co.jp/extern_chrome/7bf268f7f7f4d9e.js?bav=on.2,or.r_qf.
https://www.google.co.jp/xjs/_/js/s/sy9,gf,sy148,vs/rt=j/ver=Bg9n3piGY10.en_US./am=AAI/d=0/sv=1/rs=AItRSTOANbhptztdQTm6dN6HdbwXjG_PJQ
https://www.google.co.jp/csi?v=3&s=webhp&action=&e=17259,39523,4000116,4001569,4001948,4001959,4002854,4002963,4003053,4003551,4003881,4003917,4003921,4004067,4004257,4004334,4004341,4004653,4004687,4004746,4004766,4004788,4004844,4004898,4004913,4004917,4004949,4004953,4004971,4005156,4005185,4005198,4005213,4005251,4005331,4005373,4005447,4005463,4005588,4005596,4005601,4005650,4005652,4005688,4005744,4006039,4006057&ei=cbRuUZ_bEseSkwXH74G4Aw&imc=1&imn=1&imp=1&dM=10&atyp=csi&adh=&rt=xjsls.31,prt.34,ol.156,iml.35,xjses.398,xjsee.468,xjs.477,wsrt.392,cst.0,dnst.0,rqst.184,rspt.70
https://www.google.com/textinputassistant/tia.png
https://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=1&gs_id=28&xhr=t&q=D&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=1&psi=cbRuUZ_bEseSkwXH74G4Aw.1366209649833.1
https://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=2&gs_id=3w&xhr=t&q=Dx&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=2&psi=cbRuUZ_bEseSkwXH74G4Aw.1366209649833.1
https://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=3&gs_id=51&xhr=t&q=DxL&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=3&psi=cbRuUZ_bEseSkwXH74G4Aw.1366209649833.1
https://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=4&gs_id=5y&xhr=t&q=DxLi&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=4&psi=cbRuUZ_bEseSkwXH74G4Aw.1366209649833.1
https://www.google.co.jp/s?hl=ja&gs_rn=9&gs_ri=psy-ab&cp=5&gs_id=6m&xhr=t&q=DxLib&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45368065,d.dGI&fp=7bf268f7f7f4d9e&biw=1920&bih=985&tch=1&ech=5&psi=cbRuUZ_bEseSkwXH74G4Aw.1366209649833.1
https://www.google.co.jp/csi?v=3&s=web&action=&ei=erRuUbfnHoWakAWx0oD4CA&e=17259,39523,4000116,4001569,4001948,4001959,4002854,4002963,4003053,4003551,4003881,4003917,4003921,4004067,4004257,4004334,4004341,4004653,4004687,4004746,4004766,4004788,4004844,4004898,4004913,4004917,4004949,4004953,4004971,4005156,4005185,4005198,4005213,4005251,4005331,4005373,4005447,4005463,4005588,4005596,4005601,4005650,4005652,4005688,4005744,4006039,4006057&cr=c&imp=1&pf=1&pfa=n.5,ttfc.55,ttlc.0,cbt.61&pfm=n.5,ttfc.203,ttlc.0,cbt.61&pmd=max.18,avg.3,0,0,0,0,0,15,0,15,0,0,2,0,4,0,0,7,0,0,7,18&imn=3&dM=10&atyp=csi&adh=&rt=prt.79,pprt.80,ol.80,jsrt.217,iml.82,kpr.1706,bpl.9606
https://www.google.co.jp/xjs/_/js/s/wta/rt=j/ver=Bg9n3piGY10.en_US./am=AAI/d=0/sv=1/rs=AItRSTOANbhptztdQTm6dN6HdbwXjG_PJQ
https://www.google.co.jp/gen_204?atyp=i&ct=1&cad=1&sqi=3&q=dxlib&oq=DxLib&gs_l=hp.10..0l8.7067.8541.0.10747.5.4.0.1.1.0.75.282.4.4.0...0.0...1c.1.9.psy-ab.0-ycofg6slU&ei=erRuUbfnHoWakAWx0oD4CA&zx=1366209660612
オフトピック
我が家のPCではFiddlerの証明書を信頼できるルート証明書に指定しています。
セキュリティ上問題でも,HTTPS通信覗くのにFiddlerにman-in-the-middleでやってもらうには必要なので……

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: ブラウザから送られるリクエストの監視方法

#12

投稿記事 by shiro4ao » 11年前

google検索のことなのですが私のが探せていなかっただけでした。
ちゃんとHTTPを喋っていました。

お騒がせしてすみません。

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#13

投稿記事 by 七篠真名 » 11年前

ソフト屋さん
YuOさんの発言にもあるようにこれ以上のことは難しいのかもしれませんね。
他の方法を提案していただいたので、そちらを試してみたいと思います。

shiro4aoさん
wsock32.dllを書き換えるという記述は検索していて何度か見ましたが、結局方法が分からず断念していました。
内容をみる限りそれでできそうな気がするので、ぜひ試したいです。
可能ならsend/recv関数内で必要な情報のみを選んで出力するという風にしてみたいので、自分で内容を変更してみたいのですが、そういったことを紹介しているページはどこかにあるでしょうか?もしかしたら「dllとは」とかそういうというところから学ぶことになるかもしれませんが。
ちなみにそういう風に関数の中でたくさんif文とかを使うと処理が重くなっちゃいますかね?結局情報の選別はする必要があるが、wsock32.dll内の処理が遅くなるとIE自体が重くなっちゃうかな?

YuOさん
プロキシサーバを作るということはFiddlerを自作するようなものですよね?確かにそれができれば目的のものはできると思います。
しかし、正直な話作り方が全く分かりません。その紹介のページとかはあるでしょうか?自分で作れそうなものであればそれも試してみたいと思います。
Fiddlerの使い方についてはわかりました。それで目的のものを保存することはできました。それをFiddler自体が自動で保存する様にはできるでしょうか?もしくは外部のプログラムから自動的に保存させるようなことは可能でしょうか?
Fiddlerの機能としては自分では見つけられませんでした。プログラムを外部から自動で操作するとなると、マウスを操作して指定の位置をクリックさせるとかその程度しか思い浮かばないのですが、他に方法はあるのでしょか?
それ以前にマウスでクリックさせるくらいなら、画面をキャプチャしてそこから情報を読み取る方が早いかもしれませんね。
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: ブラウザから送られるリクエストの監視方法

#14

投稿記事 by shiro4ao » 11年前

>内容をみる限りそれでできそうな気がするので、ぜひ試したいです。
OSに入ってるwsock32.dllを改変するのは難しいと思います
WFP(Windows File Protection)というのがあってシステムファイルは書き換えても
すぐに正規のファイルによって上書きされてしまいます
(もともとは、インストールなどによるDLLの上書きによってOSがクラッシュするという事故を防ぐための機能)
Win2kではWFPの停止方法があったような気がするのですが、最近のOSでできるかはわかりません。
それに、OSのDLLを勝手に変えるということはかなりリスクが高いためおすすめできない気がします
(OS買ってて、いつでも再インストールしていいようなサブマシンがあればべつですが)
その上OSのおこなうあらゆる通信がログに書き込まれるのでごちゃごちゃして解析しにくいかと。

なので自分は監視したいアプリケーションをバイナリエディタで書き換えて監視しています。
ただ、このやり方は監視したいアプリケーションのバイナリを改変できないといけないので
IEはうまく改変できるかわかりません。(WFPとか考えるとなんとなく無理そうです)

>そういったことを紹介しているページはどこかにあるでしょうか?
必要な情報のみを選んで出力するのはたぶんパーサとかの仕事なのでC言語だとstrstrとかstrtokとかで
必要な内容を切り分けていくしかないかなと思います。
自分は面倒くさがりなのでありのままのログを取っておいて、その後バイナリエディタで検索とかしながら
力任せに内容を見ていますが。
(ログからHTTPボディだけ取り出すプログラムを書いたのですがどうにもうまく動作しませんでした)

>ちなみにそういう風に関数の中でたくさんif文とかを使うと処理が重くなっちゃいますかね?
 結局情報の選別はする必要があるが、wsock32.dll内の処理が遅くなるとIE自体が重くなっちゃうかな?
recv内で割りと時間のかかる処理(Sleep関数)をやらせたところ、HTTPサーバーが通信を切ってしまうのか、
データが途中で送られて来なくなるという現象がありました。
あまり長い処理は入れないほうがいいかもしれません。
通信内容をリアルタイムに確認するのは自分の能力的にちょっと実装できない気がします・・・・すみません。

もしFirefoxPortableでお作りになってるゲームが動作するのであれば,通信内容を見れるように改造した
FirefoxPortabelをお渡しいたしましょうか?
FirefoxPortableはプラグインが結構無かったりするのでもしかすると、ゲーム自体が動作しない可能性が
ありますが・・・・ orz

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#15

投稿記事 by 七篠真名 » 11年前

shiro4aoさん
すみません。内容を完全に誤解していたようです。
DLLインジェクションですか。はじめて聞いた単語でした。(なんでスルーしてたんだろう)
これを使ってIEがsend/recv関数を呼び出そうとしたときに、自作の関数を呼び出させるということでいいんだろうか?
本来その関数がやっていた動作が分からないけど、自作の関数を呼び出した後に正規のものを呼び出すのかな?
とりあえず「DLLインジェクション」でもう少し調べてみたいと思います。

「そういったこと」というのはwsock32.dllを書き換える方法という意味でした。
説明をみる限り紹介のページはほぼなさそうですね。道理で探そうとしてもなかなか見つからなかったわけだ。
情報の選択はもとから無理やりやる予定でした。最悪一文字ずつ調べて場合分けすれば何とかなると思ってるので頑張って何とかします。

> recv内で割りと時間のかかる処理(Sleep関数)をやらせたところ、HTTPサーバーが通信を切ってしまうのか、
> データが途中で送られて来なくなるという現象がありました。
わざわざ調べていただいてありがとうございます。
タイムアウトされるとなると面倒ですね。でも実際に試しながら程度を考えてやっていくしかないんだろうな。

> FirefoxPortable~
実は今実際にモノを動かして試せる状況ではないので、実際に動くか試してからお願いしたいと思います。

> なので自分は監視したいアプリケーションをバイナリエディタで書き換えて監視しています。
この発言の意味が分かりませんでした。
アプリケーションの実行ファイルをバイナリエディタで開いていじるってことですか?
そこでsend関数に当たる部分を書き換える、ってわけではないですよね?だとするとexeファイルの構成から調べないといけなくなってしまう。
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: ブラウザから送られるリクエストの監視方法

#16

投稿記事 by shiro4ao » 11年前

>これを使ってIEがsend/recv関数を呼び出そうとしたときに、自作の関数を呼び出させるということでいいんだろうか?
 はい、そうです。インチキDLLを読ませることで
 send/recv関数が呼ばれた時にsend/recv関数の中の処理を好きなように改変できます。
 例えばsendが送ったデータをMessageBoxで表示したり。

コード:

//インチキDLLである「NSOCK32.DLL」のd_sendの実装例
//このd_send関数はプログラム(IEやFirefox)がsend関数を呼び出した時に実行されます
//sendするたびにMessageBoxが呼ばれるので実用的ではありませんが。
__declspec( dllexport ) int WINAPI d_send (SOCKET s, char FAR * buf, int len,int flags )
{
	FILE *fp;
	int ret;

	ret=t_send(s,buf,len,flags);			//正しい挙動をする本物のsendであるt_send関数をここで呼ぶ
						//正しく送信させてやらないとデータが手に入らないから。
	MessageBox(NULL,buf,"送信データ",NULL);  //送信データをメッセージボックスで表示
	return ret;				//正しい挙動をする本物のsendの戻り値を返す
}

>本来その関数がやっていた動作が分からないけど、自作の関数を呼び出した後に正規のものを呼び出すのかな?
 目的によっては正規の関数を呼ばなくてもいいこともあります
 例えば、sendに何もさせないようにして何も送信できないようにするいじわるをしたい場合とか。
 (どういうシチュエーションかはわかりませんね。いたずらソフトっぽい挙動ですが)
 ただ、今回はsendにせよrecvにせよ、通信データを取り出したいので
 送信や送信データを手に入れる必要があります。なので正しい挙動をする関数が必要になります 

> なので自分は監視したいアプリケーションをバイナリエディタで書き換えて監視しています。
>この発言の意味が分かりませんでした。
>アプリケーションの実行ファイルをバイナリエディタで開いていじるってことですか?
 はい、アプリケーションの実行ファイルをバイナリエディタで開いていじります。
 インチキDLLを読みこませるためにアプリケーションのバイナリをちょっとだけ改変しています。

>そこでsend関数に当たる部分を書き換える、ってわけではないですよね?
>だとするとexeファイルの構成から調べないといけなくなってしまう。
「sendにあたる部分を書き換える」というより
「wsock32.dll(sendやrecvが書いてあるDLL)を呼びだそうとするところを偽物のDLLを呼ぶように書き換える」
 という感じです。
 手順はバイナリエディタでexeを開いて「WSOCK.32DLL」を「NSOCK32.DLL」に書き換えます
 そうすると「WSOCK.32DLL」の代わりに「NSOCK32.DLL」を読み込むようになります。
 で、「NSOCK32.DLL」のなかに上記のように通信データをメッセージボックスで表示するsendを実装すれば
 sendによる通信のデータが見えるようになります。

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#17

投稿記事 by 七篠真名 » 11年前

しばらく返信ができなくて申し訳ありません。
とりあえず自分でやろうと思っていたことを実際にやるめどがついたので、報告します。

「DLLインジェクション」で検索した結果、以下のようなサイトにたどり着きました。
Windows API Hooking Tutorial
教えていただいた方法とは少し違う気がしますが、ここに書いてある通りにやってみたところ、F12で見ることのできるリクエストをメッセージボックスに表示できました。
なので、後は無理やりやれば何とかなりそうな気がします。
コードはまだうまくまとまっていないので、ちゃんとまとめてからのせたいと思います。
簡単な流れは以下のような感じです。(上のページに書いてあることをまとめて分かりづらくしたもの)
  • 自分のプログラム
    1. 対象のプロセスのプロセスID を取得する。
    2. CreateRemoteThread() 関数を使って対象のプロセスから LoadLibrary() 関数を使用させて目的のDLLを読み込ませる。
  • 対象のプロセスに読み込ませた DLL
    1. そのプロセスに読み込まれているモジュールをすべて列挙する。
    2. それぞれのモジュールにあるすべての関数の中でフックしたい関数を探す。
    3. 関数のアドレスを書き換えて自作の関数を読み込むようにさせる。
iexplore.exe が読み込んでいるモジュールを列挙してみたところ、 wsock32.dll は読み込まれていませんでした。
どうやら wininet.dll を読み込んでそっちの関数を使って通信をしているようです。(最終的に send を使っている可能性はあるのか?)
そこで HttpOpenRequestW() 関数を次の自作関数で置き換えたところメッセージボックスに表示できました。

コード:

HINTERNET Hook_HttpOpenRequestW(
	HINTERNET hConnect, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
	LPCWSTR lpszReferrer, LPCWSTR FAR * lplpszAcceptTypes, DWORD dwFlags,  DWORD_PTR dwContext )
{
	HINTERNET ret = HttpOpenRequestW(
		hConnect, lpszVerb, lpszObjectName, lpszVersion,
		lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext );
	MessageBoxW( NULL, lpszObjectName, L"HttpOpenRequest", MB_OK );
	return ret;
}
自分の場合はリクエストを送る先の URL さえ分かればいいのでこれで十分ですが、これ以外にも情報がほしい場合は他にもいろいろ関数をフックする必要がありそうですね。
まとめる上でまた分からないことができたらここに質問に来ようと思います。その時はよろしくお願いします。
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#18

投稿記事 by 七篠真名 » 11年前

なんとかプログラムがある程度固まってきたのであげたいと思います。
まずあげる前に一つ聞きたいことがあります。(全く関係ないことですみません。)
ソースやヘッダーファイルは必要だとして、可能なら実際に試してもらいたいので、試しやすい様に exe ファイルや dll ファイルも一緒に添付したほうがいいですよね?
こういうものをアップロードするのが初めてなのですが個人情報とかの観点からして、何か問題はないものでしょうか?
特に exe ファイルの中身を自分はよくわからないのですが、何か書いてあったりしないでしょうか?
何か皆さんが気をつけていることなどありましたら、教えていただきたいです。

話を戻しましてプログラムについてですが、3点どうしてもわからないことがあったので教えていただきたいです。

1、IE に対してフックをして、それを解除するときに FreeLibrary 関数を呼び出すと IE が応答なしになってしまう。
プログラムの 179 行目、StopProcessHook 関数内で CreateRemoteThread 関数を呼び出して対象のプロセスに FreeLibrary を呼び出させています。
この後 WaitForSingleObject 関数を用いて終了するのを待っているのですが、IE が応答なしになって関数がタイムアウトしてしまいます。
この現象はフックを掛けた後にフックした関数を使うとかなりの確率で起きました。(使わないとほぼ問題なく終了します)
つまり自分のプログラムでいえば、StartProcessHook 関数をした後に開いていた IE を更新などしてから StopProessHook 関数を呼び出すとそうなります。
フックした関数に問題があるのかと思い、DLL のロードだけして、フックはしないようにしても、同じような現象が発生しました。
また、IE ではなくメモ帳で試しに SetWindowText 関数にフックを掛けてみてもそのようなことは起きませんでした。
起きる場合と起きない場合の統一性があまりなくてよく分からなくなってしまったので、何か分かれば教えていただきたいです。

2、関数をフックしている最中にグーグルツールバーのキーワードを入力する欄を選択すると IE が応答なしになってしまう。
これは 100% なるといってもいいくらいな確率でなります。
これはクリックしないように気を付けていれば問題ないと言えば問題ないのですが、何か理由が分かれば教えていただきたいです。
IE とは別にグーグルツールバーはそれで別のプロセスになっているのでそれが原因かなとも思うのですが、違うからどうなるのかってのがわかりません。
ちなみにこっちは関数をフックしなければ問題は発生しません。

3、フック中に IE を終了させると終了したというメッセージが一部のプロセスからしか来ない
フックの解除をする関係でフックをしたプロセスの情報をプログラム内で保存しています。しかし、フックをしている間ずっと対象のプロセスが存在し続けている保証はありません。
そこで、298 行目の DllMain 関数内に有る様に、終了したことを伝えるメッセージを開始したプロセス(マッピングさせたプロセス)に送っています。
しかし、実際に動かしてみるとすべてのプロセスからメッセージが来るとは限りません。
個人的には IE が一つの親プロセスと複数の子プロセスという形になっているので、親プロセスが先に終了してしまい子プロセスからメッセージが来ない、のかなと予測しています。
となると、どうやって終了したことを伝えればいいのでしょうか?
終了したというメッセージを受けたら、その子プロセスに対してもフックを掛けていれば解除するという方法も考えられますが、
最終的には目的の一つのプロセスのみ(おそらく子プロセスのほう)に対してフックをかけたいと考えているので、何かいい方法があれば教えていただきたいです。

2・3番はともかく、1番はなんとかしたいと思っています。最悪、FreeLibrary 関数を呼び出さないということも考えてはいますが、できれば最終手段にしたいです。
フックの解除に関しては以下のサイトを参考にしました。
別のプロセスにコードを割り込ませる3つの方法 - インターネットコム

プログラムは後で zip ファイルにまとめて添付ファイルとしてアップロードしたいと思います。
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#19

投稿記事 by 七篠真名 » 11年前

いろいろ忙しく時間が取れなくてすみません。
質問している側なのにソースコードも載せないのが申し訳ないので、とりあえずソースコードだけ載せておきます。
いろいろ自分の意図などを書こうと思っていたのですが、時間がないので今回は省略します。
意味不明なところがあれば質問してください。また時間がかかってしまうかもしれませんが、返信します。

「ProcessHook.cpp」と「ProcessHook.h」がDLLの元となるソースコードです。
これをコンパイルしてできたファイルを対象のプロセスに埋め込みます。
「dlltest.cpp」はDLL単体では実行できないので、それを埋め込むための簡単なテスト用プログラムです。
コンパイルするには、上のファイルをコンパイルしてできる「ProcessHook.lib」と元からある「ProcessHook.h」というファイルを「dlltest.cpp」と同じフォルダに入れる必要があります。
(これだけ書くとDLLファイルを使ってないみたいだけどちゃんと埋め込まれてるのかな?てか、DLLをロードするだけならDLLからやる必要はなかったみたいだ)
実際に試す方法はIEを起動した状態でプログラムを実行するだけです。
起動した状態でIEを更新等すればそのリクエストの送ったURLがコンソールに表示されると思います。
起動後に新しく作ったタブやウィンドウは対象外です。(正確にはプロセスを対象にしているので、そうとも言い切れない)
また、上の投稿にも書いたとあるようにまだバグが残っていますので、実際に試していただける場合は気を付けてください。

このプログラムを作る上で、以下のサイトを参考にしました。
・プロセスフックの方法については以前の投稿にある通りです。
・ユーザーの権限の設定について(ChangeWindowMessageFilter関数)
Vistaでフックを使うときは注意が必要
・プロセス間通信について
プロセス間通信
パソコンのOSはVistaで、プログラムのコンパイルははVisualC++2008で行い、実際に使ったIEはIE9でした。

ProcessHook.cpp
► スポイラーを表示
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

七篠真名
記事: 12
登録日時: 11年前

Re: ブラウザから送られるリクエストの監視方法

#20

投稿記事 by 七篠真名 » 11年前

ProcessHook.h

コード:

#pragma once

#ifdef PROCESSHOOK_EXPORT
#ifdef __cplusplus
#define EXPORT( type ) extern "C" __declspec(dllexport) type WINAPI
#else
#define EXPORT( type ) __declspec(dllexport) type WINAPI
#endif	/* __cplusplus */
#else
#ifdef __cplusplus
#define EXPORT( type ) extern "C" __declspec(dllimport) type WINAPI
#else
#define EXPORT( type ) __declspec(dllimport) type WINAPI
#endif	/* __cplusplus */
#endif	/* PROCESSHOOK_EXPORT */

EXPORT( int ) StartProcessHook( LPCTSTR lpszExeFileName, DWORD dwPID );
EXPORT( BOOL ) StopProcessHook( void );
dlltest.cpp

コード:

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

#include "ProcessHook.h"
#pragma comment( lib, "ProcessHook.lib" )

int main( void ) {
	puts("mainStart @ dlltest");
	if( MessageBox( NULL, _T("フックすると IE が応答しなくなる可能性があります。\nフックしますか?"),_T("dlltest"), MB_YESNO ) == IDYES ) {
		int ret = 0;
		puts("inStart @ dlltest");
		ret = StartProcessHook( _T("iexplore.exe"), -1 );
		puts("outStart @ dlltest");
		switch( ret ) {
			case -1:
				puts("エラーが発生しました。");
				break;
			case 0:
				puts("プロセスを発見できませんでした。");
				break;
			default:
				Sleep( 100 );
				puts("\n\nフックを開始しました。終了する場合は 'Q' を押してください。");
				while( GetKeyState( 'Q' ) >= 0 )
					Sleep( 100 );
				puts("inStop @ dlltest");
				StopProcessHook();
				puts("outStop @ dlltest");
				break;
		}
	}
	MessageBox( NULL, _T("プログラムを終了します。"), _T("dlltest"), MB_OK );
	puts("mainStopt @ dlltest");
	return 0;
}
自分もまだまだ初心者なので間違えたことを指摘してしまったらすみません。
一緒に学んでいきましょう!

閉鎖

“C言語何でも質問掲示板” へ戻る