TOP > HSP > HSPでパケットアナライザ

HSPでパケットアナライザ


HSPでパケットを見るプログラムです。キャプチャと言うのでしょうか?アナライザと言うのでしょうか?
確証がないのでどちらも書いておきます。間違ってたらごめんなさい。
ここのブログhttp://vierzero.blog53.fc2.com/blog-date-200604.htmlでパケットモニターの作成の記事にあった
ソースファイル packetmoni.hspを参考に作ってみました。とても感謝です。

あと…ゴミ文字が最初に入るのですが…これは何かわかりません…なんなのでしょうか…
読める文字列があると思います。それをどう加工するかはあたな次第です。
HSP3.0用プログラム
加工版ソースファイルダウンロード→kakou_packetmoni.zip

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

#include "hspsock.as" #uselib "ws2_32.dll" #func WSAStartup "WSAStartup" int,int #func WSACleanup "WSACleanup" #func socket "socket" int,int,int #func closesoc "closesocket" int #func recv "recv" int, int, int, int #func ioctlsoc "ioctlsocket" int,int,int #func bind "bind" int,int,int #func showpacket "ShowPacket" int,int #cfunc WSAGetLastError "WSAGetLastError" #cfunc htons "htons" int #define global SOCKET_ERROR $FFFFFFFF #define global NULL 0 #define AF_INET $00000002 #define SOCK_RAW $00000003 /* raw-protocol interface */ #define IPPROTO_IP $00000000 /* dummy for IP */ #define INVALID_SOCKET $FFFFFFFF #define SIO_RCVALL 0x98000001 #define FIONBIO 0x8004667E ;←これ頭悪いから計算するのが難儀だった(´д`; #define WSAEWOULDBLOCK 10035 screen 0,1000,700,,0,0 onexit goto *cleanup ;終了ボタン押すとクリーンアップラベルに。重要。 sdim wsadata,512 ;winsock2用の変数を初期化。 sdim optval,4 sdim soc lpoke loopback,0,$7F000001 WSAStartup 2,varptr(wsadata) ;winsock2初期化 if (stat==INVALID_SOCKET){ dialog "ソケットエラー",1 end } socket AF_INET,SOCK_RAW,IPPROTO_IP ;ソケット作成 soc=stat if (soc==INVALID_SOCKET){ dialog "ソケットエラー",1 end } ;IP取得して4バイトに変換 ipget ipstr=refstr sdim ipint,3,4 strindex=0 repeat 4 strindex=strindex+strsize ;getstr用のインデックス変数。 ;直前までインデックス+直前に取得した文字数だから if (cnt!3) { getstr ipint.cnt,ipstr,strindex,'.' ;IPは"xxx.xxx.xxx.xxx"となってるので ;"."ごとに区切って配列型変数に代入 } if (cnt=3) : getstr ipint.3,ipstr,strindex ;最後だけ"."無いので別処理 loop ipadd=0 ;ipaddを初期化 repeat 4 poke ipadd,cnt,int(ipint.cnt) ;ここで変数ipaddに1バイトずつ直接書き込み。 ;int()の形にして数値型変数を書き込むこと。 loop dim adpt,4 ;adptを初期化。sdimだと64バイト必ず取得するから勿体無い ;数値型変数一つで4バイト×4つの配列だから16バイト wpoke adpt,0,AF_INET ;ここにプロトコル。ここではIPv4 wpoke adpt,2,htons(80) ;ここにポート番号。らしいけど良くわかってない。 memcpy adpt,ipadd,4,4 ;ここにIPアドレス。4バイトで。 bind soc,varptr(adpt),16 ;ソケットを関連付ける if (stat=SOCKET_ERROR){ ;ソケットエラーは別ラベルに置いた方がいいのか? dialog "ソケットエラー",1 goto *cleanup } poke optval,0,1 ;いちいちpoke命令使うの面倒ヽ(`д´)ノ ioctlsoc soc,SIO_RCVALL,varptr(optval) ;プロミスキャスモードに。 if (stat=SOCKET_ERROR){ dialog "ソケットエラー",1 goto *cleanup } poke arg,3,1 ioctlsoc soc,FIONBIO,varptr(arg) ;非ブロッキングモードに。 if (stat=SOCKET_ERROR){ dialog "ソケットエラー",1 goto *cleanup } sdim len,4 ;パケットキャプチャ用の変数初期化。 dim recvdata,1000 sdim recvsize,1024 sdim recvmes,65000 *cl cls tt="" qq="" jj="" sdim kk,1204 pos 0,50:mesbox jj,1000,600,1 pos 0,0:button goto "cls",*cl *main color 255,255,255 boxf color 0,0,0 dim recvdata,1000 recv soc,varptr(recvdata),3999,0 if stat=SOCKET_ERROR { if (WSAGetLastError() = WSAEWOULDBLOCK ){ recvsize=0 ;rr=recvdata(0) ;mes "受信成功" }else{ dialog "ソケットエラー",1 goto *cleanup }else{ recvsize=stat } } if (int(recvsize)>recvsize_max):recvsize_max=int(recvsize) a=0 repeat if (strf("%x",recvdata(a))!="0"):a++:else:break loop font "MSゴシック",10 sdim xx,1024 oo=0 repeat a;数値から文字列に変換し結合作業 b=recvdata(oo) lpoke xx,0,b jj=jj+xx color 255,255,255 boxf 400,0,1000,700 color 0,0,0 pos 400,0:mes "cnt="+(a-oo):pos 450,0:mes "b="+strf("%x",b):pos 600,0:mes "xx="+xx ;await 1 ;負荷調整 oo++ flg=1 loop if (flg==1)AND(jj!=""):jj=jj+"\n\n\n\n":kk=jj+kk+"\n":objprm 0,kk:sdim jj,1024:flg=0 await 1 goto *main *cleanup closesoc soc ;ソケット閉じる WSACleanup ;winsock後始末 end


戻る