mysniffview.cpp
上传用户:xakehao
上传日期:2013-08-28
资源大小:100k
文件大小:12k
源码类别:

CA认证

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "mycap.h"
  3. #include "MycapDoc.h"
  4. #include "mysniffview.h"
  5. #include "mycapview.h"
  6. #include <vector>
  7. #include <pcap.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. extern int m_flag;
  14. using namespace std;
  15. typedef vector<const u_char *> v;
  16. extern v myvector;
  17. using namespace std;
  18. typedef vector<u_short> u;
  19. extern u mycount;
  20. using namespace std;
  21. typedef vector<PACKET> c;
  22. extern c mypacket;
  23. IMPLEMENT_DYNCREATE(mysniffview, CScrollView)
  24. mysniffview::mysniffview()
  25. {
  26. }
  27. mysniffview::~mysniffview()
  28. {
  29. }
  30. BEGIN_MESSAGE_MAP(mysniffview, CScrollView)
  31. END_MESSAGE_MAP()
  32. void mysniffview::OnInitialUpdate()
  33. {
  34. CScrollView::OnInitialUpdate();
  35. CSize sizeTotal;
  36. sizeTotal.cx = sizeTotal.cy = 500;//指定滚动刷新的范围
  37. SetScrollSizes(MM_TEXT, sizeTotal);
  38. }
  39. void mysniffview::OnDraw(CDC* pDC)
  40. {
  41. CMyCapDoc* pDoc = GetDocument();
  42. TEXTMETRIC font;
  43. pDC->GetTextMetrics(&font);
  44. LONG height= font.tmHeight;
  45. LONG width = font.tmMaxCharWidth;
  46. CRect myRect;
  47. GetClientRect(myRect);
  48. CRect myrect(0, 0, 100, 500);
  49. char ip_len[8] = "";
  50. char szLen[8] = "";
  51. char identifier[16] = "";
  52. char offset[8] = "";
  53. char live[8] = "";
  54. char proto[8] = "";
  55. char checksum[16] = "";
  56. char srcIP[16] = "";
  57. char desIP[16] = "";
  58. char ope[16] = "";
  59. char srcport[16] = "";
  60. char desport[16] = "";
  61. char dramlen[8] = "";
  62. char crc[8] = "";
  63. char tcpsport[16] = "";
  64. char tcpdport[16] = "";
  65. char sernum[16] = "";
  66. char acknum[16] = "";
  67. char winlen[8] = "";
  68. char point[8] = "";
  69. char type[8] = "";
  70. char code[8] = "";
  71. char checksm[16] = "";
  72. char identif[16] = "";
  73. char sernm[16] = "";
  74. if(pDoc->GetCount() != -1)
  75. {//当标准位不等于-1时,即此时选择了CListView窗口中的某一项
  76. int mycon = pDoc->GetCount();
  77. //读取存放在向量中的包头的信息,解开包的IP头
  78. pDC->TextOut(0, 0, "IP头");
  79. pDC->TextOut(0, height, "版本号:");
  80. pDC->TextOut(7*width, height, "4");
  81. pDC->TextOut(0, 2*height, "IP头长:");
  82. sprintf(ip_len, "%d", (mypacket[mycon].IpHead.ver_ihl & 0xf) * 4);
  83. pDC->TextOut(7*width, 2*height, ip_len);
  84. pDC->TextOut(0, 3*height, "服务类型:");
  85. pDC->TextOut(7*width, 3*height, mypacket[mycon].IpHead.tos);
  86. pDC->TextOut(0, 4*height, "总长:");
  87. sprintf(szLen, "%d", ntohs(mypacket[mycon].IpHead.tlen)+18);
  88. pDC->TextOut(7*width, 4*height, szLen);
  89. pDC->TextOut(0, 5*height, "标识:");
  90. sprintf(identifier, "%d", ntohs(mypacket[mycon].IpHead.identification));
  91. pDC->TextOut(7*width, 5*height, identifier);
  92. pDC->TextOut(0, 6*height, "分段偏移:");
  93. sprintf(offset, "%d", (char)(ntohs(mypacket[mycon].IpHead.flags_fo)) & 0x1fff);
  94. pDC->TextOut(7*width, 6*height, offset);
  95. pDC->TextOut(0, 7*height, "生命期(S):");
  96. sprintf(live, "%d", int(mypacket[mycon].IpHead.ttl));
  97. pDC->TextOut(7*width, 7*height, live);
  98. pDC->TextOut(0, 8*height, "协议:");
  99. sprintf(proto, "%d", int(mypacket[mycon].IpHead.proto));
  100. pDC->TextOut(7*width, 8*height, proto);
  101. if(int(mypacket[mycon].IpHead.proto) == 17)
  102. pDC->TextOut(8*width, 8*height, "(UDP)");
  103. if(int(mypacket[mycon].IpHead.proto) == 6)
  104. pDC->TextOut(8*width, 8*height, "(TCP)");
  105. if(int(mypacket[mycon].IpHead.proto) == 1)
  106. pDC->TextOut(8*width, 8*height, "(ICMP)");
  107. pDC->TextOut(0, 9*height, "头校验和:");
  108. sprintf(checksum, "%d", ntohs(mypacket[mycon].IpHead.crc));
  109. pDC->TextOut(7*width, 9*height, checksum);
  110. pDC->TextOut(0, 10*height, "源地址:");
  111. sprintf(srcIP, "%d.%d.%d.%d", 
  112. mypacket[mycon].IpHead.saddr.byte1,
  113. mypacket[mycon].IpHead.saddr.byte2,
  114. mypacket[mycon].IpHead.saddr.byte3,
  115. mypacket[mycon].IpHead.saddr.byte4);
  116. pDC->TextOut(7*width, 10*height, srcIP);
  117. pDC->TextOut(0, 11*height, "目的地址:");
  118. sprintf(desIP, "%d.%d.%d.%d", 
  119. mypacket[mycon].IpHead.daddr.byte1,
  120. mypacket[mycon].IpHead.daddr.byte2,
  121. mypacket[mycon].IpHead.daddr.byte3,
  122. mypacket[mycon].IpHead.daddr.byte4);
  123. pDC->TextOut(7*width, 11*height, desIP);
  124. if(int(mypacket[mycon].IpHead.proto) == 17)
  125. {//判断,如果IP包头的协议字段是17,表示是UDP包
  126. //从存放在向量中的包头中读取并接口UDP头
  127. pDC->TextOut(0, 13*height, "UDP头:");
  128. pDC->TextOut(0, 14*height, "源端口:");
  129. sprintf(srcport, "%d", ntohs(mypacket[mycon].UdpHead.sport));
  130. pDC->TextOut(7*width, 14*height, srcport);
  131. pDC->TextOut(0, 15*height, "目的端口:");
  132. sprintf(desport, "%d", ntohs(mypacket[mycon].UdpHead.dport));
  133. pDC->TextOut(7*width, 15*height, desport);
  134. pDC->TextOut(0, 16*height, "UDP长度:");
  135. sprintf(dramlen, "%d", ntohs(mypacket[mycon].UdpHead.len));
  136. pDC->TextOut(7*width, 16*height, dramlen);
  137. pDC->TextOut(0, 17*height, "UDP校验和:");
  138. sprintf(crc, "%d", ntohs(mypacket[mycon].UdpHead.crc));
  139. pDC->TextOut(7*width, 17*height, crc);
  140. }
  141. if(int(mypacket[mycon].IpHead.proto) == 6)
  142. {
  143. //判断,如果IP包头的协议字段是6,表示是TCP包
  144. //从存放在向量中的包头中读取并接口TCP头
  145. pDC->TextOut(0, 13*height, "TCP头:");
  146. pDC->TextOut(0, 14*height, "源端口:");
  147. sprintf(tcpsport, "%d", ntohs(mypacket[mycon].TcpHead.tcpsport));
  148. pDC->TextOut(7*width, 14*height, tcpsport);
  149. pDC->TextOut(0, 15*height, "目的端口:");
  150. sprintf(tcpdport, "%d", ntohs(mypacket[mycon].TcpHead.tcpdport));
  151. pDC->TextOut(7*width, 15*height, tcpdport);
  152. pDC->TextOut(0, 16*height, "序列号:");
  153. sprintf(sernum, "%uld", ntohl(mypacket[mycon].TcpHead.sernum));
  154. pDC->TextOut(7*width, 16*height, sernum);
  155. pDC->TextOut(0, 17*height, "确认号:");
  156. sprintf(acknum, "%uld", ntohl(mypacket[mycon].TcpHead.acknum));
  157. pDC->TextOut(7*width, 17*height, acknum);
  158. pDC->TextOut(0, 18*height, "URG位:");
  159. if(int(mypacket[mycon].TcpHead.bit & 0x20) == 0)
  160. pDC->TextOut(7*width, 18*height, "0");
  161. if(int(mypacket[mycon].TcpHead.bit & 0x20) == 32)
  162. pDC->TextOut(7*width, 18*height, "1");
  163. pDC->TextOut(0, 19*height, "ACK位:");
  164. if(int(mypacket[mycon].TcpHead.bit & 0x10) == 0)
  165. {
  166. pDC->TextOut(7*width, 19*height, "0");
  167. //AfxMessageBox("确认序号无效!");
  168. pDC->TextOut(0, 27*height, "确认序号无效!");
  169. }
  170. if(int(mypacket[mycon].TcpHead.bit & 0x10) == 16)
  171. pDC->TextOut(7*width, 19*height, "1");
  172. pDC->TextOut(0, 20*height, "PSH位:");
  173. if(int(mypacket[mycon].TcpHead.bit & 0x8) == 0)
  174. pDC->TextOut(7*width, 20*height, "0");
  175. if(int(mypacket[mycon].TcpHead.bit & 0x20) == 8)
  176. pDC->TextOut(7*width, 20*height, "1");
  177. pDC->TextOut(0, 21*height, "RST位:");
  178. if(int(mypacket[mycon].TcpHead.bit & 0x4) == 0)
  179. pDC->TextOut(7*width, 21*height, "0");
  180. if(int(mypacket[mycon].TcpHead.bit & 0x4) == 4)
  181. pDC->TextOut(7*width, 21*height, "1");
  182. pDC->TextOut(0, 22*height, "SYN位:");
  183. if(int(mypacket[mycon].TcpHead.bit & 0x2) == 0)
  184. {
  185. pDC->TextOut(7*width, 22*height, "0");
  186. //AfxMessageBox("没有建立连接或建立连接失败!");
  187. }
  188. if(int(mypacket[mycon].TcpHead.bit & 0x2) == 2)
  189. pDC->TextOut(7*width, 22*height, "1");
  190. pDC->TextOut(0, 23*height, "FIN位:");
  191. if(int(mypacket[mycon].TcpHead.bit & 0x1) == 0)
  192. pDC->TextOut(7*width, 23*height, "0");
  193. if(int(mypacket[mycon].TcpHead.bit & 0x1) == 1)
  194. pDC->TextOut(7*width, 23*height, "1");
  195. pDC->TextOut(0, 24*height, "窗口大小:");
  196. sprintf(winlen, "%d", ntohs(mypacket[mycon].TcpHead.winlen));
  197. pDC->TextOut(7*width, 24*height, winlen);
  198. pDC->TextOut(0, 25*height, "紧急指针:");
  199. sprintf(point, "%d", mypacket[mycon].TcpHead.point);
  200. pDC->TextOut(7*width, 25*height, point);
  201. }
  202. if(int(mypacket[mycon].IpHead.proto) == 1)
  203. {
  204. //判断,如果IP包头的协议字段是1,表示是ICMP包
  205. //从存放在向量中的包头中读取并接口ICMP头
  206. pDC->TextOut(0, 13*height, "ICMP");
  207. pDC->TextOut(0, 14*height, "类型:");
  208. sprintf(type, "%d", mypacket[mycon].IcmpHead.type);
  209. pDC->TextOut(7*width, 14*height, type);
  210. pDC->TextOut(0, 15*height, "代码:");
  211. sprintf(code, "%d", mypacket[mycon].IcmpHead.code);
  212. pDC->TextOut(7*width, 15*height, code);
  213. pDC->TextOut(0, 16*height, "校验和:");
  214. sprintf(checksm, "%d", ntohs(mypacket[mycon].IcmpHead.checksum));
  215. pDC->TextOut(7*width, 16*height, checksm);
  216. pDC->TextOut(0, 17*height, "标识符:");
  217. sprintf(identif, "%d", ntohs(mypacket[mycon].IcmpHead.identifier));
  218. pDC->TextOut(7*width, 17*height, identif);
  219. pDC->TextOut(0, 18*height, "序列号:");
  220. sprintf(sernm, "%d", ntohs(mypacket[mycon].IcmpHead.sernum));
  221. pDC->TextOut(7*width, 18*height, sernm);
  222. if(mypacket[mycon].IcmpHead.type == 0)
  223. {
  224. if(mypacket[mycon].IcmpHead.code == 0)
  225. pDC->TextOut(0, 20*height, "回显应答(ping应答)");
  226. }
  227. if(mypacket[mycon].IcmpHead.type == 3)
  228. {
  229. switch (mypacket[mycon].IcmpHead.code)
  230. {
  231. case 0:
  232. pDC->TextOut(0, 20*height, "目标不可达");
  233. break;
  234. case 1:
  235. pDC->TextOut(0, 20*height, "主机不可达");
  236. break;
  237. case 2:
  238. pDC->TextOut(0, 20*height, "协议不可达");
  239. break;
  240. case 3:
  241. pDC->TextOut(0, 20*height, "端口不可达");
  242. break;
  243. case 4:
  244. pDC->TextOut(0, 20*height, "需要进行分片但不能设置分片比特");
  245. break;
  246. case 5:
  247. pDC->TextOut(0, 20*height, "源站选路失败");
  248. break;
  249. case 6:
  250. pDC->TextOut(0, 20*height, "目的网络不认识");
  251. break;
  252. case 7:
  253. pDC->TextOut(0, 20*height, "目的主机不认识");
  254. break;
  255. case 8:
  256. pDC->TextOut(0, 20*height, "源主机被隔离");
  257. break;
  258. case 9:
  259. pDC->TextOut(0, 20*height, "目的网络被强制禁止");
  260. break;
  261. case 10:
  262. pDC->TextOut(0, 20*height, "目的主机被强制禁止");
  263. break;
  264. case 11:
  265. pDC->TextOut(0, 20*height, "由于服务类型TOS,网络不可达");
  266. break;
  267. case 12:
  268. pDC->TextOut(0, 20*height, "由于服务类型TOS,主机不可达");
  269. break;
  270. case 13:
  271. pDC->TextOut(0, 20*height, "由于过滤,通信被强制禁止");
  272. break;
  273. case 14:
  274. pDC->TextOut(0, 20*height, "主机越权");
  275. break;
  276. case 15:
  277. pDC->TextOut(0, 20*height, "优先权中止生效");
  278. break;
  279. }
  280. }
  281. if(mypacket[mycon].IcmpHead.type == 4)
  282. {
  283. if(mypacket[mycon].IcmpHead.code == 0)
  284. pDC->TextOut(0, 20*height, "源端被关闭");
  285. }
  286. if(mypacket[mycon].IcmpHead.type == 5)
  287. {
  288. switch(mypacket[mycon].IcmpHead.code)
  289. {
  290. case 0:
  291. pDC->TextOut(0, 20*height, "对网络重定向");
  292. break;
  293. case 1:
  294. pDC->TextOut(0, 20*height, "对主机重定向");
  295. break;
  296. case 2:
  297. pDC->TextOut(0, 20*height, "对服务类型和网络重定向");
  298. break;
  299. case 3:
  300. pDC->TextOut(0, 20*height, "对服务类型和主机重定向");
  301. break;
  302. }
  303. }
  304. if(mypacket[mycon].IcmpHead.type == 8 && mypacket[mycon].IcmpHead.code == 0)
  305. pDC->TextOut(0, 20*height, "请求回显(ping请求)");
  306. if(mypacket[mycon].IcmpHead.type == 9 && mypacket[mycon].IcmpHead.code == 0)
  307. pDC->TextOut(0, 20*height, "路由器通告");
  308. if(mypacket[mycon].IcmpHead.type == 10 && mypacket[mycon].IcmpHead.code == 0)
  309. pDC->TextOut(0, 20*height, "路由器请求");
  310. if(mypacket[mycon].IcmpHead.type == 11)
  311. {
  312. switch(mypacket[mycon].IcmpHead.code)
  313. {
  314. case 0:
  315. pDC->TextOut(0, 20*height, "传输期间生存时间为0");
  316. break;
  317. case 1:
  318. pDC->TextOut(0, 20*height, "在数据报组装期间生存时间为0");
  319. break;
  320. }
  321. }
  322. if(mypacket[mycon].IcmpHead.type == 12)
  323. {
  324. switch(mypacket[mycon].IcmpHead.code)
  325. {
  326. case 0:
  327. pDC->TextOut(0, 20*height, "坏的IP首部");
  328. break;
  329. case 1:
  330. pDC->TextOut(0, 20*height, "缺少必需的选项");
  331. break;
  332. }
  333. }
  334. if(mypacket[mycon].IcmpHead.type == 13 && mypacket[mycon].IcmpHead.code == 0)
  335. pDC->TextOut(0, 20*height, "时间戳请求");
  336. if(mypacket[mycon].IcmpHead.type == 14 && mypacket[mycon].IcmpHead.code == 0)
  337. pDC->TextOut(0, 20*height, "时间戳应答");
  338. if(mypacket[mycon].IcmpHead.type == 15 && mypacket[mycon].IcmpHead.code == 0)
  339. pDC->TextOut(0, 20*height, "信息请求");
  340. if(mypacket[mycon].IcmpHead.type == 16 && mypacket[mycon].IcmpHead.code == 0)
  341. pDC->TextOut(0, 20*height, "信息应答");
  342. if(mypacket[mycon].IcmpHead.type == 17 && mypacket[mycon].IcmpHead.code == 0)
  343. pDC->TextOut(0, 20*height, "地址掩码请求");
  344. if(mypacket[mycon].IcmpHead.type == 18 && mypacket[mycon].IcmpHead.code == 0)
  345. pDC->TextOut(0, 20*height, "地址掩码应答");
  346. }
  347. }
  348. }
  349. #ifdef _DEBUG
  350. void mysniffview::AssertValid() const
  351. {
  352. CScrollView::AssertValid();
  353. }
  354. void mysniffview::Dump(CDumpContext& dc) const
  355. {
  356. CScrollView::Dump(dc);
  357. }
  358. #endif //_DEBUG
  359. CMyCapDoc* mysniffview::GetDocument() // non-debug version is inline
  360. {
  361. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyCapDoc)));
  362. return (CMyCapDoc*)m_pDocument;
  363. }