【毕业设计日记-4月】mark小尝成果

千辛万苦,终于可以把消息提出来了!!!

对之后的工作提几点:

1.加上图形界面(虽然没什么好用图形界面的但是还是好看一点)

2.过滤器还需要优化,例如发送比较长的消息的时候不能简单设置 less 1500

3.偶尔出现程序崩溃情况,还不知道原因

4.中文还不能在控制台显示,只能显示英文和其他字符

粗糙代码如下:

  1 #ifdef _MSC_VER
  2 /*
  3 * we do not want the warnings about the old deprecated and unsecure CRT functions
  4 * since these examples can be compiled under *nix as well
  5 */
  6 #define _CRT_SECURE_NO_WARNINGS
  7 #endif
  8
  9
 10 #include "stdafx.h"
 11 #include <stdio.h>
 12 #include <stdlib.h>
 13 #include <sys/types.h>
 14 #include <pcap.h>
 15 #include <remote-ext.h>
 16 #include "zlib.h"
 17
 18
 19 #define LINE_LEN 16
 20
 21 /* 4 bytes IP address */
 22 typedef struct ip_address
 23 {
 24     u_char byte1;
 25     u_char byte2;
 26     u_char byte3;
 27     u_char byte4;
 28 }ip_address;
 29
 30 /* IPv4 header */
 31 typedef struct ip_header
 32 {
 33     u_char    ver_ihl;        // Version (4 bits) + Internet header length (4 bits)
 34     u_char    tos;            // Type of service
 35     u_short tlen;            // Total length
 36     u_short identification; // Identification
 37     u_short flags_fo;        // Flags (3 bits) + Fragment offset (13 bits)
 38     u_char    ttl;            // Time to live
 39     u_char    proto;            // Protocol
 40     u_short crc;            // Header checksum
 41     ip_address    saddr;        // Source address
 42     ip_address    daddr;        // Destination address
 43     u_int    op_pad;            // Option + Padding
 44 }ip_header;
 45
 46
 47 /* TCP header*/
 48 typedef struct tcp_header
 49 {
 50     u_short sport;
 51     u_short dport;
 52     u_int seq;
 53     u_int ack;
 54     u_short ofs_res_code;
 55     u_short window;
 56     u_short checksum;
 57     u_short urp;
 58 }tcp_header;
 59
 60 /* packet handler函数原型 */
 61 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
 62
 63 /* dispatcher handler函数原型*/
 64 void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *);
 65
 66 int gzdecompress(Bytef *zdata, uLong nzdata, Bytef *data, uLong ndata);
 67
 68 void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len);
 69
 70 void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len);
 71
 72 int main(int argc,char **argv)
 73 {
 74     pcap_if_t *alldevs;
 75     pcap_if_t *d;
 76     int inum;
 77     int i = 0;
 78     pcap_t *adhandle;
 79     pcap_t *fp;
 80     char errbuf[PCAP_ERRBUF_SIZE];
 81     pcap_dumper_t *dumpfile;
 82
 83     u_int netmask;
 84     char packet_filter[] = "ip and tcp and dst net 115.156.197.44 and tcp src port 80 and greater 530 and less 1500";
 85     struct bpf_program fcode;
 86
 87     struct pcap_pkthdr *header;
 88     const u_char *pkt_data;
 89
 90
 91     char source[PCAP_BUF_SIZE];
 92
 93     /*检查是否命令行输入了两个参数*/
 94     if (argc != 2)
 95     {
 96         printf("usage: %s filename", argv[0]);
 97         return -1;
 98     }
 99
100     /*取设备列表*/
101     if (pcap_findalldevs(&alldevs, errbuf) == -1)
102     {
103         fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
104         exit(1);
105     }
106
107     /*打印设备列表*/
108     for (d = alldevs; d; d = d->next)
109     {
110         printf("%d. %s", ++i, d->name);
111         if (d->description)
112             printf(" (%s)\n", d->description);
113         else
114             printf(" (No description available)\n");
115     }
116
117     if (i == 0)
118     {
119         printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
120         return -1;
121     }
122
123     printf("Enter the interface number (1-%d):", i);
124     scanf("%d", &inum);
125
126
127     if (inum < 1 || inum > i)
128     {
129         printf("\nAdapter number out of range.\n");
130         /* 释放设备列表 */
131         pcap_freealldevs(alldevs);
132         return -1;
133     }
134
135     /* 跳转到选中的设备 */
136     for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);
137
138     /* 打开设备 */
139     if ((adhandle = pcap_open_live(d->name,    // name of the device
140         65536,            // portion of the packet to capture.
141         // 65536 grants that the whole packet will be captured on all the MACs.
142         PCAP_OPENFLAG_PROMISCUOUS,                // promiscuous mode (nonzero means promiscuous)
143         1000,            // read timeout
144         errbuf            // error buffer
145         )) == NULL)
146     {
147         fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n");
148         /* 释放设备列表 */
149         pcap_freealldevs(alldevs);
150         return -1;
151     }
152
153     /* 检查链路层,为了简单我们只检查以太网 */
154     if (pcap_datalink(adhandle) != DLT_EN10MB)
155     {
156         fprintf(stderr, "\nThis program works only on Ethernet networks.\n");
157         /* 释放设备列表 */
158         pcap_freealldevs(alldevs);
159         return -1;
160     }
161
162     if (d->addresses != NULL)
163         /* 获得接口第一个地址的掩码 */
164         netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
165     else
166         /* 如果接口没有地址,我们假设一个C类的掩码 */
167         netmask = 0xffffff;
168
169     //编译过滤器
170     if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0)
171     {
172         fprintf(stderr, "\nUnable to compile the packet filter. Check the syntax.\n");
173         /* 释放设备列表 */
174         pcap_freealldevs(alldevs);
175         return -1;
176     }
177
178     //设置过滤器
179     if (pcap_setfilter(adhandle, &fcode)<0)
180     {
181         fprintf(stderr, "\nError setting the filter.\n");
182         /* 释放设备列表 */
183         pcap_freealldevs(alldevs);
184         return -1;
185     }
186
187     /* 打开堆文件 */
188     dumpfile = pcap_dump_open(adhandle, argv[1]);
189
190     if (dumpfile == NULL)
191     {
192         fprintf(stderr, "\nError opening output file\n");
193         return -1;
194     }
195
196     printf("\nlistening on %s...\n", d->description);
197
198     /* 我们不再需要设备,释放设备列表 */
199     pcap_freealldevs(alldevs);
200
201     /* 开始捕获 */
202     pcap_loop(adhandle, 1, packet_handler, (unsigned char *)dumpfile);
203     pcap_close(adhandle);
204
205     /* 打开捕获的文件 */
206     if ((fp = pcap_open_offline(argv[1],            // name of the device
207         errbuf                    // error buffer
208         )) == NULL)
209     {
210         fprintf(stderr, "\nUnable to open the file %s.\n", argv[1]);
211         return -1;
212     }
213     /* 读取并处理数据包,直到读到EOF */
214     pcap_loop(fp, 10, dispatcher_handler, NULL);
215     pcap_close(fp);
216
217     return 0;
218
219
220 }
221
222 /* Callback function invoked by libpcap for every incoming packet */
223 void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
224 {
225     /* 将数据包保存到堆文件 */
226     pcap_dump(dumpfile, header, pkt_data);
227 }
228
229 void dispatcher_handler(u_char *temp1,const struct pcap_pkthdr *header,const u_char *pkt_data)
230 {
231     u_int i = 0;
232     u_int j = 0;
233     u_int tmp1;
234     u_int tmp2;
235
236     ip_header *ih;
237     tcp_header *th;
238     u_int ip_len;
239
240     Bytef src[1000] = { 0 };
241     Bytef dst[1000] = { 0 };
242     u_char dst2[1000] = { 0 };
243     u_char dst3[1000] = { 0 };
244
245     u_char s[256] = { 0 }, s2[256] = { 0 };//S-box
246     char key[256] = { "AzarJ1AmjRQuJoqi" };
247     u_long len=0;
248
249     /*
250     * unused variable
251     */
252     (VOID*)temp1;
253
254     /* 打印时间戳和数据包长度 */
255     printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);
256
257
258     /* 获得ip首部地址*/
259     ih = (ip_header *)(pkt_data +14); //length of ethernet header
260
261     /* 获得tcp首部地址*/
262     ip_len = (ih->ver_ihl & 0xf) * 4;//其实就是20啦!
263     th = (tcp_header *)((u_char*)ih + ip_len);
264
265     //printf("%d\n", ip_len);
266
267     /* 打印数据包 */
268     for (i = 346,j = 0 ; (i < header->caplen + 1); i++, j++)
269     {
270         printf("%.2x ", pkt_data[i]);
271         if ((i % LINE_LEN) == 0) printf("\n");
272         src[j] = pkt_data[i];
273     }
274
275     printf("\n\n");
276     //printf("\nhakuna matata!!!!!!!!!!\n");
277
278     gzdecompress(src, 1000, dst, 1000);
279     //for (i = 0; dst[i]; i++)
280         //printf("%c", dst[i]);
281
282     //printf("\nhakuna matata!!!!!!!!!!\n");
283
284     /*
285         dst[] :json结构
286         dst1[]: 截取的msgContent字符串(Bytef类型)
287         dst2[]: 截取的msgContent字符串(unsigned char类型)
288         dst3[]: msgContent字符串转化为16进制串
289     */
290     for (i = 0; dst[i]; i++)
291     {
292         if (dst[i] == ‘m‘ && dst[i + 1] == ‘s‘ && dst[i + 2] == ‘g‘ && dst[i + 3] == ‘C‘)
293             break;
294     }
295     i += 13;
296     j = 0;
297     while (dst[i] != ‘"‘)
298     {
299         //printf("%.2x ", dst[i]);
300         dst2[j] =(u_char) dst[i];
301         //printf("%.2x", dst2[j]);
302         i++; j++;
303     }
304     //printf("\nhakuna matata!!!!!!!!!!\n");
305
306     i = 0; j = 0;
307     while (dst2[j])
308     {
309         switch (dst2[j])
310         {
311         case ‘A‘:
312             tmp1 = 10;
313             break;
314         case ‘B‘:
315             tmp1 = 11;
316             break;
317         case ‘C‘:
318             tmp1 = 12;
319             break;
320         case ‘D‘:
321             tmp1 = 13;
322             break;
323         case ‘E‘:
324             tmp1 = 14;
325             break;
326         case ‘F‘:
327             tmp1 = 15;
328             break;
329         default:
330             tmp1 = dst2[j] - ‘0‘;
331             break;
332         }
333         switch (dst2[j + 1])
334         {
335         case ‘A‘:
336             tmp2 = 10;
337             break;
338         case ‘B‘:
339             tmp2 = 11;
340             break;
341         case ‘C‘:
342             tmp2 = 12;
343             break;
344         case ‘D‘:
345             tmp2 = 13;
346             break;
347         case ‘E‘:
348             tmp2 = 14;
349             break;
350         case ‘F‘:
351             tmp2 = 15;
352             break;
353         default:
354             tmp2 = dst2[j + 1] - ‘0‘;
355             break;
356         }
357         dst3[i] = (tmp1 << 4) + tmp2;
358         printf("%x ", dst3[i]);
359         i++; j += 2;
360     }
361
362     printf("\n\n");
363
364     /*解密部分*/
365     rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化
366     for (i = 0; dst3[i]; i++)
367         len++;
368     rc4_crypt(s, (unsigned char*)dst3, len);//解密
369     printf("%s", dst3);
370
371
372     printf("\n\n");
373     printf("%u\n\n", len);
374
375 }
376
377
378 /* 解压gizp部分 */
379
380 /* zdata 原数据 nzdata 原数据长度 data 解压后数据 ndata 解压后长度 */
381 int gzdecompress(Bytef *zdata, uLong nzdata,Bytef *data, uLong ndata)
382 {
383     int err = 0;
384     z_stream d_stream = { 0 }; /* decompression stream */
385     static char dummy_head[2] = {
386         0x8 + 0x7 * 0x10,
387         (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
388     };
389     d_stream.zalloc = NULL;
390     d_stream.zfree = NULL;
391     d_stream.opaque = NULL;
392     d_stream.next_in = zdata;
393     d_stream.avail_in = 0;
394     d_stream.next_out = data;
395     //只有设置为MAX_WBITS + 16才能解压带header和trailer的文本
396     if (inflateInit2(&d_stream, MAX_WBITS + 16) != Z_OK) return -1;
397     //if(inflateInit2(&d_stream, 47) != Z_OK) return -1;
398     while (d_stream.total_out < ndata && d_stream.total_in < nzdata) {
399         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
400         if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
401         if (err != Z_OK) {
402             if (err == Z_DATA_ERROR) {
403                 d_stream.next_in = (Bytef*)dummy_head;
404                 d_stream.avail_in = sizeof(dummy_head);
405                 if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK) {
406                     return -1;
407                 }
408             }
409             else return -1;
410         }
411     }
412     if (inflateEnd(&d_stream) != Z_OK) return -1;
413     ndata = d_stream.total_out;
414     return 0;
415 }
416
417
418 /* RC4部分 */
419
420 /*初始化函数*/
421 void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len)
422 {
423     int i = 0, j = 0;
424     char k[256] = { 0 };
425     unsigned char tmp = 0;
426     for (i = 0; i<256; i++)
427     {
428         s[i] = i;
429         k[i] = key[i%Len];
430     }
431     for (i = 0; i<256; i++)
432     {
433         j = (j + s[i] + k[i]) % 256;
434         tmp = s[i];
435         s[i] = s[j];//交换s[i]和s[j]
436         s[j] = tmp;
437     }
438 }
439
440 /*加解密*/
441 void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len)
442 {
443     int i = 0, j = 0, t = 0;
444     unsigned long k = 0;
445     unsigned char tmp;
446     for (k = 0; k<Len; k++)
447     {
448         i = (i + 1) % 256;
449         j = (j + s[i]) % 256;
450         tmp = s[i];
451         s[i] = s[j];//交换s[x]和s[y]
452         s[j] = tmp;
453         t = (s[i] + s[j]) % 256;
454         Data[k] ^= s[t];
455     }
456 }
时间: 2025-01-04 08:33:02

