協議解析
A. 用於解析域名的協議是什麼
用於解析域名的協議是:
域名解析協議 又名:DNS
B. 『各種網路協議詳解書籍』
協議分析網
http://www.cnpaf.net/
不行就自己找rfc看吧
C. 如何用wireshark lua編寫的協議解析器,查看http包的uri/url的query string里的參
Wireshark解析HTTP GET方法不會解析URI里Query字元串里的參數(通常由GET方式提交form數據),本文介紹用lua編寫一個簡單的協議解析器,讓這些參數解析出來,並顯示在wireshark協議解析窗口裡。
首先編寫以下解析器lua腳本(用文本編輯器編輯即可),取文件名為my_http_querystring_decoder.lua:
view plain
-- Decode param=value from query string of http request uri (http.request.uri)
-- Author: Huang Qiangxiong ([email protected])
-- change log:
-- 2010-07-01
-- Just can play.
------------------------------------------------------------------------------------------------
do
local querystring_decoder_proto = Proto("my_http_querystring_decoder",
"Decoded HTTP URI Query String [HQX's plugins]")
---- url decode (from www.lua.org guide)
function unescape (s)
s = string.gsub(s, "+", " ")
s = string.gsub(s, "%%(%x%x)", function (h)
return string.char(tonumber(h, 16))
end)
return s
end
---- convert string to hex string
function string2hex (s)
local hex = "";
for i=1, #s, 1 do
hex = hex .. string.format("%x", s:byte(i))
end
return hex
end
local f_http_uri = Field.new("http.request.uri")
---- my dissector
function querystring_decoder_proto.dissector(tvb, pinfo, tree)
local http_uri = f_http_uri()
-- ignore packages without "http.request.uri"
if not http_uri then return end
-- begin build my tree
local content = http_uri.value
local idx = content:find("?")
if not idx then return end -- not include query string, so stop parsing
local tab = ByteArray.new(string2hex(content)):tvb("Decoded HTTP URI Query String")
local tab_range = tab()
-- add proto item to tree
local subtree = tree:add(querystring_decoder_proto, tab_range)
-- add raw data to tree
subtree:add(tab_range, "[HTTP Request URI] (" .. tab_range:len() .. " bytes)"):add(tab_range, content)
-- add param value pair to tree
local pairs_tree = subtree:add(tab_range, "[Decoded Query String]")
local si = 1
local ei = idx
local count = 0
while ei do
si = ei + 1
ei = string.find(content, "&", si)
local xlen = (ei and (ei - si)) or (content:len() - si + 1)
if xlen > 0 then
pairs_tree:add(tab(si-1, xlen), unescape(content:sub(si, si+xlen-1)))
count = count + 1
end
end
pairs_tree:append_text(" (" .. count .. ")")
end
-- register this dissector
register_postdissector(querystring_decoder_proto)
end
然後修改wireshark安裝目錄下的init.lua文件:
(1)把disable_lua = true; do return end;這行注釋掉:在前面加「--」
(2)然後在init.lua文件最後面加一句:dofile("my_http_querystring_decoder.lua")
OK大功告成,打開HTTP抓包,若其請求中URI帶QueryString,則界面如下:
可以看到,在協議解析樹上新增了Decoded HTTP URI Query String ... 節點。看該節點下[HTTP Request URI]為原始HTTP Request URI,[Decoded Query String]下為解開後的一個個參數(經過url decode)。而且在wireshark的「Packet Bytes」窗口裡新增了一個「Decoded HTTP URI Query String」的數據tab,專門顯示HTTP URI內容,用於顯示參數在URL里的原始形式。
另外,如果要解析HTTP Body部分的參數(用POST方法提交form數據),請參考《用Wireshark lua編寫的協議解析器查看Content-Type為application/x-www-form-urlencoded的HTTP抓包》(http://blog.csdn.net/jasonhwang/archive/2010/04/25/5525700.aspx)。
D. 什麼是網路協議分析工具
網路協議分析工具,也就是用於TCP/IP網路協議分析的軟體工具套件。 網路協議工具可以獲得區域網內各節點計算機的大量基本信息,利用WinPcap過濾、捕獲流經本地的區域網幀信息,可以加以分析和顯示,系統還編輯、發送各種類型的信包,同時捕獲、分析對發送信包的響應信包,從而觀察發送信包後對方的相應響應。該系統的設計與實現對於TCP/IP網路協議的開發、調試和測試提供了一個有力的工具套件。
隨著網路技術的快速發展,計算機網路正發揮著越來越大的作用。網路環境變得越來越復雜,與此同時,網路系統的安全問題也越來越重要,對網路系統和網路安全領域的開發、調試和測試的工具提出了更高的要求。
E. 用於解析域名的協議是 ( )。
域名解析協議 :DNS
DNS 命名用於 Internet 等 TCP/IP 網路中,通過用戶友好的名稱查找計算機和服務。當用戶在應用程序中輸入 DNS 名稱時,DNS 服務可以將此名稱解析為與之相關的其他信息。
F. 都有哪些網路協議解析技術
如果對你有幫助的話給個採納,謝謝
G. 怎麼解析DL645通信協議
可以使用廠家提供的軟體,或者用通用協議解析軟體,如格西烽火通信測試軟體等,自己編寫DL645協議,可以方便解析出自己需要的數據。
H. 如何實現java解析網路協議報文
普通參數:
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
文件參數:
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
參數實體的最後一行是: --加上boundary加上--,最後換行,這里的 格式即為: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--。
模擬文件上傳請求
public static void uploadFile(String fileName) {
try {
// 換行符
final String newLine = "\r\n";
final String boundaryPrefix = "--";
// 定義數據分隔線
String BOUNDARY = "========7d4a6d158c9";
// 伺服器的域名
URL url = new URL("www.myhost.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 設置為POST情
conn.setRequestMethod("POST");
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 設置請求頭參數
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
// 上傳文件
File file = new File(fileName);
StringBuilder sb = new StringBuilder();
sb.append(boundaryPrefix);
sb.append(BOUNDARY);
sb.append(newLine);
// 文件參數,photo參數名可以隨意修改
sb.append("Content-Disposition: form-data;name=\"photo\";filename=\"" + fileName
+ "\"" + newLine);
sb.append("Content-Type:application/octet-stream");
// 參數頭設置完以後需要兩個換行,然後才是參數內容
sb.append(newLine);
sb.append(newLine);
// 將參數頭的數據寫入到輸出流中
out.write(sb.toString().getBytes());
// 數據輸入流,用於讀取文件數據
DataInputStream in = new DataInputStream(new FileInputStream(
file));
byte[] bufferOut = new byte[1024];
int bytes = 0;
// 每次讀1KB數據,並且將文件數據寫入到輸出流中
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
// 最後添加換行
out.write(newLine.getBytes());
in.close();
// 定義最後數據分隔線,即--加上BOUNDARY再加上--。
byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine)
.getBytes();
// 寫上結尾標識
out.write(end_data);
out.flush();
out.close();
// 定義BufferedReader輸入流來讀取URL的響應
// BufferedReader reader = new BufferedReader(new InputStreamReader(
// conn.getInputStream()));
// String line = null;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
} catch (Exception e) {
System.out.println("發送POST請求出現異常!" + e);
e.printStackTrace();
}
}
I. 簡述地址解析協議的工作過程
arp協議是「address
resolution
protocol」(地址解析協議)的縮寫。在區域網中,網路中實際傳輸的是「幀」,幀裡面是有目標主機的mac地址的。在乙太網中,一個主機要和另一個主機進行直接通信,必須要知道目標主機的mac地址。但這個目標mac地址是如何獲得的呢?它就是通過地址解析協議獲得的。所謂「地址解析」就是主機在發送幀前將目標ip地址轉換成目標mac地址的過程。arp協議的基本功能就是通過目標設備的ip地址,查詢目標設備的mac地址,以保證通信的順利進行。
我們以主機a(192.168.1.5)向主機b(192.168.1.1)發送數據為例。
當發送數據時,主機a會在自己的arp緩存表中尋找是否有目標ip地址。
如果找到了,也就知道了目標mac地址,直接把目標mac地址寫入幀裡面發送就可以了;
如果在arp緩存表中沒有找到相對應的ip地址,主機a就會在網路上發送一個廣播,目標mac地址是「ff.ff.ff.ff.ff.ff」,這表示向同一網段內的所有主機發出這樣的詢問:「192.168.1.1的mac地址是什麼?」網路上其他主機並不響應arp詢問,只有主機b接收到這個幀時,才向主機a做出這樣的回應:「192.168.1.1的mac地址是00-aa-00-62-c6-09」。
這樣,主機a就知道了主機b的mac地址,它就可以向主機b發送信息了。同時它還更新了自己的arp緩存表,下次再向主機b發送信息時,直接從arp緩存表裡查找就可以了。
arp緩存表採用了老化機制,在一段時間內如果表中的某一行沒有使用,就會被刪除,這樣可以大大減少arp緩存表的長度,加快查詢速度。
J. http協議解析 請求行的信息怎麼提取 c語言源碼
實現步驟:
1)用Wireshark軟體抓包得到test.pcap文件
2)程序:分析pcap文件頭 -> 分析pcap_pkt頭 -> 分析幀頭 -> 分析ip頭 -> 分析tcp頭 -> 分析http信息
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<time.h>
#define BUFSIZE 10240
#define STRSIZE 1024
typedef long bpf_int32;
typedef unsigned long bpf_u_int32;
typedef unsigned short u_short;
typedef unsigned long u_int32;
typedef unsigned short u_int16;
typedef unsigned char u_int8;
//pacp文件頭結構體
struct pcap_file_header
{
bpf_u_int32 magic; /* 0xa1b2c3d4 */
u_short version_major; /* magjor Version 2 */
u_short version_minor; /* magjor Version 4 */
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
//時間戳
struct time_val
{
long tv_sec; /* seconds 含義同 time_t 對象的值 */
long tv_usec; /* and microseconds */
};
//pcap數據包頭結構體
struct pcap_pkthdr
{
struct time_val ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
//數據幀頭
typedef struct FramHeader_t
{ //Pcap捕獲的數據幀頭
u_int8 DstMAC[6]; //目的MAC地址
u_int8 SrcMAC[6]; //源MAC地址
u_short FrameType; //幀類型
} FramHeader_t;
//IP數據報頭
typedef struct IPHeader_t
{ //IP數據報頭
u_int8 Ver_HLen; //版本+報頭長度
u_int8 TOS; //服務類型
u_int16 TotalLen; //總長度
u_int16 ID; //標識
u_int16 Flag_Segment; //標志+片偏移
u_int8 TTL; //生存周期
u_int8 Protocol; //協議類型
u_int16 Checksum; //頭部校驗和
u_int32 SrcIP; //源IP地址
u_int32 DstIP; //目的IP地址
} IPHeader_t;
//TCP數據報頭
typedef struct TCPHeader_t
{ //TCP數據報頭
u_int16 SrcPort; //源埠
u_int16 DstPort; //目的埠
u_int32 SeqNO; //序號
u_int32 AckNO; //確認號
u_int8 HeaderLen; //數據報頭的長度(4 bit) + 保留(4 bit)
u_int8 Flags; //標識TCP不同的控制消息
u_int16 Window; //窗口大小
u_int16 Checksum; //校驗和
u_int16 UrgentPointer; //緊急指針
}TCPHeader_t;
//
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len); //查找 http 信息函數
//
int main()
{
struct pcap_file_header *file_header;
struct pcap_pkthdr *ptk_header;
IPHeader_t *ip_header;
TCPHeader_t *tcp_header;
FILE *fp, *output;
int pkt_offset, i=0;
int ip_len, http_len, ip_proto;
int src_port, dst_port, tcp_flags;
char buf[BUFSIZE], my_time[STRSIZE];
char src_ip[STRSIZE], dst_ip[STRSIZE];
char host[STRSIZE], uri[BUFSIZE];
//初始化
file_header = (struct pcap_file_header *)malloc(sizeof(struct pcap_file_header));
ptk_header = (struct pcap_pkthdr *)malloc(sizeof(struct pcap_pkthdr));
ip_header = (IPHeader_t *)malloc(sizeof(IPHeader_t));
tcp_header = (TCPHeader_t *)malloc(sizeof(TCPHeader_t));
memset(buf, 0, sizeof(buf));
//
if((fp = fopen(「test.pcap」,」r」)) == NULL)
{
printf(「error: can not open pcap file\n」);
exit(0);
}
if((output = fopen(「output.txt」,」w+」)) == NULL)
{
printf(「error: can not open output file\n」);
exit(0);
}
//開始讀數據包
pkt_offset = 24; //pcap文件頭結構 24個位元組
while(fseek(fp, pkt_offset, SEEK_SET) == 0) //遍歷數據包
{
i++;
//pcap_pkt_header 16 byte
if(fread(ptk_header, 16, 1, fp) != 1) //讀pcap數據包頭結構
{
printf(「\nread end of pcap file\n」);
break;
}
pkt_offset += 16 + ptk_header->caplen; //下一個數據包的偏移值
strftime(my_time, sizeof(my_time), 「%Y-%m-%d %T」, localtime(&(ptk_header->ts.tv_sec))); //獲取時間
// printf(「%d: %s\n」, i, my_time);
//數據幀頭 14位元組
fseek(fp, 14, SEEK_CUR); //忽略數據幀頭
//IP數據報頭 20位元組
if(fread(ip_header, sizeof(IPHeader_t), 1, fp) != 1)
{
printf(「%d: can not read ip_header\n」, i);
break;
}
inet_ntop(AF_INET, (void *)&(ip_header->SrcIP), src_ip, 16);
inet_ntop(AF_INET, (void *)&(ip_header->DstIP), dst_ip, 16);
ip_proto = ip_header->Protocol;
ip_len = ip_header->TotalLen; //IP數據報總長度
// printf(「%d: src=%s\n」, i, src_ip);
if(ip_proto != 0×06) //判斷是否是 TCP 協議
{
continue;
}
//TCP頭 20位元組
if(fread(tcp_header, sizeof(TCPHeader_t), 1, fp) != 1)
{
printf(「%d: can not read ip_header\n」, i);
break;
}
src_port = ntohs(tcp_header->SrcPort);
dst_port = ntohs(tcp_header->DstPort);
tcp_flags = tcp_header->Flags;
// printf(「%d: src=%x\n」, i, tcp_flags);
if(tcp_flags == 0×18) // (PSH, ACK) 3路握手成功後
{
if(dst_port == 80) // HTTP GET請求
{
http_len = ip_len – 40; //http 報文長度
match_http(fp, 「Host: 「, 「\r\n」, host, http_len); //查找 host 值
match_http(fp, 「GET 「, 「HTTP」, uri, http_len); //查找 uri 值
sprintf(buf, 「%d: %s src=%s:%d dst=%s:%d %s%s\r\n」, i, my_time, src_ip, src_port, dst_ip, dst_port, host, uri);
//printf(「%s」, buf);
if(fwrite(buf, strlen(buf), 1, output) != 1)
{
printf(「output file can not write」);
break;
}
}
}
} // end while
fclose(fp);
fclose(output);
return 0;
}
//查找 HTTP 信息
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len)
{
int i;
int http_offset;
int head_len, tail_len, val_len;
char head_tmp[STRSIZE], tail_tmp[STRSIZE];
//初始化
memset(head_tmp, 0, sizeof(head_tmp));
memset(tail_tmp, 0, sizeof(tail_tmp));
head_len = strlen(head_str);
tail_len = strlen(tail_str);
//查找 head_str
http_offset = ftell(fp); //記錄下HTTP報文初始文件偏移
while((head_tmp[0] = fgetc(fp)) != EOF) //逐個位元組遍歷
{
if((ftell(fp) – http_offset) > total_len) //遍歷完成
{
sprintf(buf, 「can not find %s \r\n」, head_str);
exit(0);
}
if(head_tmp[0] == *head_str) //匹配到第一個字元
{
for(i=1; i<head_len; i++) //匹配 head_str 的其他字元
{
head_tmp[i]=fgetc(fp);
if(head_tmp[i] != *(head_str+i))
break;
}
if(i == head_len) //匹配 head_str 成功,停止遍歷
break;
}
}
// printf(「head_tmp=%s \n」, head_tmp);
//查找 tail_str
val_len = 0;
while((tail_tmp[0] = fgetc(fp)) != EOF) //遍歷
{
if((ftell(fp) – http_offset) > total_len) //遍歷完成
{
sprintf(buf, 「can not find %s \r\n」, tail_str);
exit(0);
}
buf[val_len++] = tail_tmp[0]; //用buf 存儲 value 直到查找到 tail_str
if(tail_tmp[0] == *tail_str) //匹配到第一個字元
{
for(i=1; i<tail_len; i++) //匹配 head_str 的其他字元
{
tail_tmp[i]=fgetc(fp);
if(tail_tmp[i] != *(tail_str+i))
break;
}
if(i == tail_len) //匹配 head_str 成功,停止遍歷
{
buf[val_len-1] = 0; //清除多餘的一個字元
break;
}
}
}
// printf(「val=%s\n」, buf);
fseek(fp, http_offset, SEEK_SET); //將文件指針 回到初始偏移
}