【毕业设计日记-4月】mark小尝成果的相关文章

【毕业设计日记-4月】已经破解密文

今天进度比较快. 上午对着书用wireshark找上次抓过的包,分析信息,我之前一直以为传递的数据信息会在 这个请求报文里,没想到其实在响应报文里. 看到这些熟悉的标识符就知道找对了,因为源程序中最后发送出去的内容也是msgContent,这两个密文也符合之前的明文"hi" "hey man"(字符串长度差,第一个字符一样). 今天主要最困惑的是之前这个函数 不知道他的用处到底是什么,之前还猜想是对汉字这种特殊编码进行转换.今天请教了实验室一个学长,他说这个就是把字

【毕业设计日记-4月】pcap编程之分析数据包

昨天看到了最重要的一部分,分析数据包. 这个分析UDP的程序基本上前面都能看得懂,主要还是对报文的分析这一部分. 在blog里找到的图,对于这个过程,反过来也就是:应用层数据,封装成UDP或者TCP报文,再加上IP首部,然后再加上以太网首部,就成为了可以在链路层传播的数据帧. 以太网驱动程序首先根据以太网首部中的"上层协议"字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP.ARP 还是RARP 协议的数据报,然后交给相应的协议处理.假如是IP 数据报

【毕业设计日记-4月】WINCAP程序框架

今天又看了一下WINCAP技术文档的第七篇——处理脱机堆文件.把其中两个程序综合了一下,再使用前面讲到的filter,自己捣鼓出来了一个程序的基本框架. 目前我这个做得还很基本,可以抓到相应的数据包,但仍存在两个问题: 1.只能人工设定先捕获多少个数据包到堆文件,再从中一个个读取 2.我抓的包(如下右)只有HTTP包的内容,没有json的内容,我不懂json和HTTP数据包到底是什么关系,json的内容并没有接在HTTP报文后面 问题2比较关键,亟待解决.问题1的话算是一个提升,现在设想是开两个

【毕业设计日记-4月】gzip格式解压

之前很困惑的一个问题,这两天也倒腾出来了,就是wireshark分析出来的这个 ↑  ①Frame   ↑②De-chunked entity body  ↑③Uncompressed entity body 这三部分的关系是啥? 网上也找不到,还是请教了师兄师姐,才知道①是报文的所有内容,②是①中HTTP报文后面压缩的内容,③就是这部分压缩内容解压后的内容,也就是msgContent等等等这些需要的内容,所以我现在要做的就是截获报文之后对这部分内容进行解压(然后再提取msgContent的内容

一对幼兔一个月长成小兔,再过一月长成成兔并生下幼兔,问24个月之后有多少对兔子,成兔每个月都会生下一对幼兔

int a=1,b=0,c=0,sum = 0;//a 幼兔对数,b 小兔对数,c 成兔对数,sum 总对数 for (int i = 1; i <=24; i++) { if (i == 1) { a = 1; b = 0; c = 0; } else { c = b + c; b = a; a = c; } sum = a + b + c; Console.WriteLine(i+"个月后,一共有兔子" + sum + "对,其中幼兔" + a + &qu

2015-2月的小程序们

马上就要过年了,今天是二月最后一天上班了,心情有些激动,恨不得立马就到家去.再来公司的时候就是3.1号了,所以在离开之前把2月份的小程序们储存起来.虽然很多都是参考了网上的小程序练习,但是自己有自己的风格,感觉存起来意义很大的,这样坚持了两个月不到,感觉很多基础的东西有了更加清晰的概念,解决很多问题的时候都会到原点去想问题了. package everyworkdayprogramming._2015_2_02; /** * * 将字符串还原成:"我要学编程".如:我...我.要...

AC日记——[国家集训队2010]小Z的袜子 cogs 1775

[国家集训队2010]小Z的袜子 思路: 传说中的莫队算法(优雅的暴力): 莫队算法是一个离线的区间询问算法: 如果我们知道[l,r], 那么,我们就能O(1)的时间求出(l-1,r),(l+1,r),(l,r-1),(l,r+1); 莫队算法怎么保证时间呢? 把询问排序; 然后进行暴力; 但是这样仍然需要很长很长的时间; 所以,我们引入一个根号方法,分块; 把区间的点分块; 然后每个询问的l,r按l所属的块为第一关键字,l,r为第二第三; 排序完后,就可以保证复杂度是O(n*sqrt(n));

AC日记——爱改名的小融 codevs 2967

2967 爱改名的小融 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名. 他的名字都是英文,只要按顺序出现R,K,Y三个字母,就是他的名字. 给你N个名字,请你一一判断是不是小融. 输入描述 Input Description N N行,名字(全大写) 输出描述 Output Description N行,每行YES或NO(大写) 样例输入 Sample Input 3 RKY R

AC日记——爱改名的小融2 codevs 3149

3149 爱改名的小融 2 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名.现在他的要求变了,只要是英文字母就是他的名字.先给你N个名字,请你一一判断是不是小融.本题还加强了测试数据 输入描述 Input Description NN行名字(全部为字符) 输出描述 Output Description N行,YES或NO(大写) 样例输入 Sample Input 3&6*14315